Historia de la calculadora programable HP 41C


Las Calculadoras Programables son un tipo de calculadoras electrónicas que pueden ejecutar de forma automática una secuencia de operaciones bajo el control de un programa almacenado, como un ordenador. Se emplean normalmente para aplicaciones científicas, financieras, ingeniería y educación.


👑 La HP 41C, fabricada desde 1979 hasta 1990, fue el standard en ciencias e ingeniería durante gran parte de su vida. Programable, alfanumérica, con una pantalla LCD de alto contraste y expandible, tenía una gran capacidad de memoria y se podia gestionar de una forma mucho más avanzada que cualquiera otra de la competencia, era un verdadero ordenador portátil en el bolsillo.


Sus capacidades podían ser expandidas mediante 4 puertos de expansión en su parte trasera para albergar módulos de memoria ROM con nuevas funciones o conectar interfaz para utilizar impresoras térmicas, plotters, lectores de código de barras, dispositivos de almacenamiento, aparatos de medida, dispositivos de laboratorio de HP, etc.


Casi todas las teclas de la calculadora podían ser reasignadas a nuevas funciones o programas.



HP 41C con lector de códigos de barras


HP 41C casete de cintas magnéticas.

Plotter o Impresora conectado a la HP 41CV


HP 41C módulos de expansión y lector

Aún conservo la calculadora programable HP-41C,

 con las tarjetas magnéticas para archivar las aplicaciones



Agenda con notas y esquemas de programación, que fui realizando desde 1982 


La NASA uso esta calculadora en sus misiones espaciales

Un HP-41C que voló en nueve de las primeras misiones del transbordador espacial se exhibe en el Museo Nacional del Aire y del Espacio en Washington, DC HP-41C con algunas configuraciones de hardware especiales (la adición de tiras de velcro , módulo de tiempo de preproducción y un zumbador más fuerte , así como la eliminación de partes cuya desgasificación podría causar contaminación) se llevaron a cabo en las primeras misiones del Shuttle con el propósito de realizar cálculos mundanos pero necesarios, como calcular el cambio en el centro de gravedad debido al consumo de combustible. El HP-41C también fue programado para manejar los cálculos que generalmente realiza la computadora principal a bordo, como determinar los tiempos de encendido para el reingreso, en el caso de una falla de la computadora principal.





Emulador Calculadora TI-58/59

TI-58C

Emula una calculadora Texas Instruments TI-58/58C/59 de 1979.


Guía de programación T I-58/59

• Introducción


La calculadora programable TI-58TI-58C y TI-59 fueron unas calculadoras de bolsillo programable fabricada por Texas instruments desde 1979, utilizan un lenguaje de programación llamado LMS, almacenando las teclas de la propia calculadora como una secuencia de instrucciones y ejecutándolas en consecuencia. De esta manera, el TI-58/59 es un decodificador de computación de buena fe. Almacenará valores, realizará ramificaciones condicionales y hará muchas otras cosas que hacen las computadoras convencionales. A medida que se desarrollan los programas TI-58/59, tienen un parecido sorprendente con los programas de lenguaje ensamblador.

• Cómo programar

Cuando está en modo calculadora, el TI-58/59 funciona como una calculadora ordinaria. Es en el modo Aprender donde se almacenan las instrucciones. Presione la tecla LRN para ingresar al modo de aprendizaje. Tenga en cuenta que la pantalla cambia. Hay 3 ceros, un espacio y luego 2 ceros:

00000

El primer conjunto de ceros es el número de paso. Dado que los programas se componen de una serie de pasos, la secuencia es vital. El número de paso realiza un seguimiento de esto.

El segundo conjunto de ceros indica el código de la instrucción en esa secuencia. Como se dijo anteriormente, el lenguaje de programación del TI-58/59 es simplemente las teclas de la calculadora disponibles. A cada clave se le da un código numérico. Tenga en cuenta que el teclado tiene 5 teclas de ancho y 9 teclas hacia abajo. Esto permite identificar cada clave con un número de 2 dígitos, o "código de instrucción". Por ejemplo, la clave raíz cuadrada estaría representada por el código de instrucción 34, porque está en la 3ª fila hacia abajo y la 4ª tecla a través.

Tenga en cuenta también que el TI-58/59 asigna múltiples funciones a la misma tecla. El uso de la  tecla realizará una función diferente. Por ejemplo, al presionar la  tecla y luego la tecla raíz cuadrada se efectuará la función cos. En este caso, se genera un código de instrucción similar, pero es 5 + el número de teclas de ancho. Por ejemplo, el código de instrucción para la clave cos es 39.

• Ingresar a un programa

Entremos en un programa simple. Crearemos un programa que multiplique un valor por 2. Encienda la calculadora, presione la tecla LRN y presione la tecla de multiplicación, las dos teclas y la tecla igual. Cada vez que presione una tecla, observe que el número de secuencia aumenta. Esto se debe a que está agregando secuencias de instrucciones cada vez que presiona una tecla.

Puede recorrer un programa utilizando las teclas SST y BST, que son un solo paso y un paso atrás respectivamente. Presione BST y el número de secuencia volverá a 002. Tenga en cuenta que el código de instrucción es 95. Esto tiene sentido porque la tecla igual está en la 9ª fila y la 5ª columna del teclado. Al presionar BST y SST retrocederá paso y un solo paso a través del programa.

Considere nuestro programa en esta representación:

00065x
001022
00295=

Tenga en cuenta un par de cosas. En primer lugar, la primera instrucción tiene la secuencia 000. También podría estar acostumbrado a contar desde cero de inmediato. Cero es un número. Aunque tiene un valor numérico de nada, es un identificador válido. La primera instrucción tiene la secuencia 000. Tenga en cuenta también que el código de instrucción para el dígito 2 no es lo que esperaría. Normalmente sería 83, para la 8ª fila y la 3ª columna. Pero en cambio se representa como 02. No sé por qué. Dado que la primera fila del teclado se considera fila 1, cualquier cosa que comience con 0 puede considerarse un dígito. Dado que cada dígito se almacena por separado, los diez dígitos se pueden representar de esta manera.

• Control de flujo

Hay un par de otras claves que debe comprender antes de poder ejecutar un programa. Una es la clave RST. Esto significa reinicio, y pone el puntero de secuencia de nuevo a 000. Pruébalo.

Presione SST o BST hasta que esté en la secuencia 002. Presione la tecla LRN para salir del modo de aprendizaje.

Presione LRN nuevamente para volver al modo de aprendizaje. Tenga en cuenta que todavía está en la secuencia 002. Presione LRN nuevamente para salir del modo de aprendizaje. Ahora presione la tecla RST. Presione la tecla LRN nuevamente para volver al modo de aprendizaje. Observe que el puntero de secuencia ya no está en el paso 002, sino que se ha "restablecido" al paso 000. Por lo general, después de ingresar un programa, querrá restablecer el puntero de secuencia al principio antes de la ejecución.

La otra clave importante es la clave R/S. Esto significa "Ejecutar /Detener". Al presionar esto, el programa comenzará o detendrá la ejecución.

• Ejecución del programa

Para ejecutar un programa debes estar fuera del modo de aprendizaje. Si está en modo de aprendizaje, presione la tecla LRN para volver al modo de calculadora. Presione la tecla RST para asegurarse de que el puntero de secuencia está de vuelta al principio del programa. Nuestro programa está diseñado para muliply un número por dos. Empecemos por lo pequeño. Presione la tecla 6. Con el número 6 en la pantalla, este es el número que será operado por nuestro programa cuando comience la ejecución. No es diferente a si empezáramos a pulsar manualmente las teclas que componen nuestro programa. Es solo que el TI-58/59 ejecutará estas construcciones automáticamente para nosotros.

Presione la tecla R / S para comenzar a ejecutar el programa. Tenga en cuenta que la calculadora parece ir a la tierra de nunca jamás. Si lo dejas correr el tiempo suficiente, el número 0 comenzará a parpadear en la pantalla. Presione la tecla LRN para ingresar al modo de aprendizaje. Tenga en cuenta que está en la secuencia 239 o 479. Este es el número máximo de pasos disponibles para la calculadora programable TI-58/59.

¿Qué salió mal? Bueno, si miras de cerca el programa, notarás que nunca le dijimos a la ejecución que se detuviera. La calculadora ejecutará obedientemente nuestras instrucciones de multiplicar por dos, pero luego continuará ejecutando instrucciones nulas hasta que se quede sin números de secuencia.

La solución es utilizar el R/S como una instrucción de programación real. Esto hará que la ejecución se detenga cuando se encuentre la instrucción. Para hacer esto, salga del modo de aprendizaje y presione RST para restablecer el puntero de secuencia. Vuelve al modo de aprendizaje y verás que el puntero de secuencia vuelve a estar en 000. Pulsa SST hasta que estemos en la secuencia 003. Tenga en cuenta que este es un número de secuencia no utilizado porque el código de instrucción es 00. Ahora simplemente presione la tecla R / S. Esto establecerá nsctruction 003 para que sea la función run/stop.

Nuestro programa ahora se ve así:

00065x
001022
00295=
00391R/S


Vamos a intentarlo de nuevo. Salga del modo de aprendizaje y restablezca el puntero de instrucciones. Introduzca el dígito 6 en la pantalla y pulse R/S. ¡Mira eso! El TI-58/59 ha multiplicado nuestro número por 2 y ha detenido la ejecución. ¡Bien! Ahora vamos a intentarlo de nuevo. Presione CLR para borrar la pantalla y, a continuación, escriba un número de su elección. Pulse la tecla R/S.

¿¿Qué pasó?? Se fue a tierra de nunca más. ¿Por qué? El problema es que el TI-58/59 detuvo la ejecución en la secuencia 003 donde teníamos nuestra instrucción R/S. La próxima vez que iniciamos la ejecución, se recuperó en la secuencia 004. Esto, como la primera vez, hizo que volara a través de un montón de instrucciones nulas hasta que se quedó sin secuencias.

¿Cómo explicamos este comportamiento? La solución es sencilla. La clave RST, al igual que la clave R/S, se puede introducir como una instrucción ejecutable. Presione la tecla CLR para que la pantalla deje de parpadear. Presione la tecla RST para restablecer el puntero de secuencia. Presione LRN para entrar en modo de aprendizaje. Presione SST hasta que esté en la secuencia 004. Ahora presione la tecla RST para asignar la función de restablecimiento a la secuencia 004.

Nuestro programa ahora se ve así:

00065x
001022
00295=
00391R/S
00481RST


Vuelve a salir del modo de aprendizaje y restablece el puntero de secuencia. Nuevo vamos a intentarlo de nuevo. Ingrese 6 y presione R / S. Como antes multiplicará 6 por 2. Ahora ingrese un número de su propia elección y presione R / S nuevamente. Esta vez funciona. La segunda vez que presione R / S, continuará y ejecutará la secuencia de instrucciones 004. Pero la nueva secuencia 004 le dice al puntero de instrucción que vuelva a 000. Esto comenzará la ejecución del programa desde el principio, lo que multiplicará el valor de visualización por 2 y detendrá la ejecución.

• Emulación de un TI-58/59

Si no tiene una calculadora TI-58/59, ¡emule!

TI-59EMU.gif (34658 bytes)TI 5X - emulador de la calculadora programable TI-59. El programa emula completamente la famosa calculadora TI-59 de la compañía Texas Instruments con la impresora PC-100A. Permite guardar y cargar los programas y cambiar entre módulos de biblioteca. 

TI-58C /59 Key code

 Mi programa de armado de vigas realizado con la TI-58C en 1980.



Ordenador de Hewlett Packard HP 86B


Ordenador Hewlett Packard  HP-86B con doble disquetera 1984


Procesador HP 0,625 MHz 64 bits
128kB RAM
Pantalla LCD
Modos de texto 80x16 u 80x24
Modos gráficos 400x240 o 544x240
Puerto HP-IB (o GPIB) para extensiones Unidades de disquete y discos duros Impresoras y Plotters
Adquisición de datos periféricos (multímetros, osciloscopios...)
Expansión del sistema mediante módulos ROM o EPROM
Tarjetas HP-IL, RS232
Posibilidad de utilizar parte de la RAM como RAMDisk
Unidad de doble disquetera con almacenamiento de 620 KB.


Los HP-80 utilizaron una versión muy potente del lenguaje BASIC. Los tipos de datos incluían cadenas, enteros, cortos y reales. El intérprete admitía subrutinas, funciones, datos comunes y una variedad de características potentes, incluida la capacidad de configurar y responder a los temporizadores.


Listado de nervios de forjado reticular HP 86B




HP 42S - Emulador Free 42

Calculadora programable HP-42s



La HP-42S fue una calculadora RPN científica programable introducida por Hewlett Packard en 1988. Tenía funciones avanzadas de matemáticas, álgebra lineal, análisis estadístico, ciencias de la computación, editor de matrices, soporte de números complejos, solucionador de ecuaciones, menús definidos por el usuario, capacidades básicas de gráficos, mucho más avanzada y potente reemplazó a la serie HP-41 siendo compatible con todos sus programas.

Emulador HP-41c <go41c> para móviles Androide


Emulador muy realista, pero limitado en capacidad de registros y no permite grabar los programas.

Emulador Free42 para PC o móviles Androide/ IOS (IPhone) - 2021


Este magnífico emulador gratuito de la HP-42s, permite guardar los programas en la memoria del móvil y los resultados copiarlos en la bandeja clips de la memoria para utilizarlos en otras aplicaciones. Tiene incorporado una cinta de impresión digital con formato similar a la de la impresora térmica original.
Tambien funciona como emulador en el PC y los ficheros de programas generados, se pueden intercambiar entre el PC y el móvil. Esto le confiere mucho mayor versatilidad que las originales HP-41CV y  HP-42S 



 Calculadoras DM42 y DM41X RPN


Actualmente el lenguaje RPN sigue vigente entre la comunidad científica. La empresa SwissMicros comercializa por 185 € la DM42 y DM41X RPN, gama insignia de las calculadoras RPN, un verdadero homenaje a las legendarias HP-42s y la HP-41cx ampliamente consideradas como las calculadoras más deseadas jamás fabricadas y de las más precisa del mercado mundial, utilizando la poderosa y probada lógica RPN.

El DM42 ejecuta Free42, basado en una biblioteca matemática de coma flotante decimal y coma flotante decimal de precisión cuádruple IEEE 754-2008, codificando números en 16 bytes y dando 34 lugares decimales de precisión con exponentes que van desde -6143 a +6144.


Listado de aplicaciones realizadas en RPN

Free42



Free42 aplicación para móviles Androide

También me ha resultado muy útil tener instalado en el móvil, el emulador Free42 de la calculadora HP-42S, que me ha permitido programar en  RPN (mi lenguaje favorito)  utilizándolo tanto para realizar programas de cálculos de ingeniería, como de conversión de unidades o de contabilidad doméstica y a la vez usarla como potente calculadora científica.

Con mi nueva aplicación de IA realizada en AppSheet, me puede generar cualquier programa
 en lenguaje RPN para introducirlo en el emulador Free42 de la HP-42S.

Todas las aplicaciones listadas a continuación están realizadas por mí actualmente, usando el emulador "Free42" de la calculadora programable HP-42S o el de la HP-41C.

Para habilitar la impresora adjunta con FREE42, usar la función PRON en el menu PRINT  Shift   Σ+. 

De mis aplicaciones de estructuras, solo he puesto algunas como la de cálculo de esfuerzos en portico por el método de Kani, las demás por ser de mi ámbito profesional no las he incluido en este blog.

Rutinas de programación RPN

Publicada en Mayo 2023

Para habilitar la impresora adjunta con FREE42, usar la función PRON en el menu PRINT  Shift   Σ+. 


Fecha actual en formato Dia/Mes/Año usando la función DATE y IP

DATE devuelve la fecha en formato = 16.052023

IP obtiene la parte entera de un numero 16

Flags 29 debe estar apagada CF 29, para que no aparezca el punto o coma detrás del número entero.

16/5/2023



Fecha actual en formato dia.mes.año usando la función DATE y ADATE

00 { 20-Byte Prgm }

01▸LBL "FECHA"

02 FIX 06

03 CLA

04 DATE

05 RCL ST X

06 ADATE

07 PRA

08 END

19.05.2023


Como modificar las partes de números

La segunda fila del menu CONVERT contiene las siguientes funciones:

IP Parte entera.

FP Parte fraccionaria.

RND Redondear.

ABS Valor absoluto.

SIGN Signo.

MOD Modulo.

Parte entera (IP). La función IP suprime la parte fraccionaria de

un número real. Por ejemplo, la parte entera de 14,2300 es 14,0000.

Parte fraccionaria (FP). La función FP suprime la parte entera de

un número real. Por ejemplo, la parte fraccionaria de 14,2300 es 0,2300.

Redondear números (RND). La función RND redondea un número real al número de dígitos especificado por el formato de presentación en uso. Por ejemplo, si desea redondear un valor monetario al centavo más proximo, especifique el formato de presentación como

FIX 2 y luego ejecute RND([l F1x 02 [[CONVERT][Y] RND ).



Longitud de una palabra

(Version HP 41C realizada en 2023)

Usaremos las funciones extendidas  "ALENG" (  un contador de caracteres) y 

"ASHF" (para guardar los 6 restantes caracteres ya que la memoria ASTO 00 solo conserva los 6 primeros)

(Version Free 42 realizada en 2023, la nueva función XASTO 00 guarda más de 6 caracteres)


00 { 37-Byte Prgm }
01▸LBL "BQ"
02 CLST
03 FIX 00
04 AON
05 "PALABRA?"
06 PROMPT
07 ALENG
08 STO 01
09 XASTO 00
10 CLA
11 AOFF
12 ARCL 00
13 ├"="
14 ARCL 01
15 AVIEW
16 END

CATEDRAL=8.


STO . >>> STO IND_ _   o X o Y o Z   

_____________________________________________________

INPUT aparece como  >>       VAL?0 

y obliga a poner a 0 la variable VAL para que no repita el último dato introducido

PROMPT es más visual >>>   VAL?




Bucle controlado
Un bucle controlado es un bucle que se ejecuta un número específico de veces.
Puede crear un bucle controlado con una etiqueta local o global, un ISG (*) o
instrucción DSE y una instrucción GTO.
  
00 { 54-Byte Prgm }
01▸LBL "COUNT"
02 0
03 STO "COUNT"
04▸LBL 01
05 ISG "COUNT"
06 0                           Cuando se usa la función ISG (*) el paso siguiente se lo salta ( 0 )
07 VIEW "COUNT"
08 RCL "COUNT"
09 10
10 X=Y?
11 STOP
12 GTO 01
13 .END.

TIEMPO DE PROCESAMIENTO, USANDO LA FUNCION   TIME






COUNT=              1,00
COUNT=              2,00
COUNT=              3,00
COUNT=              4,00
COUNT=              5,00
COUNT=              6,00
COUNT=              7,00
COUNT=              8,00
COUNT=              9,00
COUNT=             10,00
Con la función TRACE del menu de impresión, se puede ver
que por un bugs del emulador, tras el contador creciente ISG en la línea 08 salta a la 10,
por lo que se ha colocado un 0 (NOP) para evitar este error.
Esto no ocurre con el contador decreciente DSE.






(*) El manual de FREE42 dice: NOP  Sin operación. Se puede usar como relleno cuando ISG se usa de una manera en la que siempre omitirá la siguiente instrucción, como cuando se usa como un contador sin límite superior.

Para realizar una depuración de cualquier programa, usaremos la función TRACE del menu PRINT 

para quitar este modo TRACE  ir al menu PRINT  ejecutar la función MAN■


             Inicio Entrada antigua


Calculadora multiple operaciones (modificada 2026)




Calculadora con múltiples operaciones
En RPN  (Agosto 2026)

Modificada Agosto 2026


MIT INVENTOR (Agosto 2026)



Calculadora Mit Inventor2








Calculadora (Julio 2023)
00 { 364-Byte Prgm }
01▸LBL "Calcula"
02 CLMENU
03 "---------------"
04 AVIEW
05 CLST
06 CLRG
07 FIX 02
08▸LBL 20
09 MENU
10 "1 Nro? "
11 PROMPT
12 STO 01
13 PRX
14▸LBL 10
15 MENU
16 "+"
17 KEY 1 GTO 01
18 "-"
19 KEY 2 GTO 02
20 "*"
21 KEY 3 GTO 03
22 "/"
23 KEY 4 GTO 04
24 "M+"
25 KEY 5 GTO 05
26 "T="
27 KEY 6 GTO 06
28 STOP
29 GTO 10
30▸LBL 00
31 " Nro? "
32 PROMPT
33 STO 02
34 PRX
35 RTN
36▸LBL 01
37 XEQ 00
38 "       +  -----"
39 AVIEW
40 CLA
41 "            "
42 RCL 01
43 RCL 02
44 +
45 STO 01
46 ARCL ST X
47 AVIEW
48 STOP
49 GTO 10
50▸LBL 02
51 XEQ 00
52 "       -  -----"
53 AVIEW
54 CLA
55 "            "
56 RCL 01
57 RCL 02
58 -
59 STO 01
60 ARCL ST X
61 AVIEW
62 STOP
63 GTO 10
64▸LBL 03
65 XEQ 00
66 "       *  -----"
67 AVIEW
68 CLA
69 "            "
70 RCL 01
71 RCL 02
72 ×
73 STO 01
74 ARCL ST X
75 AVIEW
76 STOP
77 GTO 10
78▸LBL 04
79 XEQ 00
80 "       /  -----"
81 AVIEW
82 CLA
83 "            "
84 RCL 01
85 RCL 02
86 ÷
87 STO 01
88 ARCL ST X
89 AVIEW
90 STOP
91 GTO 10
92▸LBL 05
93 "          -----"
94 AVIEW
95 "Parcial="
96 RCL 01
97 STO+ 05
98 ARCL 01
99 AVIEW
100 STOP
101 GTO 20
102▸LBL 06
103 "---------------"
104 AVIEW
105 "Total=  "
106 ARCL 05
107 AVIEW
108 STOP
109 GTO "Calcula"
110 END


El mismo programa en Quick Basic (QB64)  (Agosto 2023)


Usando el archivo calculadora.txt como una impresora digital, al igual que en la HP42S, guardando las operaciones realizadas.
Se ha implementado los decimales redondeados a 2 dígitos y el separador de miles al formato de los números mediante funciones y subrutinas , ya que el Quick Basic no lo trae de origen.

Dim total As Double

Dim number As Double

Dim secondNumber As Double

Dim more As String

Dim moreNumbers As String

Dim operation As String

total = 0

more = "y"


Open "calculadora.txt" For Output As #1 Rem "Abro archivo nuevo  calculadora.txt"
Rem Open calculofile$ For Append As #1 Rem "Abro archivo  calculadora.txt para anadir"


Cls
Screen 12

While more = "y"

    Color 6

    GoSub rectangulo
    GoSub operadores


    Color 7
    Locate 3, 21: Input "N1"; num#
    Cls
    total = round(num#)

    Print #1, "   ";
    a = total
    GoSub formatF

    While operation$ <> "t"
        Color 6
        Locate 1, 5: Print "     "; Chr$(6); " Calculadora "; Chr$(6)

        GoSub rectangulo

        Color 14

        Locate 3, 23: GoSub formato

        GoSub operadores

        Color 7

        Locate 4, 22: Input ""; operation$

        operation$ = LCase$(operation$)





        If operation$ = "+" Then

            Rem sumar

            Color 7
            Locate 5, 20: Input "N2"; secondNumber#
            num = secondNumber#
            secondNumber = round(num)

            Print #1, "+   ";
            a = secondNumber#
            GoSub formatF


            total = total + secondNumber
            num = total#
            total = round(num)


            Color 14
            a = total

            Locate 4, 40: GoSub formato

            Print #1, "  ----"

            a = total
            Print #1, " # ";
            GoSub formatF
            Print #1, ""

            Color 7



        Else

            If operation$ = "-" Then

                Rem Resta


                Color 7
                Locate 5, 20: Input "N2"; secondNumber#
                num = secondNumber#
                secondNumber = round(num)

                Print #1, "-   ";
                a = secondNumber#
                GoSub formatF


                total = total - secondNumber
                num = total#
                total = round(num)


                Color 14
                a = total

                Locate 4, 40: GoSub formato

                Print #1, "  ----"

                a = total
                Print #1, " # ";
                GoSub formatF
                Print #1, ""

                Color 7

            Else

                If operation$ = "*" Then

                    Rem multiplicacion


                    Color 7
                    Locate 5, 20: Input "N2"; secondNumber#

                    num = secondNumber#
                    secondNumber = round(num)

                    Print #1, "*   ";
                    a = secondNumber#
                    GoSub formatF


                    total# = secondNumber * total
                    num = total#
                    If num > 10000000 Then total = 0
                    If num < 10000000 Then total = round(num)
                    If total = 0 Then Locate 4, 40: Print "limite"

                    Rem * multiplicacion

                    Color 14

                    a = total
                    Locate 4, 40: GoSub formato

                    If total = 0 Then Locate 4, 40: Print "limite Exc"

                    Print #1, "  ----"

                    a = total
                    Print #1, " # ";
                    GoSub formatF
                    Print #1, ""

                    Color 7

                Else

                    If operation$ = "/" Then

                        Rem division


                        Color 7
                        Locate 5, 20: Input "N2"; secondNumber#

                        num = secondNumber#
                        secondNumber = round(num)

                        Print #1, "/   ";
                        a = secondNumber#
                        GoSub formatF


                        If secondNumber = 0 Then

                            Color 4

                            Locate 7, 5: Print "No se puede dividir por 0"

                            Color 7

                        Else

                            total# = total / secondNumber
                            num = total#
                            total = round(num)



                            Rem / division

                        End If
                        a = total
                        Color 14
                        If secondNumber = 0 Then Locate 4, 40: Print "  "; 0
                        If secondNumber > 0 Then Locate 4, 40: GoSub formato


                        Print #1, "  ----"

                        a = total
                        Print #1, " # ";
                        GoSub formatF
                        Print #1, ""



                        Color 7

                    Else

                        5
                        If operation$ <> "t" Then Locate 7, 5: Print "debes seleccionar una operacion"

                    End If

                End If

            End If

        End If



        Sleep 1

        Cls

    Wend

    Color 6


    GoSub rectangulo
    GoSub operadores


    Color 12

    Locate 3, 40: Print "Total= "
    Locate 4, 40: GoSub formato

    Print #1, "  -----------"

    a = total
    Print #1, " Total= ";
    GoSub formatF
    Print #1, "  -----------"


    Color 7

    Locate 7, 6: Input "Nueva operacion (y - n)"; more
    Cls
    operation$ = ""
    moreNumbers = ""


    total = 0

    Rem Si no resteamos el total a 0

    Rem seguiremos sumadolo

Wend


Close #1


End

operadores:
Color 12
Locate 1, 5: Print "     "; Chr$(6); " Calculadora "; Chr$(6)
Color 7
Locate 4, 6: Print "(T)"
Color 12
Locate 4, 9: Print "(+)"

Locate 4, 12: Print "(-)"
Locate 4, 15: Print "(*)"
Locate 4, 18: Print "(/)"
Return



rectangulo:
Rem dibuja rectangulo
p1 = 20
p2 = 30
p3 = 90
p4 = 300
Line (p2, p1)-(p4, p1), 7
Line (p2, p3)-(p4, p3), 7
Line (p2, p1)-(p2, p3), 7
Line (p4, p1)-(p4, p3), 7


p1 = 20
p2 = 300
p3 = 90
p4 = 430
Line (p2, p1)-(p4, p1), 7
Line (p2, p3)-(p4, p3), 7
Line (p2, p1)-(p2, p3), 7
Line (p4, p1)-(p4, p3), 7

Return

formato: Rem subrutina que implementa los separadores de miles


If a <= 9999 Then GoTo fin1
If a <= 99999 Then GoTo fin2
If a <= 999999 Then GoTo fin3
If a <= 9999999 Then GoTo fin4
If a <= 99999999 Then GoTo fin5

fin1:
Print Using "#,###.##"; a
Return

fin2:
Print Using "##,###.##"; a
Return

fin3:
Print Using "###,###.##"; a
Return

fin4:
Print Using "#,###,###.##"; a
Return

fin5:
Print Using "##,###,###.##"; a
Return

formatF: Rem subrutina que implementa los separadores de miles en un archivo


If a <= 999 Then GoTo fn0
If a <= 9999 Then GoTo fn1
If a <= 99999 Then GoTo fn2
If a <= 999999 Then GoTo fn3
If a <= 9999999 Then GoTo fn4
If a <= 99999999 Then GoTo fn5

fn0:
Print #1, Using "###.##"; a
Return


fn1:
Print #1, Using "#,###.##"; a
Return

fn2:
Print #1, Using "##,###.##"; a
Return

fn3:
Print #1, Using "###,###.##"; a
Return

fn4:
Print #1, Using "#,###,###.##"; a
Return

fn5:
Print #1, Using "##,###,###.##"; a
Return


Function round# (num As Double) Rem funcion que  redondea a 2 los decimales
    'WARNING: USE "#" at the end of constant values,
    'or else you will get rounding errors:
    ' "num = .45"  >> "num = .449999988079071
    ' "num = .45#" >> "num = .45"
    dp = 2
    Dim exp1 As Long, num2 As Long
    exp1 = 10 ^ dp: num2 = num * exp1: round# = num2 / exp1

End Function

La función round redondea a dos los decimales de un número. (dp=2)




Calculadora Simple  (2021)
X
00 { 217-Byte Prgm }

01▸LBL "OPERA"

02 CLMENU

03 CLST

04 MENU

05 "1 Nro?"

06 PROMPT

07 STO 01

08 PRX

09 "2 Nro?"

10 PROMPT

11 STO 02

12 PRX

13 "+"

14 KEY 1 GTO 01

15 "-"

16 KEY 2 GTO 02

17 "*"

18 KEY 3 GTO 03

19 "/"

20 KEY 4 GTO 04

21 STOP

22 GTO "OPERA"

23▸LBL 01

24 "         +   "

25 RCL 01

26 RCL 02

27 +

28 ARCL ST X

29 ├"    ***"

30 AVIEW

31 STOP

32 GTO "OPERA"

33▸LBL 02

34 "         -   "

35 RCL 01

36 RCL 02

37 -

38 ARCL ST X

39 ├"    ***"

40 AVIEW

41 STOP

42 GTO "OPERA"

43▸LBL 03

44 "         *  "

45 RCL 01

46 RCL 02

47 ×

48 ARCL ST X

49 ├"   ***"

50 AVIEW

51 STOP

52 GTO "OPERA"

53▸LBL 04

54 "         /   "

55 RCL 01

56 RCL 02

57 ÷

58 ARCL ST X

59 ├"   ***"

60 AVIEW

61 STOP

62 GTO "OPERA"

63 END


El mismo programa en Quick Basic (QB64) (2022)




Cls Dim X As Double Dim O As String Dim Y As Double ENTER: Input "1 Numero"; X Input "Operacion (+, -, *, /)"; O Input "2 Numero"; Y If O = "+" Then Print X; "+"; Y; "=", X + Y ElseIf O = "-" Then Print X; "-"; Y; "=", X - Y ElseIf O = "*" Then Print X; "*"; Y; "=", X * Y ElseIf O = "/" Then Print X; "/"; Y; "=", X / Y Else Print "Incorrecto" End If GoTo ENTER




Otro Ejemplo de calculadora (2022)

Dim A, B, RESULT As Single, OP As String

ENTER:
Input "Nro:", A
Input "Nro:", B
Input "+ - *  / : ", OP

Select Case OP
    Case Is = "+"
        Print " SUMA "
        RESULT = A + B
        Print "RESULT = "; RESULT
    Case Is = "-"
        Print " RESTA "
        RESULT = A - B
        Print "RESULT = "; RESULT

    Case Is = "*"

        Print " MULTIPLICACION "
        RESULT = A * B
        Print "RESULT = "; RESULT

    Case Is = "/"

        Print " DIVISION "
        RESULT = A / B
        Print "RESULT = "; RESULT

    Case Else

        Print "INVALID OPERATOR "

End Select
GoTo ENTER
End




Calculadora simple usando las Funciones (2022)

Cls

Dim a As Double

Dim O As String

Dim b As Double

ENTER:

Input "1 Numero"; a

Input "Operacion (+, -, *, /)"; O

Input "2 Numero"; b



If O = "+" Then
    Print a; "+"; b; "=", suma(a, b)

ElseIf O = "-" Then
    Print a; "-"; b; "=", resta(a, b)

ElseIf O = "*" Then
    Print a; "*"; b; "=", multi(a, b)

ElseIf O = "/" Then
    Print a; "/"; b; "=", divide(a, b)

Else

    Print "Incorrecto"

End If

GoTo ENTER


Function suma (a, b)
    suma = a + b
End Function

Function multi (a, b)
    multi = a * b
End Function

Function resta (a, b)
    resta = a - b
End Function

Function divide (a, b)
    divide = a / b
End Function