domingo, 13 de marzo de 2016

Capitulo 8: Small Basic. Continuando con las condiciones. Parte 1

Diario de un programador.- Dia 18

Continuando con las condiciones...

En el capítulo anterior vi que el sistema de condiciones tiene un sistema de estructura algo así:
- Si una condición es verdadera, muestra un resultado.
Es muy común estar evaluando al menos dos valores, así como los ejemplos presentados en el capítulo anterior, donde se solicitaba ingresar la edad de una persona. Si la edad ingresada es mayor o igual a 18, entonces se mostraba el mensaje "Eres mayor de edad". Para evaluar el caso contrario, se volvió a escribir la instrucción if, pero esta vez para evaluar si la edad ingresada es menor a 18. En casos como estos, donde se evalúa un caso y luego se evalúa el caso contrario, existe una instrucción que permite el ahorrar un poco de código para no tener que escribir la instrucción if nuevamente. Esta instrucción se denomina "else" (de lo contrario) y se utiliza justamente para evaluar un caso contrario. La instrucción else, no hace nada nuevo, simplemente permite abreviar en cierta forma, otra instrucción if.
Siguiendo el ejemplo del programa para la mayoría de edad. Con la instrucción else, quedaría de la siguiente manera:

TextWindow.Write("Cual es tu edad? ")
edad = TextWindow.ReadNumber()
If edad >= 18 Then
  TextWindow.WriteLine("Eres mayor de edad")
Else
  TextWindow.WriteLine("Eres menor de edad")
EndIf

Como se puede apreciar, al escribir else, se acortó la cantidad de código en el programa y al ejecutarlo, hace exactamente lo mismo. Cabe destacar, que para poder ocupar la instrucción else, debe haber una instrucción if que lo preceda y esta instrucción else, dependerá directamente de la instrucción if más cercana que lo precede.

Diario de un programador.- Dia 19

Voy a tratar de mejorar un poco el programa anterior para controlar que la edad ingresada no sea un número muy alto o muy bajo, ya que sería un tanto ilógico si se ingresa 500 como una edad válida. Veré si resulta esto.... Bueno, después de algunos minutos, logré esta alternativa de código que realiza lo que estaba buscando, o sea que al ingresar un número muy grande o negativo, muestra su respectivo mensaje y de paso hace algo nuevo, vuelve a solicitar que ingrese un valor válido. Para lograr que repita esa acción, utilicé la súper menospreciada instrucción "goto" (ir a) Es tan menospreciada esta instrucción que muchos lenguajes de programación no la permiten (más información aquí) En resumidas cuentas, lo que hace esta instrucción es ir o trasladar el flujo del programa, hasta la línea indicada por una marca o etiqueta. Logrando con ello, que se produzcan grandes saltos, tanto hacia adelante como hacia atrás en lo referente a las líneas de código, por ejemplo, si el programa va ejecutando la línea 50 de su código y una instrucción goto le indica que "salte" a la línea 5, entonces el programa seguirá su curso o flujo en la línea 5, de igual forma si se le indica que "salte" o se traslade a otra línea más adelante dentro del programa. Esta facilidad para trasladarse dentro del programa, le dio en parte su mala fama, debido a que en programas más grandes, como de cinco mil o cien mil líneas, se complicaba enormemente el estar siguiendo todos esos saltos que pudiese tener al momento de realizar una mantención al código. Bueno, como estoy aprendiendo a codificar, no me puedo permitir el dejar fuera cualquier alternativa que me pueda servir en algún momento y aunque he leído que no debo usar el goto, haré caso omiso a esas recomendaciones, aunque si debo reconocer que no lo usaré muy seguido, quizás para no formar un mal hábito. 
El código es el siguiente:

inicio:
TextWindow.Write("Cual es tu edad? ")
edad = TextWindow.ReadNumber()
If edad >= 18 Then
  If edad >=120 Then
    TextWindow.WriteLine("La edad ingresada es muy alta")
    Goto inicio
  EndIf
  TextWindow.WriteLine("Eres mayor de edad")
Else
  If edad < 0 Then
    TextWindow.WriteLine("La edad no puede ser un numero negativo")
    Goto inicio
  EndIf 
  TextWindow.WriteLine("Eres menor de edad")
EndIf

Este código, si es ejecutado, hace lo mismo que el anterior, a diferencia que si coloco un dato que no corresponde (edad) entonces me volverá a solicitar que ingrese la edad.
En la primera línea se encuentra la etiqueta a la cual apunta la instrucción "goto", esta etiqueta puede ser un nombre cualquiera, es solo un identificador, pero por sintaxis debe terminar en dos puntos ":" Los dos puntos es lo que la diferencia de una variable, de no llevar esos puntos, el programa "pensaría" que en vez de ser una etiqueta, se trata de una variable. Al colocar la etiqueta en la primera línea, lo que digo o estoy tratando de decir es que el programa debe continuar desde aquí cuando llegue a la instrucción goto correspondiente. Al colocar la etiqueta en la primera línea, es lo que permite que el programa vuelva a solicitar nuevamente los datos.
En esta parte del código hay algo nuevo...

If edad >= 18 Then
  If edad >=120 Then
    TextWindow.WriteLine("La edad ingresada es muy alta")
    Goto inicio
  EndIf


Aquí se pude ver una instrucción if dentro de otra instrucción if, a esta situación se le conoce como "anidar" o sea que la instrucción If edad >=120 Then está anidada o dentro de la instrucción if anterior. Al principio me costó bastante entender eso de las anidaciones, pero con un poco de práctica y leer varias veces las descripciones, fui entendiendo bien este asunto. La gracia de todo esto es que, al estar anidada, esta instrucción se ejecutará unicamente si la instrucción anterior (if edad >= 18 then) es verdadera. O sea que primero se tiene que cumplir que la edad ingresada sea mayor o igual a 18, si eso es así, entonces la siguiente línea evalúa si la edad es mayor o igual a 120, si esto ocurre, entonces se ejecuta la línea siguiente que dice que la edad es muy alta. Si se ejecutó esta línea, significa que la edad fue un número igual o superior a 120, por lo que se ejecutará la linea siguiente, la que contiene la instrucción goto...



If edad >=120 Then

    TextWindow.WriteLine("La edad ingresada es muy alta")

    Goto inicio

EndIf

Recordar que se ejecutará todo lo que se encuentre entre el if y el endIf (aunque con el goto, pueden haber excepciones, ya lo explicaré) la instrucción goto va seguida de su etiqueta, en este caso estoy diciendo "ve a donde se encuentra la etiqueta inicio" con esto logro que el programa se vuelva a iniciar ya que de esta forma obligo al usuario a ingresar un número válido. Aprovecharé de explicar el por qué de las "excepciones con goto". Mira el siguiente ejemplo...

If edad >=120 Then
    TextWindow.WriteLine("La edad ingresada es muy alta")
    Goto inicio
    TextWindow.WriteLine("Esta linea no se lee :(")        
EndIf

La línea que contiene el goto, hace que el programa "salte" inmediatamente hacia la línea que contiene la etiqueta, ignorando lo que hay después del goto, en este caso, la línea siguiente ("Esta linea no se lee :(") nunca se mostrará en pantalla

Diario de un programador.- Dia 20

En la segunda parte del código tengo la instrucción else ("de lo contrario")
Else
  If edad < 0 Then
    TextWindow.WriteLine("La edad no puede ser un numero negativo")
    Goto inicio
  EndIf 
  TextWindow.WriteLine("Eres menor de edad")
EndIf

Aquí coloco la condición para que no acepte números negativos en el ingreso de edad (if edad < 0 then) Si esto ocurre, entonces se muestra el mensaje "La edad no puede ser un número negativo" y posteriormente la instrucción goto realiza un salto al inicio del programa.



Gustavo J. Cerda Nilo

Julio 2015. Última modificación, Marzo 2016

No hay comentarios:

Publicar un comentario

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