You are on page 1of 21

Programando la HP Prime

Tras un cuatrimestre duro he aprendido a programar un poquito la HP Prime. Su lenguaje


de programación es HPBASIC, muy similar al C. No tengáis miedo porque no hay que ser
un genio de esto para poder usarla porque yo sólo sé programar en C (y tampoco mucho) y
la verdad es no es nada complicado.

Voy a dejar aquí dos programas míos que son los que mas he usado estos últimos meses en
la universidad. El primero es un simple programa de interpolación lineal, sólo tienes que
introducir las coordenadas de dos puntos y luego la abscisa del punto a interpolar. El
segundo programa es más simple que el otro, en este introduces dos vectores y te calcula el
producto escalar, el producto vectorial y los módulos de los vectores que has introducido.

He subido una nueva entrada llamada Programando la HP Prime II en la que trato más
temas sobre la programación de la calculadora HP Prime.
¡Si esta entrada te ha gustado la nueva que acabo de subir te encantará! Puedes encontrarla
en mayo 2016.

PROGRAMA 1:

PROGRAMA 2:
Hay muchas modificaciones que se pueden hacer en ambos programas pero eso ya lo dejo
para otra entrada ;)

Programando la HP Prime II

En esta entrada quiero mostraros algunos ejemplos de como se programa en la


HP PRIME con argumentos.

 Primer programa:

Este programa es una versión del típico programa que hace todo el mundo cuando
empieza a programar, estoy hablando del famoso "Hello World!".
En la linea 1 se puede ver que ahora tras el EXPORT viene el nombre del
programa, en este caso es Nombre (sí, lo sé... muy original).Pero la gran
diferencia con los otros programas es que ahora tenemos algo entre los
paréntesis. Eso se conoce como argumento de una función. Si usamos
argumentos en el programa, lo vamos a poder ejecutar directamente sin tener que
ir al menú de programas.

El comando MSGBOX va a mostrar en un mensaje lo que haya entre sus


paréntesis. Lo que vamos a hacer es concatenar (unir) los strings . Para que los
interprete como strings hay que ponerlos entre comillas (" ... ") como por ejemplo
"Hola " o "!". Para concatenar hay que usar +.

Todos los programas por defecto al ejecutarse correctamente devuelven el valor 1.


Si usamos el comando RETURN vamos a obligar al programa que nos devuelva su
argumento. Esta es otra forma que el programa nos muestre algún dato o algo que
queramos que se lo de a otro programa.

Si ejecutamos el programa:

Una cosa importante es que una vez que escribamos nuestro nombre como
argumento del programa hay que ponerlo entre comillas para que lo interprete
como un string.

 Segundo programa:

El siguiente programa tiene mucha más utilidad que el anterior. Lo que vamos a
hacer es calcular el paralelo de dos resistencias que se dan en forma de
argumentos. Así nos ahorramos tener que entrar en el menú de los programas,
pudiendo ejecutarlo directamente.

El código es:
 Tercer programa:

Hablando con un amigo sobre el anterior programa me dijo que por que no hacía
otra variante más de éste. Una en la que se calcule el paralelo de varias
resistencias. Sólo hay que introducir los valores de las resistencias entre { ... }
separadas por comas.

Lo bueno de este programa es que podemos poner tantas resistencias como


queramos.

El código es:
Este código es un poquito más complejo pero tampoco mucho... jeje

En la linea 14 hay un IF que lo que nos advierte si hay un error, cuando sólo
introducimos el valor de una única resistencia. En la linea 19 tenemos el bucle FOR
que calcula el valor de las resistencias en paralelo. En las siguientes lineas de
código lo que vamos a hacer es calcular el valor de las resistencias con la variable
R, su módulo con Mod y la fase de ésta con Fase. Esto se debe a que también
podemos usar números complejos y por lo tanto cualquier tipo de impedancias.
Vamos a usar el comando truncate para que nos trunque el resultado con un
número de decimales que seleccionamos nosotros con la variable decimales.

Las ejecuciones de los dos programas son:


Segundo programa

Tercer programa
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 4°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.

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 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.