Consideraciones del Lenguaje PPL - I PROGRAMAS I Como programador de la calculadora HP Prime, Prime, habrás notado ciertas particularidades que están incluidas en el Manual de usuario, 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 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] ▶ V ▶Variable, ariable, y luego asignar un tipo de dato diferente como "2015 un año muy soleado" ▶ V ▶Variable, ariable, 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 pued en 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 perm iten 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 llam an 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 PPLCAS.
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.
De forma similar funcionan los comandos de HP Prime, se presenta 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 cuand o 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 podrem os 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.
Continúa a Consideraciones en Programas II
HP Prime Programación PPL Comentarios
1. Ivan Contreras9/2/16 14:07
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...... RESPONDER
1. Carlos Ismael Campos Guerra10/2/16 12:40
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. 2. German Gonzalez13/2/16 18:33
Buenas tardes Carlos, los programas creados en la hp prime se pueden proteger mediante alguna clave?
RESPONDER
1. Carlos Ismael Campos Guerra14/2/16 01:14
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. 3. Daniel Sanchez15/2/16 18:40
Muy buen aporte Ing, esperando cada dia mas el programa VIGA C. RESPONDER
1. Anónimo25/4/16 11:03 Excelente Aporte Ingeniero! Gracias por compartir. 4. Rubén Espinoza21/6/16 16:15
Que buen aporte. Hay que aprender a programar de una buena manera y aqui explicas detalles interesantes. Gracias RESPONDER
5.Anónimo5/10/16 14:11 Soy Ingeniero Civil que calculadora me recomendas la Hp 50g o la Hp Prime? RESPONDER
6. Roland Espinoza22/11/16 17:49
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 RESPONDER
7.Anónimo15/12/16 09:10 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; RESPONDER
1. ElAmigoCarlos15/12/16 18:59
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. 8.
Hector Davalos24/2/17 16:17
HOLA MI NOMBRE ES ERNESTO Y ME GUSTARIA SER MIEMBRO DEL GRUPO SE PODRA ? RESPONDER
1. ElAmigoCarlos24/2/17 23:18
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 9. Hector Davalos24/2/17 16:20
ME PODRIAN AYUDAR CON ALGUN PROGRAMA SENCILLO PARA VERIFICAR QUE LA ACTUALIZACION 2016 08 29 ME ESTE FUNCIONANDO SE AGRADECE RESPONDER
1. ElAmigoCarlos24/2/17 23:17
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. 10. eeeee7/3/17 09:21
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
[email protected] RESPONDER
1. ElAmigoCarlos7/3/17 09:39
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 2. ElAmigoCarlos7/3/17 10:21
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"} ) 11.
eeeee7/3/17 11:41
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; RESPONDER
1. ElAmigoCarlos7/3/17 12:27
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. 12. eeeee7/3/17 12:33
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 RESPONDER
1. ElAmigoCarlos7/3/17 18:42
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. 13. eeeee7/3/17 12:36
amigo me olvidaba hasta en el simulador de la calculadora me sale este error tengo el simulador Version 2013 11 25.Rev 5447 RESPONDER
1. ElAmigoCarlos7/3/17 18:39
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. 14. eeeee8/3/17 12:24
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. RESPONDER
15. Gabriel Herrera29/5/17 17:20
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 RESPONDER
1. ElAmigoCarlos29/5/17 17:57
Tienes 2 modos para log