Programando una
calculadora en Small Basic
En esta
oportunidad se programará una calculadora en el lenguaje Small Basic. Esta será
una calculadora sencilla, que trabajará con números enteros y decimales. Entre
sus funciones, se contará con la posibilidad de realizar las cuatro operaciones
básicas, vale decir, suma, resta,
multiplicación y división. Se maneja principalmente con el mouse, haciendo clic
en cada uno de los botones u operaciones.
El aspecto final
de esta sencilla aplicación es el siguiente:
Lo primero que
se realizó fue el diseño de su interfaz. En la cual se configuró el tamaño de
la pantalla, el color de fondo, los bordes blancos, los botones, el cuadro de
texto y se eliminó el botón de maximizar / minimizar.
La mayor parte
del código está comentado y no es necesario detenerse a explicar mucho en esta
parte. Lo primero que se agregó a la interfaz, fue lo siguiente:
'tamaño ventana
GraphicsWindow.Width = 225
GraphicsWindow.Height = 310
'color de fondo
GraphicsWindow.BackgroundColor = "blue"
'borde del teclado
GraphicsWindow.PenColor = "white"
GraphicsWindow.DrawRectangle(35,90,160,205)
'borde exterior
GraphicsWindow.DrawRectangle(15,15,200,295)
'boton de maximizar
GraphicsWindow.CanResize = "no"
'visor de numeros
caja = Controls.AddTextBox(35,50)
El código anterior, al compilarlo, nos muestra lo siguiente:
Lo siguiente es
agregar los botones. Estos corresponden a los números, las operaciones
matemáticas y un botón que permite borrar el contenido en la pantalla. El
código es el siguiente:
'numeros del teclado
uno = Controls.AddButton("1",60, 100)
dos = Controls.AddButton("2",90,100)
tres = Controls.AddButton("3",120,100)
cuatro = Controls.AddButton("4",60,140)
cinco = Controls.AddButton("5",90,140)
seis = Controls.AddButton("6",120,140)
siete = Controls.AddButton("7",60,180)
ocho = Controls.AddButton("8",90,180)
nueve = Controls.AddButton("9",120,180)
cero = Controls.AddButton("0",60,220)
punto = Controls.AddButton(".",90,220)
'operadores matematicos
sumar = Controls.AddButton("+",150,100)
restar = Controls.AddButton("- ",150,140)
multiplicar = Controls.AddButton("*",150,180)
dividir = Controls.AddButton("/",150,220)
igual = Controls.AddButton("=",120,220)
'boton borra numeros
limpiar = Controls.AddButton("C",60,260)
Con esto agregado a la interfaz, la aplicación consigue su
apariencia final:
Ahora viene la
parte lógica del programa, esa que permite que al presionar algún botón se
active un evento que esté relacionado con dicho botón.
Lo primero es
crear un evento que se genere al presionar un botón. Esto lo dejé de la siguiente
manera:
'evento del boton
Controls.ButtonClicked = boton
Lo
siguiente que agregué fueron cuatro variables que utilicé como variables
auxiliares. Estas me permiten saber qué operación fue seleccionada (suma,
resta, multiplicación, división) y son utilizadas en el evento del botón igual
(=). Al explicar el botón igual, se entenderá mejor la finalidad de estas
variables.
'variable auxiliar para saber cual fue el operador utilizado
operadorSuma = 0
operadorResta = 0
operadorMultiplica = 0
operadorDivide = 0
Lo
siguiente, fue agregar la subrutina relacionada a los botones, que generarán
distintos eventos según qué botón sea presionado. Lo que hace esta subrutina,
es llamar a otra subrutina relacionada
con el botón que fue presionado. Por ejemplo, si se presiona el botón 1, se
llamará a una subrutina que maneja el evento del botón 1, la cual hace que se
imprima el número 1 en el cuadro de texto.
'condiciones del boton
Sub boton
ultimo_boton =
Controls.LastClickedButton
If ultimo_boton
= uno Then
boton1()
ElseIf ultimo_boton = dos then
boton2()
ElseIf ultimo_boton = tres then
boton3()
ElseIf ultimo_boton = cuatro then
boton4()
ElseIf ultimo_boton = cinco then
boton5()
ElseIf ultimo_boton = seis then
boton6()
ElseIf ultimo_boton = siete then
boton7()
ElseIf ultimo_boton = ocho then
boton8()
ElseIf ultimo_boton = nueve then
boton9()
ElseIf ultimo_boton = cero then
boton0()
ElseIf ultimo_boton = punto then
decimal()
ElseIf ultimo_boton = limpiar then
botonLimpiar()
ElseIf ultimo_boton = sumar then
suma()
ElseIf ultimo_boton = restar then
resta()
ElseIf ultimo_boton = multiplicar then
multiplica()
ElseIf ultimo_boton = dividir then
divide()
ElseIf ultimo_boton = igual then
botonIgual()
EndIf
EndSub
Lo que se
agregó a continuación, son las subrutinas que manejan las instrucciones de cada
botón. Los números serán mostrados en el cuadro de texto, mientras que las
operaciones realizarán cálculos con ellos.
Se podrá notar, que no solamente puse un control SetTextBoxText(que
sirve para mostrar texto en un cuadro de texto), sino que también puse un
control GetTextBoxText(para recuperar el texto de un cuadro de texto) y un
Text.Append. La idea de poner esas instrucciones es lograr que cada vez que se
presione el botón, el número se agregue a continuación del número que ya fue
ingresado. Por ejemplo, al presionar el botón 1, el contenido del cuadro de
texto quedará almacenado en la variable "contenido_caja", en este
caso no hay nada en el cuadro de texto, por lo que se almacena una cadena
vacía. Luego tenemos una variable llamada número, cuyo valor es 1 y por último,
lo que hacemos es agregar al cuadro de texto, lo concatenado por la instrucción
Text.Append (en este caso es la cadena vacía y el contenido de la variable),
esto mostrará en el cuadro de texto el número 1. Entonces, si se presiona
nuevamente el botón 1, el contenido del cuadro de texto, será nuevamente
concatenado y como ahora no hay una cadena vacía sino que existe el número 1,
se formará el número 11. De esta misma forma funciona para los demás números.
Las
subrutinas de los botones numéricos quedaron de la siguiente forma:
'subrutinas del boton numerico
Sub boton1
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"1"
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
Sub boton2
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"2"
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
Sub boton3
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"3"
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
Sub boton4
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"4"
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
Sub boton5
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"5"
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
Sub boton6
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"6"
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
Sub boton7
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"7"
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
Sub boton8
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"8"
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
Sub boton9
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"9"
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
Sub boton0
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"0"
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
Sub decimal
contenido_caja =
Controls.GetTextBoxText(caja)
numero =
"."
Controls.SetTextBoxText(caja,Text.Append(contenido_caja,numero))
EndSub
La siguiente
subrutina que se agregó, fue una que permita que el contenido del cuadro de
texto fuese borrado. Esta es la función del botón "C". Para borrar el
contenido, simplemente fue reemplazado por una cadena vacía.
'subrutina boton borrar
Sub botonLimpiar
Controls.SetTextBoxText(caja, "")
EndSub
Lo
siguiente, fue agregar las subrutinas correspondientes a las operaciones. Lo
que hacen cada una de estas operaciones, es obtener el primer número ingresado
por el usuario, el cual se almacena en la variable "operador1". Una
vez que se obtiene ese dato, se borra el cuadro de texto para dar paso al
ingreso del segundo número y por último, activa la variable auxiliar para
indicar cuál es la operación que fue seleccionada. Como se puede observar,
estos botones no hacen la operación seleccionada, simplemente guardan un valor
e indican que han sido seleccionadas (por la variable auxiliar). Las
subrutinas son las siguientes:
'subrutina boton operaciones
Sub suma
operador1 =
Controls.GetTextBoxText(caja)
Controls.SetTextBoxText(caja, "")
operadorSuma =
1 'activo
EndSub
Sub resta
operador1 =
Controls.GetTextBoxText(caja)
Controls.SetTextBoxText(caja, "")
operadorResta =
1 'activo
EndSub
Sub multiplica
operador1 =
Controls.GetTextBoxText(caja)
Controls.SetTextBoxText(caja, "")
operadorMultiplica = 1 'activo
EndSub
Sub divide
operador1 =
Controls.GetTextBoxText(caja)
Controls.SetTextBoxText(caja, "")
operadorDivide =
1 'activo
EndSub
Por
último, la subrutina que se agregó a continuación, es la del botón
"igual". Este botón es el que realiza la operación, según cuál
variable auxiliar esté activa. Por ejemplo. Este botón será seleccionado,
cuando el usuario haya ingresado el segundo valor (recordar que primero el
usuario ingresó un número, luego presionó un botón de operación y el cuadro de
texto fue borrado esperando el ingreso del segundo número.) Volviendo al
ejemplo, supongamos que el usuario ingresó en primera instancia el número 1,
luego presionó el signo + el cual almacenó ese número y borró la pantalla para
que ingrese el segundo número. Supongamos que luego el usuario ingresó un 2 y
posteriormente presionó el botón =. Lo que hace este botón es ver cual variable
auxiliar está activa, como el usuario presionó el botón +, la variable
operadorSuma ahora tiene un valor de 1, por lo que se cumple la primera condición
(if operadorSuma = 1 then), luego se guarda el número ingresado por el usuario
en la variable operador2, posteriormente el valor de operador1 sumado a
operador2 es guardado en la variable "total", seguido a esto, se
borra el contenido del cuadro de texto y se muestra el resultado de la suma.
Por último la variable auxiliar es reseteada a cero para que no quede activa
luego de terminar la operación. Este mismo procedimiento es llevado a cabo con
las demás operaciones. Las subrutinas son las siguientes:
Sub botonIgual
If operadorSuma
= 1 Then
operador2 = Controls.GetTextBoxText(caja)
total = operador1 + operador2
Controls.SetTextBoxText(caja, "")
Controls.SetTextBoxText(caja, total)
operadorSuma
= 0 'resetea
EndIf
If operadorResta
= 1 Then
operador2 = Controls.GetTextBoxText(caja)
total = operador1 - operador2
Controls.SetTextBoxText(caja, "")
Controls.SetTextBoxText(caja, total)
operadorResta
= 0 'resetea
EndIf
If operadorMultiplica
= 1 Then
operador2 = Controls.GetTextBoxText(caja)
total = operador1 * operador2
Controls.SetTextBoxText(caja, "")
Controls.SetTextBoxText(caja, total)
operadorMultiplica
= 0 'resetea
EndIf
If operadorDivide
= 1 Then
operador2 = Controls.GetTextBoxText(caja)
total = operador1
/ operador2
Controls.SetTextBoxText(caja, "")
Controls.SetTextBoxText(caja, total)
operadorDivide
= 0 'resetea
EndIf
EndSub
Esto es todo, una calculadora es un
programa sencillo que enseñan a programar en la mayoría de las casas de
estudio. Espero que esta guía le sirva a más de alguno. Saludos.
El código para importar este programa es el siguiente:
JJW694
Para ver el programa funcionando en versión web, la
dirección es la siguiente (requiere Microsoft Silverlight)
http://smallbasic.com/program/?JJW694
Gustavo J. Cerda Nilo
Diciembre 2017