lunes, 25 de diciembre de 2017

Small Basic: Programando una calculadora



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

C++ El apuntador This

El apuntador This En C++, cada objeto tiene acceso a su propia dirección a través de un puntero o apuntador denominado This. Lo...