HP Prime - Consideraciones del Lenguaje PPL - 1° Parte

Consideraciones importantes para programadores en PPL, se presenta un resumen de puntos relevantes al lenguaje, primera parte donde se hace mención algunas pautas a tener en cuenta para el manejo de programas.



Consideraciones del Lenguaje PPL - I
PROGRAMAS I

Como programador de la calculadora HP Prime, habrás notado ciertas particularidades que están incluidas en el Manual de usuario, pero también conceptos adicionales a éste, por lo que en esta nota se trata de dar información resumida que se considera importante para los que se encuentran en práctica o deseen comparar ideas.


Antes de empezar

Las diferencias. Cada lenguaje aprovecha sus recursos de diversas formas, por lo tanto cada lenguaje es especial en cierto aspecto. Para los que no lo tengan presente, este lenguaje esta orientado a secuencias y permite el manejo de datos de una forma muy aprovechable, por lo que se precisa indicar que estas consideraciones pueden llegar a ser exclusivas de PPL.


Declaración e Iniciación de variables

Expresión combinada. Para declarar variables usamos el comando LOCAL seguido de los identificadores de la variable, esta acción no solo declara la variable (Reserva de espacio en memoria), también le asigna un valor inicial aún si no se indicó ninguno, el valor predeterminado es 0, entonces la variable queda definida como tipo Real.
Si estamos trabajando y vemos que de repente nos aparece un 0, es por esta razón.

Para evitar ésto, podemos iniciar de buena vez si es necesario, los tipos de datos a asignar.




Tipo de dato no restringido

Reserva variable de memoria. Comúnmente este caso es usado para las colecciones de datos y cadenas, puesto que su longitud es indeterminada, pero en este lenguaje aprovecha esto para colocar cualquier tipo de dato, en una variable cuyo dato actual sea un tipo distinto.

Por lo que es válido asignar un valor inicial como [2,3]▶Variable, y luego asignar un tipo de dato diferente como "2015 un año muy soleado"▶Variable, no siendo esto un caso de excepción.

Estamos confirmando entonces la destrucción tanto del dato y del tipo con los métodos de entrada y asignación que existan en este lenguaje.


Arreglos (Arrays)

Carencia imperceptible. Este lenguaje no dispone de esta estructura de datos, pero existen 2 tipos de datos que pueden reemplazarlo, incluso resulta de más utilidad en ciertos casos: Matrices (reales y complejos) y Listas (cualquier tipo de dato almacenable).


Vectores y Matrices

Las Matrices, que pueden ser unidimensionales (Vectores) o bidimensionales, de tamaño (m x n) no necesariamente definidas con anterioridad, sólo pueden contener datos del tipo real y complejo.


Tanto para vectores y matrices, se permite la asignación de valores en posiciones no iniciadas, veamos el siguiente caso:


Las variables tipo matriz pueden tener una longitud variable, las posiciones no iniciadas se completan con 0, puesto que este es el valor que se define por defecto a datos no iniciados, respetándose la sintaxis de sólo contener datos tipo real.

Las variables tipo matriz se manipulan con parámetros reales como Variable(1), Variable(3) para filas, Variable(-3), Variable(-5) para columnas y Variable(1,2) ó Variable(4,5) para un solo dato, se sabe que se usan estas formas para llamar y asignar datos.


 

Pero existe una forma especial para retirar datos con el uso de una lista como parámetro, siendo el caso de obtener un intervalo de vectores o un intervalo de sub-índices, en ambos casos obteniéndose una matriz bidimensional aun si sólo se hace referencia a un dato. Este caso es exclusivo para la salida de datos, no es funcional para la asignación de datos.



Los vectores y matrices están orientados a cálculos matemáticos, y PPL puede usar las expresiones comunes entre estos elementos, tanto como multiplicación, suma, inversa, etc.


Listas

Las listas pueden contener al mismo tiempo diversos tipos de datos, debido a que su estructura usa referencias a elementos (como referencia a un real, una cadena, etc.), incluso una lista puede contener otra lista y así sucesivamente, siendo esto un recurso de mucha utilidad para la agrupación de datos.
{4,"Hola",[5,2,−1],{1,0}}▶Variable

Si a una lista se le asigna un valor en la posición 0, el valor será colocado al final de la lista creando la siguiente posición a la actual. Por lo tanto si se usa el llamado Lista(0), retornará el último valor de la lista.



Una variable tipo lista, como se ha visto anteriormente, se puede iniciar como una lista vacía {}, y para poder agregar un primer valor podemos usar Lista(1), esto normalmente sería una excepción puesto que la posición 1 no existe, pero es posible.



Por lo que podemos asumir que a las variables tipo lista se les puede asignar valores en posiciones no iniciadas al igual que las matrices, y los valores no definidos serán ocupados por 0 (Valor por defecto para la creación de espacios de dato no existentes).



Al igual que las matrices (o mejor dicho, exactamente igual que a vectores), se pueden usar parámetros de tipo lista para la salida de datos de listas.



Siendo posible el caso de unir parámetros tipo reales y tipo lista según se requiera.



Otra acotación sobre las listas, es que permiten crear con facilidad listas de listas dentro de estas, usamos una lista vacía, y asignamos a un anidado de posiciones, por lo que se creará por defecto listas de listas (los datos de matrices también se llaman de esta manera pero la creación permanece sobre el tipo lista).



En resumen, las variables tipo lista pueden contener todo tipo de dato, y la creación de listas de listas es simplificada, si un valor no existe este se crea como 0, si un valor en la lista ya existe puede ser fácil reemplazado por otro debido a que el tipo de dato no es restringido.

Esta forma mencionada puede ser motivo de un problema de conservación de datos, se debe manejar con cuidado la asignación de datos en listas, debido a que éstos pueden ser eliminados sin ninguna advertencia, como por ejemplo el dato 10 en la posición Lista(2), puede ser convertido a lista al asignar una lista de lista en esa posición.




Tipo inferido y Débilmente tipado

Tipo inferido. Al no requerir líneas de código como Definir X como Real; o similar, la única forma de distinguir el tipo de dato contenido en una variable, es darle el dato de por sí (formas mostradas en Declaración e Iniciación de variables)

Débilmente tipado. Se permite la operación de diversos tipos de datos sin conversión, puede resultar ventajoso, estos son algunos casos:




Boolean?

Tipo no definido. En cualquier instrucción donde se requiera el valor lógico de verdadero o falso, sea en las familias IF o en bucles, podemos usar el valor 1:Verdadero o 0:Falso, siendo estos simples datos del tipo real. Se muestran los resultados de las operadores relacionales.



También es posible usar cualquier tipo de valor real distinto de 0 para representar Verdadero, por lo tanto en las siguientes operaciones lógicas se obtiene:



Es decir, no existe datos lógicos específicos, siendo true=1 y false=0, ambos valores reales.




Identificadores o nombres

Se debe entender que una variable puede usarse siempre y cuando se halla creado tanto en INICIO o en un programa (No considerando el entorno CAS), por lo que Definir una función con Define (Desde INICIO, no es PPL) no permitirá usar variables que no hallan sido creadas con anterioridad, puesto que este tipo de implemento obtiene valores de variables externas, y no de variables locales a la función definida.

Los identificadores en HP Prime no están clasificados, por lo que la llamada a un identificador (variable de usuario, programa, comando, función, variable de inicio, listas, matrices, etc) recorrerá de acuerdo a un indizado todo este grupo en conjunto. Por lo que en INICIO, no podremos crear variables como F1 (Reservado para App Función), variable TEXTOUT (Reservado como comando), variable A (Variable de usuario tipo Real predefinido), variable M1, G1, L1 (Reservado para matriz, gráfico y lista respectivamente), e identificadores de variables que traten de usar cualquiera de los reservados según indica el manual de usuario.

Se aclara que el motivo por el cual todos los identificadores se encuentran no clasificados, es debido a que todas las variables pueden tener cualquier tipo al cual se le reasigne, por lo que no es posible crear una variable tipo real 5▶M1, puesto que estaríamos haciendo referencia a la misma variable matriz reservada por la calculadora (las variables reservadas no pueden ser modificadas en tipo).

En consecuencia, desde un programa no podremos EXPORTAR variables con identificadores iguales a los casos mencionados anteriormente. Para variables LOCALES no hay interferencia, puesto que estas se priorizan sobre las referencias exteriores dentro de la función donde fue creada.


Identificadores CAS

Al programar y revisar el menú de ayuda o el manual, podremos identificar aproximadamente si un comando puede ser utilizado directamente en el programa o si requiere de un ambiente CAS, identificando si el comando esta en minúscula (CAS) o no.

Existen 4 formas de usar estos comandos:
  • Usando simplemente el Comando( ).
  • Usando CAS.Comando( ), en ocasiones que no se intertepreta correctamente como CAS.
  • Usando CAS(Expresión CAS), similar al anterior.
  • Creando una función CAS con #cas #end. La función debe contener por lo menos una variable de llegada para poder usarla.

Sin embargo, en todos ellos no podremos enviarle parámetros simbólicos como se usa normalmente, se deberá usar cadenas o expresiones para lograrlo. Si deseas más información respecto al uso de CAS ingresa a Consideraciones 5°parte PPL-CAS.


Toda función o comando retorna valor

Una función vacía devuelve por defecto el valor de 0.
Una función que contiene instrucciones retorna el valor residual de la última instrucción ejecutada.
Una función que ejecuta el comando RETURN, retorna el valor residual de la línea que contiene el comando y termina la ejecución de la función.

El retorno de valores es generalizado, aplicable también en los comandos de HP Prime, veamos a continuación algunos valores retornados de comandos conocidos.



Esta característica en el lenguaje permite anidar o usar cualquier tipo de función en diversas partes de una instrucción mientras la sintaxis básica sea correcta, se ejecuta de adentro hacia afuera y de acuerdo al orden horizontal.



A razón de esto, todo comando, función o similar, puede colocarse de forma individual en una instrucción, ya que las instrucciones pueden solo emitir un valor sin necesidad de asignar o ejecutar algo como estos casos:




Los comandos de entrada y salida

Sobreentendido. Bien sabemos que al escribir código, si el contenido resulta corto y las instrucciones meramente operativas, el programa nos estará mostrando un resultado casi al mismo tiempo que presionamos Ejecutar, esto debido a que los lenguajes están preparados para ejecutarse al 100%, a menos que esto se restrinja (se intenta).

En cuanto a INPUT, CHOOSE y MSGBOX, son interfaces de interacción usuario que permiten el llenado de datos y por lo tanto su manipulación, por lo que podemos afirmar que la ejecución del código se retiene en estas instrucciones hasta que confirmemos o cancelemos con los medios que brindan.

Esto puede ser obviamente básico, pero cuando trabajamos con funciones y gráficos propios, esto puede llegar a ser un problema si es que no se entiende este concepto, será necesario crear funciones a cuenta propia que simulen esa pausa en el código y que permitan la visualización de datos y manipulación en el tiempo adecuado, y además es importante que el método usado no genere consumo de recursos innecesarios.


FREEZE y PRINT

Malentendido concurrente. En razón al uso de gráficos para el caso mencionado en el punto preliminar, se requiere usar un comando que permita pausar la ejecución del código y visualizar los cambios en pantalla en el punto deseado, ya que el programa se ejecuta sin descanso, pero FREEZE no es el comando útil en esta ocasión.

FREEZE solo hace efecto al finalizar la ejecución del programa, no actualizando la pantalla hasta presionar alguna tecla, esto puede causar mucha confusión si el programa es corto y no se tiene idea de lo que esta pasando; no pausa la ejecución, por lo que puede ser llamado en cualquier punto del programa, y solo tendrá efecto al final de todo.

En cuanto a PRINT, tampoco es un comando que pause la ejecución al ser ejecutado, logra mostrar la terminal en la pantalla, pero si no se pausa manualmente la ejecución, la pantalla será posiblemente re-dibujada con un comando posterior, pasará más rápido que un parpadeo y no podremos verlo.

El comando PRINT esta desarrollado para mostrarse al final de la ejecución al igual que FREEZE (Usar los 2 comandos al mismo tiempo puede ocasionar aún más enredo). Su objetivo es mostrar la terminal con los datos acumulados en este, siendo posible desplazar la pantalla de ser necesario, se presiona cualquier tecla para salir de la terminal.



Comentarios

  1. Buen aporte tu trabajo para difundir el conocimiento sobre la HP Prime ... lo que descubrí programando es que esta por debajo de la ti nspire cx cas..pero supongo que estarán trabajando en actualizaciones...habrá que enviarles algunos bugs que encontremos....luego te comento mas......

    ResponderBorrar
    Respuestas
    1. En este foro (hpmuseum.org) se pueden publicar los bugs, hay 2 miembros activos de HP Prime que suelen revisar temas de este aspecto, suelen decir que atenderán lo señalado para el próximo firmware.

      Borrar
  2. Buenas tardes Carlos, los programas creados en la hp prime se pueden proteger mediante alguna clave?

    ResponderBorrar
    Respuestas
    1. Por ahora en para PPL no es posible su protección, tal vez en un futuro se libere formatos codificados no legibles, varios lo han solicitado en foros donde participan algunos miembros de hp.

      Borrar
  3. Muy buen aporte Ing, esperando cada dia mas el programa VIGA C.

    ResponderBorrar
    Respuestas
    1. Excelente Aporte Ingeniero! Gracias por compartir.

      Borrar
  4. Que buen aporte. Hay que aprender a programar de una buena manera y aqui explicas detalles interesantes. Gracias

    ResponderBorrar
  5. Soy Ingeniero Civil que calculadora me recomendas la Hp 50g o la Hp Prime?

    ResponderBorrar
  6. Hola Carlos, espero tu ayuda, tengo una matriz el mismo que le saco la inversa, pero los valores como : 3.125E-7 lo asume como "0" absoluto.....

    Gracias.
    Roland

    ResponderBorrar
  7. ALGUIEN ME PUEDE AYUDAR..... A QUE SE DEBE QUE CUANDO INTRODUZCO UNA FUNCIÓN F(X) EN UN PROGRAMA LO RECONOCE COMO SI FUERA UNA CONSTANTE Y ME IMPRIME LA INTEGRAL COMO LA F(X) MULTIPLICADA POR EL ULTIMO VALOR DE X
    AQUÍ LOS PASO LA SINTAXIS

    EXPORT GUIDE()
    BEGIN
    LOCAL Fx:='X';
    LOCAL X1:=0,X2:=9,INF,DF;
    PRINT;
    INPUT({{Fx,[8],{35,45,2}},{X1,[0],{50,20,3}},{X2,[0],{50,20,4}}},"INTEGRALES",{"F(x) =","Xinicial =","Xfinal ="},{"Ingrese la F(x) en funcion de X","Ingrese Limite Inferior de Integracion","Ingrese Limite Superior de Integracion"});

    INF:=CAS.int(Fx,X, X1,X2);
    DF:=diff(Fx,X);
    PRINT(INF);
    PRINT(DF);
    WAIT(-1);
    END;

    ResponderBorrar
    Respuestas
    1. los comandos int() y diff() pueden ser usados en Inicio o en PPL, pero estan destinados para CAS.
      Para evitar posibles errores al operar en Inicio o PPL, se puede usar:
      ∫() -> ∫(X,X,0,5)
      ∂() -> ∂((1/X)-X,X=5)
      El comando para derivadas tiene conflictos al usarse con variables tipo función.

      Borrar
  8. HOLA MI NOMBRE ES ERNESTO Y ME GUSTARIA SER MIEMBRO DEL GRUPO SE PODRA ?

    ResponderBorrar
    Respuestas
    1. Esta página solo es un Blog que pronto actualizaré y pondré contenido nuevo.
      Si deseas entrar a un grupo relacionado al de la calculadora te sugiero ingreses a este grupo de fb: CALCULADORA HP PRIME

      Borrar
  9. ME PODRIAN AYUDAR CON ALGUN PROGRAMA SENCILLO PARA VERIFICAR QUE LA ACTUALIZACION 2016 08 29 ME ESTE FUNCIONANDO SE AGRADECE

    ResponderBorrar
    Respuestas
    1. Es una forma extraña de pedir programas, puedes enviar a tu calculadora esto Programas y Apps publicados para que pruebes si tu calculadora misteriosamente no funciona como debe ser usual.

      Borrar
  10. Cordiales Saludos, excelente tu trabajo y gracias por hacerlo, mi consulta seria de como ingresar GGGMMSS (grados minutos y segundos) para realizar operaciones en la programacion de PPL, hasta ahora no he podido hacerlo, espero puedas ayudarme mi correo es cefe.huayta@hotmail.com

    ResponderBorrar
    Respuestas
    1. Depende de cómo quieras trabajarlo, un dato expresado en hexadecimal es igual a un dato real, solo es un tipo de formato o tipo de visualización, por esta razón es que se pueden operar ambos sin problemas (Permanece el formato del primer valor):
      5°06′36+5 → 10°06′36″
      5+5°06′36 → 10.11

      Si deseas declararlo con este formato puedes darle un valor inicial, esto te ayudará para ingresarlo al comando INPUT:
      X=5°06′36;
      En INPUT deberás usar la tecla Shift + a b/c para insertar los superíndices.

      Como luego de operar un valor puede no prevalecer el formato que deseas (hexadecimal o decimal), existen 2 comandos para asignárselos:
      →HMS(8.5) → 8°30′00″

      Por último recuerda que los superíndices de minutos y segundos no se pueden insertar por teclado, tienen un código Unicode distinto, así que insértalos solo con ayuda de la tecla de la calculadora.
      HMS→(8°30) → 8.5

      Borrar
    2. Si usas INPUT, para evitarte problemas y hacer más eficiente el ingreso y edición de valores, es recomendable para estos casos crear 3 campos de entrada, el proceso de los datos los deberás hacer por interno.

      Ejemplo:
      INPUT({
      {X1,[0],{35,12,1}},
      {X2,[0],{49,12,1}},
      {X3,[0],{63,12,1}}
      },
      "GGMMSS",
      {"Dato:","",""},
      {"Grados","Minutos","Segundos"}
      )

      Borrar
  11. Gracias amigo por responderme, , tambien tengo un inconveniente
    al usar el comando input, este es un codigo que he copiado de internet en la muestra
    se ejecuta sin problemas pero cuando lo paso a mi calculadora me manda errores (he copiado al detalle el codigo), al comprobar la sintaxis no tengo ningun error, pero al ejecutar este codigo me sale el error de "FRICCION Error: entrada no valida", le agradeceria muchismo si me ayuda para corregir este error.
    Tambien deseo ingresar valores angulares para realizar operaciones de sumas y restas en el programa (XX°XX'XX") hasta el momento no he podido hacerlo tambien recurro a uds. si me podria ayudar.

    EXPORT FRICCION()
    BEGIN
    IF INPUT({{Q,[0],{10,30,0}},
    {D,[0],{50,30,0}},
    {K,[0],{10,30,1}},
    {V,[0],{50,30,1}}},
    "CALCULO DE FRICCION",
    {"Q:","D:","K:","V:"},
    {"Ingrese caudal (m3/s)","Ingrese diametro (pulg)",
    "Ingrese rugosidad (m)", "Ingrese viscosidad(m2/s)"}
    ) THEN
    print("ok");
    END;
    END;

    ResponderBorrar
    Respuestas
    1. Qué tipo de datos ingresas? no es normal que muestre "entrada no válida" a menos que sea un error de firmware.
      Respecto a ingresar valores hexadecimales, es como mencioné en el comentario anterior, se debe ingresar los superíndices con la tecla Shift+ab/c.
      Si deseas más información para usar INPUT puedes ver estos VIDEOS.
      O puedes revisar la ayuda de la calculadora.

      Borrar
  12. Eso es amigo en todos los input cuando le doy el formato para ingresar el formato de numero {D,[0],{50,30,0}} me sale este error de "ENTRADA NO VALIDA" es por eso que no puedo ejecutar el ejemplo que me has dado del inputo ingresar por separado los GGMMSS, hasta no he podido resolverlo espero puedas ayudarmen gracias

    ResponderBorrar
    Respuestas
    1. No quería creer que era un error de sintaxis por firmware desactualizado, debes actualizarlo, de esa manera poder usar los programas que se han desarrollado hasta ahora poder usar las funciones que se adicionaron en su momento, aquí los VIDEOS DE INPUT.

      Borrar
  13. amigo me olvidaba hasta en el simulador de la calculadora me sale este error tengo el simulador Version 2013 11 25.Rev 5447

    ResponderBorrar
    Respuestas
    1. Ese es practicamente lo que debes solucionar, debes actualizar tu calculadora, un firmware hasta antes del 2015 se puede confirmar como un firmware con errores complejos y desfasado.
      Actualiza al firmware actual con ayuda de estas INDICACIONES.
      Puedes también buscar en youtube cómo actualizar, contacta a mi página si tienes inconvenientes.

      Borrar
  14. Cordiales Saludos

    Mi estimado amigo muchisimas gracias por tus indicaciones, ya resolvi el problema de "ENTRADA NO VALIDA", le confirmo que el error era el firmware estaba desactualizado, ahora lo he actuallizado y los programas que no podia correr, los corre sin problemas, de nuevo gracias amigo por tu ayuda.

    ResponderBorrar
  15. Quisiera saber si alguno tiene idea de como hacer posible que al momento de crear un programa en la hp prime esta sea capaz de reconocer los números complejos. Pues al momento de hacer un input, si se ingresa una variabe compleja no lo recononce. Gracias

    ResponderBorrar
    Respuestas
    1. Tienes 2 modos para lograr eso:
      * Definir a tu variable como una complejo antes de enviarlo al INPUT como LOCAL Var=(0,0);
      * Definir tipo de ingreso de dato del INPUT.

      El INPUT simple "INPUT(Var)" conserva el tipo de dato, inicialmente una variable es tipo Real si no se le asigna un valor inicial, por lo tanto no permitirá ingresar un tipo complejo u otro tipo de dato.

      El INPUT complejo permite ignorar el tipo inicial, para más información puedes revisar esta serie de videos que explica el uso completo de este comando: VIDEOS DE INPUT

      Borrar
  16. al crear un programa, ¿como puedo limitar el numero de decimales que deseo? ayudame por favor con un ejemplo corto. solo quiero trabajar con 3 decimales

    ResponderBorrar
  17. Hola Carlos si deseo programar en la Hp Prime su lenguaje de Programación es HP PPL verdad? Que lenguaje se asemeja mas al de la Prime... que tenga una bibliografía en la cual pueda apoyarme. Gracias

    ResponderBorrar
    Respuestas
    1. HP PPL es uno de los más estandarizados que hay, es un lenguaje netamente imperativo, cuenta con las estructuras básicas de control como IF, CASE, FOR, REPEAT, WHILE, etc.
      El más parecido en cuanto a sus palabras clave es Pascal, pero de todas formas tiene mucha diferencia en varios aspectos que no podría enumerar por ser extensas las diferencias, lo mejor es ver solo el manual de usuario en su sección programación y ver qué es lo que tiene HP PPL.
      En estas consideraciones justamente se resalta las diferencias con otros lenguajes imperativos conocidos, su gran enfoque y simplificación para ser un lenguaje de calculadora.

      Borrar
  18. hola buenas noche me podrias ayudar como corrigo un error de sitaxis 49 que me sdalke cuando quiero abrir un archivo hpprgm

    ResponderBorrar
    Respuestas
    1. Bueno eso indica que en la línea 49 existe un error de sintaxis, los hay de muchos tipos, si lo estas programando dale Comprobar para que te dirija a la línea sino usa el Kit, si desconoces de programación contácte con su desarrollador, es posible que haya pasos antes de enviar el programa que necesitas

      Borrar
    2. Si crees que el programa debería funcionar sin problemas, intenta enviar volver a comprobar el programa luego de entrar a la App Función

      Borrar
  19. Saludos Carlos.
    Felicidades por el aporte y éxito.
    Tengo dificultades para programar en CAS, tienes algun blog,portal o info de que tanto varía la programación con respecto a la convencional?
    y una segunda consulta.
    hal algun forma de mostrar el resultado de una matriz en su forma convenccional y no linealmente?
    ejm:

    R=[[11,32,56],[1,3,4],[6,3,5 ]] ...la prime muestra esta respuesta con el COMANDO PRINT:
    Lo que yo deseo es:
    R=
    11 32 56
    1 3 4
    6 3 5
    Agradezco de antemano la ayuda. gracias

    ResponderBorrar
    Respuestas
    1. Hola, espero los artículos siguientes también te sean de utilidad,.
      Respecto a la programación neta en CAS (#cas #end) aún no he creado un artículo específico, solo publiqué Consideraciones Parte 5 que habla del uso de comandos CAS dentro de HP PPL o Home, te sería útil en el caso que crees tu propia función CAS y luego la necesites integrar a tu código convencional.
      El CAS de HP Prime se basa en Xcas, así que si buscas programación en Xcas te puede ser de mucha ayuda.
      El comando PRINT solo emite resultados lineales, ahí solo podrías arreglar un bucle para que imprima los valores por filas con un espacio entre ellos si es que eso te sirve, pero dudo que sea lo que estas buscando.

      Borrar
    2. Una alternativa es intentar no usar el PRINT si es posible, y retornar la matriz al historial de Inicio, si es que has ejecutado tu programa desde ahí.
      Lo otro sería usar EDITMAT para mostrar las matrices.

      Borrar
  20. un libro para poder aprender a programar.. (distinto al manual de usuario)

    ResponderBorrar
  21. Buneas noches,
    tengo un ejemplo
    Del numero 127 y quiero que me devuelva el numero 7, lo hice con la función RIGHT("127",1) y me boto el numero 7 pero sin embargo a ese resultado no puedo sumarlo no puedo restarlo, que solución puedo darle.
    Gracias y disculpa las molestias.

    ResponderBorrar
    Respuestas
    1. Hola, bueno es un caso especial el tuyo, mas o menos estas encontrando una solución, pero en programación existen herramientas ancestrales para lograr eso.
      127 MOD 10 → 7 //Usas una operación netamente con números

      Otra alternativa es intentar manipular el número como si fuera un texto, esta alternativa sería mas o menos como lo planteas, RIGHT(""+VarNum,1) o mejor aún RIGHT(STRING(VarNum,1),1), con esto desde el principio sabes que lo que obtendrás será una cadena, ya dejó ser un número, una cadena podría hasta tener letras sin problemas: "7 Dato en el 8vo lugar", obviamente no se podría operar como número
      Si estamos seguros que obtendremos una cadena que puede ser convertida a número usariamos EXPR, así podrías operarlo en la misma instrucción EXPR(RIGHT(STRING(VarNum,1),1)), en otros lenguajes esto se le conoce como una función Parse, pero EXPR no es exactamente eso, tú eres quien elije el método.

      De todas formas no es recomendable mezclar operaciones que jueguen con los tipos, la programación en sus inicios demostró que es posible solventar este tipo de necesidades con MOD, supresión de la parte decimal, de la entera, como por ejemplo FP(VarNum/10)*10, y anteponer las operaciones del mismo tipo antes que las conversiones.

      Borrar
  22. Hola Carlos estaba intentando pasar un programa de Home a Cas por la necesidad de usar variables,pero cuando intente hacerlo me bota un error y no entiendo porque.

    Aquí te muestro la parte inicial del código recortado.

    #cas
    programa(mat):=
    // matriz de 4x4
    BEGIN
    LOCAL lista:={},ele,A;

    FOR A FROM 1 to 4 DO
    ele:=mat(A,A);
    lista(A):=ele;
    END;

    RETURn lista;
    END;
    #end

    el retorno debería ser
    {elemento1,elemento2,elemto3,elemento4} pero
    cuando la invoco en cas hace una especie de pseudoretorno y
    me sale esto
    (A)-->(elemento4)

    en resumen la idea es almacenar elementos de un matriz que pueden ser variables o números en una lista para luego retornarlos. Espero tu respuesta .Buen día!

    ResponderBorrar
    Respuestas
    1. Respuesta corta es cambiar lista(A):=ele; por lista[A]:=ele;

      Respuesta larga:
      Preferiría que no se pregunte sobre programación CAS aquí, pero es una pregunta después de todo. Te recomendaría que no uses una función CAS para esto, ya que usar una función de HP PPL en CAS no tienen ningún problema pero deberás considerar las conversiones de tipo que existen entre ambos lenguajes.
      En programación CAS existen estos formatos como lista 1,2,3 [1,2,3] {1,2,3}, todos son considerados DOM_LIST así que los ejemplos anteriores son muy similares.
      La declaración con LOCAL en CAS acepta el formato 1,2,3; es decir que al hacer LOCAL lista:={},ele,A; se esta creando a lista={},ele,A y no variables por separado, para ello se usa LOCAL (lista:={}),ele,A;
      Cuando se usa una variable no creada en CAS, esta se crea automáticamente; con el error anterior "ele" se esta creando como variable global CAS y no como LOCAL. (Es decir que puede ser encontrado desde la lista de variables CAS externas)
      A una lista se puede acceder con lista(indice) o lista[indice], por ejemplo lista(1) o lista[2]:=8.
      En CAS el formato Variable(variable):=Expresión, es considerado un formato para creación de funciones, por lo tanto lista(A):=5 significará "(A)-->5" una función lista que recibe como parámetro una variable A que se reemplaza en 5. Por ejemplo f(x):=x^2, crea una función f "(x)->x^2", si se ejecuta f(8) se obtiene 64.
      Cuando se usa variables como índices de una lista, se debe usar solo el formato con corchetes lista[A].

      Función corregida:
      prograMat(mat):=
      BEGIN
      LOCAL (lista:=[]),ele,A;
      for A from 1 to 4 do
      ele:=mat[A,A];
      lista[A]:=ele;
      end;
      return lista;
      END;

      Borrar
    2. La función corregida presentada antes se ubica en el bloque CAS de complicación #cas #end

      Borrar
  23. Bom dia ElAmigoCarlos estou tendo dificuldade em plotar o desenho de um polígono,
    tendo uma variável de matriz "M0" com 2 colunas com valores de norte e este de um determinado perímetro, qual comando utilizo para plotar esse polígono no gráfico G0? saudações.

    ResponderBorrar
    Respuestas
    1. Gráficos em coordenadas cartesianas

      Borrar
    2. Boa tarde, consegui carregar o perímetro porem em coordenadas de pixel, estou com dificuldade de extrair da variável "M0" os limites de Xmin, Ymin e Xmax, Ymax.
      Por que as coordenadas vão ter uma variação de valores.

      Borrar
  24. que tal carlos. Tengo una consulta sobre la programacion. Yo realizo mi programa en Virtual Hp (en el simulador) y compila y ejecuta sin problemas, pero al pasar a la calculadora fisica HP prime no compila y me arroja un error en la linea 14.
    Tenes alguna idea de que cual puede ser el problema?
    EXPORT LINEAS__CORTAS()
    BEGIN
    PRINT();
    LOCAL cut,dut;
    LOCAL fp,resistencia;
    LOCAL induc,frec;
    LOCAL pen,vr;
    LOCAL w_1,angul;
    LOCAL vs,impedancia;
    LOCAL reac_induc,ir;
    LOCAL is,vs1;
    LOCAL modul,q;
    INPUT(vr,"Tension","Vr=","Ingrese la tension en KV");
    INPUT(pen,"Potencia en el lado de l carga","Pr=","Ingrese la potencia en kw");
    INPUT(frec,"Frecuencia","f=","Ingrese la frecuencia en Hz");
    INPUT(fp,"Factor de potencia","FP=","Ingrese el factor de potencia");
    INPUT(resistencia,"Resistencia","r=","Ingrese la resistencia en ohm");
    INPUT(induc,"Inductancia","L=","Ingrese la inductancia en Henrios");
    CHOOSE(N,"SELECCIONA EL TIPO DE FP","INDUCTIVO","CAPACITIVO");
    IF w_1==1 THEN
    angul:=-ACOS(fp);
    ELSE
    angul:=ACOS(fp);
    END;
    modul:=pen/((√3)*vr*fp);
    ir:=EXPR(modul+"∡"+angul);
    is:=ir;
    reac_induc:=2*π*frec*induc;
    impedancia:=resistencia+*reac_induc;
    vs:=((1000*vr/√3)+is*impedancia)/1000;
    cut:=ABS(vs);
    dut:=ARG(vs);
    vs1:=EXPR(cut+"∡"+dut);
    CHOOSE(q,"Seleccione el tipo de respuesta de vs","vs EN RECTANGULAR","vs EN POLAR");
    IF q==1 THEN
    PRINT("vs de fase en (kv) es vs="+vs);
    ELSE
    PRINT("Vs de fase en (kv) es Vs="+vs1);
    END;
    END;

    ResponderBorrar
    Respuestas
    1. Desconozco el motivo de este inconveniente, no veo ningún problema en el INPUT(pen) y en las líneas cercanas adyacentes

      Borrar
    2. Podría ser que no tengas la calculadora actualizada?

      Borrar
  25. Buenos días Carlos, ayúdame a descubrir el error por favor esta en la linea 53, según el corrector de errores.
    EXPORT FACTORvenom()
    BEGIN
    LOCAL Q,D,Ks,v,f0,f1,Re,error;
    LOCAL MENU,LR;
    REPEAT
    CHOOSE(MENU,"FACTOR DE FRICCION","DATOS INICIALES","CALCULAR","RESULTADOS","SALIR");
    //DATOS DE ENTRADA
    IF MENU==1 THEN
    INPUT({{Q,[0],{55,20,0}},
    {v,[0],{55,20,1}},
    {D,[0],{55,20,2}},
    {Ks,[0],{55,20,3}}},
    "DATOS INICIALES",
    {"Ingrese Caudal [m3/s]:",
    "Ingrese Viscosidad [m/s]:",
    "Ingrese Diametro [pul]:",
    "Ingrese Coefieciente de Rug [m]:"});
    END;
    //PROCESO DE CALCULO
    IF MENU==2 THEN
    Re:=(4*Q)/(pi*v*D*0.0254);
    IF Re<2100 THEN
    f1:=64/Re;
    ELSE
    f0:=0.001;
    REPEAT
    f1:=(0.25)/LOG((Ks/3.7*D*0.0254)+(2.51/(Re*(f0)^0.5)))^2;
    error:=ABS(f1-f0);
    f0:=f1;
    UNTIL error<=0.0000001;
    LR:={Re,f1};
    MSGBOX("Calculos realizados con exito!!!");
    END;
    //RESULTADOS
    IF MENU==3 THEN
    LOCAL LI;
    LI:={"N°de Reynols","Factor de Friccion"};
    RECT;
    RECT_P(0,0,320,240, RGB(0,25,98));
    LINE_P(0,10,320,10,RGB(255,0,0));
    LINE_P(0,230,320,230,RGB(255,0,0));

    FOR I FROM 1 TO 3 DO
    TEXTOUT_P("RESULTADOS",30+I,20+I,3,RGB(25,255,0));
    END;
    FOR I FROM 1 TO 2 DO
    TEXTOUT_P(LI(I),14,25+15*I,2,RGB(255,255,255));
    TEXTOUT_P(":",180,25+15*I,2,RGB(255,255,255));
    TEXTOUT_P(LR(I),185,25+15*I,2,RGB(255,255,255));
    END;
    WAIT(-1)
    END;
    UNTIL MENU==4;
    END;

    ResponderBorrar
    Respuestas
    1. Es un pequeño error de sintaxis, falta cerrar "//PROCESO DE CÁLCULO", adiciona un "END;" antes de "//RESULTADOS", es decir que quedará un para de "END;" juntos

      Borrar
  26. Hola Carlos, quisiera que me ayudes con esto, ¿cuál es el comando que quita el último elemento de una lista?

    ResponderBorrar
    Respuestas
    1. Hola Sergio, tomando la pregunta exactamente como la escribiste, no hay forma de reducir la cantidad de elementos en una lista (como comportamiento nativo del lenguaje), sí es posible crear nuevas posiciones pero no anularlas. La alternativa a esto es usar comandos "destructivos" que reescriban el contenido de la variable:
      Lista:={"gato","perro","rata"};
      Lista:=SUPPRESS(Lista,3); //Se crea una nueva lista sin "rata" y se reemplaza en Lista.
      Lista:=Lista({1,2}); //Se extrae el contenido de Lista {"gato","perro"} y se reemplaza la variable Lista original.

      ¿Por qué deseas eliminar el último elemento?

      Borrar
  27. Gracias tu respuesta me ha sido útil y funcionó el programa.
    Quería eliminar el elemento porque hice un programa que calcula el volumen de una estructura anticlinal (reservorio) mediante una lista de áreas.
    Pero tengo otra duda: ¿Por qué el comando ''SUPPRESS" y "pop" NO funciona en mi calculadora y SI funciona en mi laptop? La calculadora lo interpreta como un error de sintaxis ¿Es porque el software de la calculadora no está actualizado o porque la calculadora tiene esa limitación frente a una laptop?
    Noté que el comando de "Eliminar" no se encuentra en el menú de "Lista" de la calculadora, en su lugar se encuentra "Posición".
    CALCULADORA: Matem.>6 Lista>5 Posición.
    LAPTOP: Matem.>6 Lista>5 Eliminar.

    ResponderBorrar
    Respuestas
    1. SUPPRESS se agregó como comando de inicio a partir del FW 2018 01 24 (13333), pero antes de eso siempre existió el comando CAS suppress (minúscula), solo que la ejecucción de ese comando al ser CAS es más lento (solo notable en bucles de miles de ciclos, no se aprecia si solo se ejecuta 1 o 30 veces seguidas). Los comandos CAS puede que en casos realice lo que esperas y en otros casos no, tendrás que probar.

      Borrar
  28. Muchas gracias por tu trabajo, estoy empezando a programar en hp prime y me ha costado encontrar una información tan útil como la tuya. Muchas gracias

    ResponderBorrar
  29. Saludos, tengo un problema al declarar: INPUT({c,Φ,ɣ,D,B}); me sale como error; la solución esta en cambiar c por C; Φ, por alguna otra variable en mayúscula lo mismo para ɣ; pero quisiera mantener esas variables ya que así es la ecuación
    No se si se deba a una configuración de la calculadora o es que no puedo usar esas variables?

    ResponderBorrar
    Respuestas
    1. En HP Prime puedes usar cualquier caracter Unicode, ya sea esas letras extrañas o ideogramas orientales. El asunto es que debes crearlos para poder usarlos con:
      LOCAL c,Φ,ɣ,D,B,ぁ;

      Hay algunas más formas de crear variables, pero se sugiere que los crees solo dentro de tu programa, por otro lado no es recomendable usar las variables ya existentes de tu calculadora, que son para uso externo, uso que el usuario debe tener disponible (y no ser modificado por un programa que instale), claro que depende de qué tan transparente sea el programa.

      Las variables existentes (integradas) se encuentran en la tecla "Vars", ahí puedes encontrar todo el abecedeario reservado como variables tipo Real, y muchas más variables como las de aplicación, de usuario y las del catálogo. Por esa razón puedes usar la variable externa a tu programa C, porque ya existe y es de las que se puede acceder desde cualquier parte de la calculadora, como de tu programa o cualquier otro programa, nada recomendable por esa razón.

      Borrar
    2. Muchas gracias por responder, no sé mucho de programar, revisaré lo del LOCAL; será mejor el uso exclusivo para el programa.

      Borrar
  30. Hola, estoy tratando de hacer un programa que me calcule la ley de coulomb para tres cargas con cualquier tipo de triangulo?

    ResponderBorrar
  31. al crear un programa como tengo la inversa de una matriz o la tranpuesta?? ayuda por favor

    ResponderBorrar
  32. Saludos, tengo un problema con las derivadas , estaba desarollando un programa para calcular el jacobiano,para un cambio de varible en integrales dobles.
    EXPORT jacobiano()
    BEGIN
    PRINT;
    LOCAL U,V,Ux,Uy,Vx,Vy;
    INPUT({{U,[8],{30,30,1}},
    {V,[8],{30,30,3}}},
    "JACOBIANO",
    {"U:","V:"},{"Valor en funcion de x,y","Valor en funcion de x,y"});
    PRINT(U);
    PRINT(V);
    Ux:=CAS.diff(U);
    Uy:=CAS.diff(U,Y);
    Vx:=CAS.diff(V);
    Vx:=CAS.diff(V,Y);
    PRINT(Ux);
    PRINT(Uy);
    PRINT(Vx);
    PRINT(Vy);
    END;

    al derivar una expresion ,ejemplo:X*Y+X^2, respecto de X,imprime como resultado solo:2*X.
    como podria solucionar para que derive las expresiones correctamente.
    pasa lo mismo con el comando grad()

    ResponderBorrar

Publicar un comentario

Lo más visto

Matriz (Tipo) - HP Prime