La entrada de datos en los programas
Mario de Lama  malar@arrakis.es
http://www.arrakis.es/~malar
Regresar Me lo bajo

Hay numerosas formas de solicitar al usuario los datos requeridos por un programa. La serie G tienen ventajas sobre la S ya que posee dos herramientas más. Las siguientes son las formas más usuales ya que si nos vamos al lenguaje System RPL encontraríamos otras maneras, incluso hay muchos programas que nos ofrecen herramientas para lograr este mismo fin. También se puede señalar que con un poco de imaginación podemos usar lo que sigue para dar formato a las salidas, esto es, para presentar las soluciones de nuestros programas. Pero eso sería motivo de otro artículo, vamos a comenzar por las entradas.

  1. Toma de datos desde la pila. Es la forma más evidente. Hay numerosos programas que requieren que todos los argumentos estén en la pila antes de ejecutarse, en caso de que no estén se producirá el error "Too Few Arguments" y el programa terminará.

  2. PROMPT. Este comando es bastante fácil de utilizar. Requiere que en el nivel 1 de la pila haya una cadena la cual será mostrada en el área de estado de la pantalla sin los delimitadores " ", deteniendo a continuación la ejecución del programa para permitir que el usuario introduzca los datos. Tras ello hemos de presionar la tecla CONT para que el programa continúe.

    Ejemplo:

    \<< "Dame el ancho y alto" PROMPT * "A" \->TAG \>>

    Este programa calcula el área de un rectángulo y le pone la etiqueta A:

  3. CLLCD DISP FREEZE HALT. El uso conjunto de estos comandos nos permite una entrada más elaborada.

    Ejemplo:

    \<< RCLMENU \->menu
       \<< { { "ANCHO" \<< 'AN' STO \>> } { "ALTO" \<< ' AL' STO \>> } { } { "CONT" \<< CONT \>> } } 
           TMENU CLLCD "Pon en la pila los \10 datos y presiona la \10 tecla de menú adecuada" 
           3 DISP 3 FREEZE HALT AL AN * "A"  \->TAG {  AL AN } PURGE menu MENU
       \>>
    \>>
    
    \10 simboliza el retorno de carro/nueva línea que corresponde al carácter 10. Todos los caracteres precedidos por la barra "\" son caracteres de la HP que no tienen equivalente en el PC y se traducen así. Puedes ver la tabla de equivalencias en la pág. 27-17 del manual de la HP48 G o en la 663 del de la HP48 S.
    Es otra versión del programa anterior, vemos que el código aumenta pero también lo hace la claridad para el usuario. Es mejor crear un menú para que éste lo tenga más fácil, eso es lo que hacemos al principio con TMENU (también podía haberse creado en el ejemplo de PROMPT), a continuación detenemos el programa presentando un mensaje. El usuario pone en la pila los datos y presiona las teclas de menú apropiadas que los guardan en las variables AL y AN, a continuación presionando la tecla de menú CONT el programa continúa calculando el área y poniendo el resultado etiquetado en la pila. Finalmente borramos las variables utilizadas y volvemos al menú inicial guardado en la variable local 'menu'. Es una norma de educación que el programa deje la calculadora tal como la encontró.
    Fig. 1Fig. 2Fig. 3
    CLLCD se encarga de borrar el área de estado y la pila. Vemos en la Fig. 1 como queda la pantalla al utilizarse este comando, de no hacerlo esta quedaría como en la Fig. 2. Por otro lado, DISP coloca la cadena del nivel 2 de la pila en la línea de pantalla indicada en el nivel 1, las líneas se encontrarán entre 1 y 7. FREEZE congela la imagen de pantalla dependiendo de si se le da como parámetro: 1 (área de estado), 2 (pila y línea de comandos), 4 (área de menús). La suma de 1 y 2 daría lugar al "congelamiento" del área de estado y la pila (pasaríamos un 3 como parámetro de FREEZE), etc. Los números mayores de 7 o menores de 0 son equivalentes al 7.
  4. INPUT. Este comando es más complicado pero a cambio ofrece bastante claridad. Al ejecutarse limpia el área de la pila presentando una cadena indicadora en su parte superior. En la línea de comandos aparece la llamada cadena de línea de comandos, también aparece el cursor y se activa el modo de entrada al programa (en la esquina superior derecha aparece PRG). En ese momento se pueden introducir los datos para a continuación presionar ENTER lo que devuelve al nivel uno de la pila una cadena resultado y el programa continúa.

    Ejemplo:

    \<< "Dame los datos" { ":Largo:\10:Ancho:" { 1 0 } V } INPUT OBJ\-> * "A" \->TAG \>>

    Fig. 4
    Vemos en la Fig. 4 que la pantalla de entrada de datos que crea este programa es muy clara. Estudiemos con más detenimiento los parámetros de INPUT:
    Todos los siguientes son ejemplos válidos: Si os fijáis, la cadena de la línea de comandos va entre los delimitadores de etiqueta ( :: ). De esta forma al deshacer con OBJ\-> la cadena que nos devuelve INPUT, en la pila nos quedan objetos etiquetados (Fig. 9), en caso de no hacerlo así nos quedaría la Fig. 10. Si deseáis que sólo os queden los datos y nada más que los datos, poned la cadena de la línea de comandos entre símbolos de comentario: Con { "@ Largo @(@ Ancho @" } obtendréis la Fig. 11.
    Fig. 9Fig. 10Fig. 11
  5. INFORM. Esta es una de las nuevas herramientas de la serie G (es una caja de diálogo o formulario de entrada). Nos presenta una pantalla en la que vienen las etiquetas de los datos a introducir y podemos, con los cursores, desplazarnos de una a otra para introducirlos, editarlos, etc.

    Ejemplo:

    El símbolo @ (arroba) inicia un comentario en el lenguaje User RPL, lo que se escribe tras él en la misma línea no se compila y no sólo eso sino que si tras guardar el programa se vuelve a editar, los comentarios han desaparecido. La calculadora compila el programa al guardarlo en una variable, en ese momento deshecha todo lo que haya en una línea tras las arrobas.
    \<< WHILE                       @ Iniciamos una cláusula WHILE REPEAT
       "AREA DE UN RECTANGULO"                                      @ Título de la caja
       {{"NOMBRE" "" 2}{ }{"LARGO" "LADO INFERIOR" 0}{"ALTO" "" 0}} @ Definición de los campos
       { 2 0 }                                                      @ Formato de los campos
       {"Rectángulo" NOVAL NOVAL}                                   @ Valores de RESET
       { NOVAL 4 2 }                                                @ Valores iniciales
       INFORM                       @ Muestra la caja de diálogo y el menú (con NEXT obtenemos el siguiente)
      REPEAT                        @ Vemos si se ha dado OK (hay un 1 en el nivel 1) o CANCEL (hay un 0)
       IFERR                        @ En caso de que haya sido OK, iniciamos la cláusula de captura de errores
         LIST\-> DROP * "área"      @ Deshacemos la lista que INFORM ha devuelto y hacemos L * H
         IF 3 PICK NOVAL \=/        @ Si el campo NOMBRE (que estará en el nivel 3 de la pila) no está vacío
         THEN " de " + ROT +        @ formamos la cadena "Area de NOMBRE"  para el mensaje solución.
         ELSE ROT DROP              @ Si NOMBRE=NOVAL, borramos el nivel 3. La cadena será sólo "área"
         END "\10" + SWAP + MSGBOX  @ Añadimos un retorno de carro y la solución a la cadena y la mostramos
       THEN                         @ Si al hacer L * H, son L=NOVAL o H=NOVAL, se produce un error
        "Tienes que darme el largo y el alto" MSGBOX 3 DROPN @ Mostramos un mensaje y borramos la pila
       END                          @ Finaliza la captura de errores 
     END                            @ Finaliza la cláusula WHILE REPEAT 
    \>>
    
    La pantalla del programa tras introducir el nombre "CAJA" corresponde a la Fig. 12, la solución va en la Fig. 13. Si hacemos "Reset all", tendremos la Fig. 14. Si tras ejecutar RESET damos OK obtendremos la Fig. 15 ya que se producirá un error al multiplicar el ancho (NOVAL) por el alto (también NOVAL). Si intentamos introducir en un campo un dato que no sea del tipo expresado en la definición de campos (ejemplo: un real (TYPE= 0) en el campo NOMBRE que sólo admite cadenas (TYPE= 2)), obtendremos la Fig. 16.
    Fig. 12Fig. 13Fig. 14
    Fig. 15Fig. 16
    Los argumentos de INFORM son:
  6. CHOOSE. Esta caja de selección es también una de las nuevas funciones de la serie G y hace más vistosa la interface de usuario.

    Ejemplo:

    \<< WHILE                                                    @ Iniciamos una cláusula WHILE REPEAT
            "CALCULO DE AREAS"                                   @ Título de la caja de selección
            { Círculo { "Triángulo" 2 } { "Rectángulo" 3 }       @ Lista con las posibilidades de selección
            { "Pentágono regular" 4 } { "Hexágono regular" 5 } } 
            1                                                    @ Posición preseleccionada
            CHOOSE                @ Se muestra la caja de selección y el menú (OK o el CANCL, OK)
         REPEAT                   @ Vemos si se ha dado OK (hay un 1 en el nivel 1) o CANCEL (hay un 0)
            \-> n                 @ Guardamos en la variable local 'n' lo que CHOOSE deja en la pila
            \<< CASE n 2 ==       @ Si 'n' es un 2
                     THEN TRIAN   @ Ejecutamos el programa TRIAN que nos pide datos y hace el cálculo
                     END n 3 ==   @ del área del triángulo.
                     THEN RECTAN  @ Si hemos seleccionado la tercera opción, se ejecuta RECTAN
                     END n 4 ==
                     THEN PENTA   @ La cuarta corresponde al programa PENTA
                     END n 5 ==
                     THEN HEXA    @ La quinta al HEXA
                     END n EVAL   @ Si no era ninguna de las anteriores, en 'n' estará almacenado 'Círculo',
                 END              @ que es a la vez el nombre del programa y de una selección
            \>>                   @ Para ejecutarlo, hemos de ponerlo en la pila y ejecutar EVAL.
         END                      @ Termina la cláusula WHILE REPEAT
    \>>
    
    La pantalla generada por este programa corresponde a la Fig. 17
    Fig. 17Fig. 18Fig. 19Fig. 20
    Los argumentos de CHOOSE son tres: Si seleccionamos un objeto que en la lista del nivel 2 no aparece como una lista (en nuestro ejemplo 'Círculo') y presionamos OK, en el nivel 2 aparece dicho objeto (Fig. 19) y el programa continúa (la Fig. 19 no se vería, es un proceso interno del programa ). Si la selección hubiera sido 'Triángulo', la pantalla sería la de la Fig. 20 (es otra figura aclaratoria que tampoco se vería). Si presionamos CANCL sólo aparece un 0 en el nivel 1 de la pila y entonces REPEAT no ejecutaría el bucle. Los usuarios de la serie S pueden encontrar un sustituto a CHOOSE con FCHOOSE (Librería de1985.5 by, es de Matthew Willis, en el Goodie Disk 10). También corre en la serie G. Los parámetros son los mismos unicamente hay que poner FCHOOSE en el lugar de CHOOSE y obtendríamos la Fig. 21. Tiene un bug: La flecha indicadora se mueve con los cursores de forma que de la última opción pasamos a la primera presionando el cursor \|v, igualmente, de la primera opción se pasa a la última presionando \|^ pero en este caso se "come" la primera columna de píxeles de cada opción, según se muestra en la Fig. 22.
    Fig. 21Fig. 22
    Además de FCHOOSE la librería tiene el comando TITLE cuyo único parámetro es una cadena que muestra en el área de estado. La presentación es la misma que el título de FCHOOSE, de forma que \<< "CALCULO DE AREAS" TITLE 1 FREEZE \>> mostraría el mismo título de la Fig. 21.


Regresar Me lo bajo