contador1 = 4 contador2 = 15 If contador1 < 10 Then MsgBox "El contador1 es menor que 10" Else MsgBox "El contador1 es mayor o igual a 10" End If If contador2 < 10 Then MsgBox "El contador2 es menor que 10" Else MsgBox "El contador2 es mayor o igual a 10" End If End Sub
'****************************************************************** 'Nombre: seleccion4.frm 'Descripcion: El siguiente programa muestra la utilizacion de ' la estructura IF THEN ELSE en forma minima 'Tipo: El programa es bsico de SENTENCIAS DE SELECCION '***************************************************************** Private Sub Form_Load() Dim contador1, contador2 As Integer C1 = 4 C2 = 15 If C1 < 10 Then If C2 < 10 Then MsgBox "C1 y C2 < 10" Else MsgBox "C1<10 y C2>=10" Else If C2 < 10 Then MsgBox "C1>=10 y C2<10" Else MsgBox "C1>=10 y C2>=10" End If End Sub Aclaremos que la versin mnima de la estructura IF-THEN-ELSE-END IF para una sola lnea es: IF THEN ELSE Y el END IF no se coloca. No es necesario colocarlo, es ms, incluso de llegarse a colocar generara un error de sintaxis.
CLAUSULA ELSEIF
En ocasiones, dada una estructura IF -THEN -ELSE- END IF, se realizan anidamientos de la siguiente manera: IF THEN ELSE IF THEN ELSE END IF END IF Y sucede que la anterior estructura puede ser escrita de la siguiente manera: IF THEN ELSEIF ELSE END IF En donde si se fija el amigo lector / estudiante, se ha suprimido una clusula END IF y esto se debe bsicamente a que el if fue pegado al else y a pesar de seguir comportndose como IF THEN ELSE, no es posible finalizarlo en un END IF. Ahora bien,supongamos que unimos este ltimo ELSE, con otro if, dando lugar a una estructura como la siguiente: IF THEN ELSEIF ELSEIF ELSE END IF Esta estructura sigue siendo correcta pero puede prestarse para confusiones. De todas formas hay cosas que cabe mencionar en esta estructura: No es posible agregar otro ELSE, pues el compilador no sabra con cual cerrarlo No es posible agregar otro END IF, pues tampoco se sabra con cual cerrarlo.
THEN
THEN THEN
Para no ir ms lejos, veamos el siguiente ejercicio que aclara esta estructura: '****************************************************************** 'Nombre: seleccion5.frm 'Descripcion: El siguiente programa muestra la utilizacion de ' la estructura IF THEN ELSE en forma minima 'Tipo: El programa es bsico de SENTENCIAS DE SELECCION '***************************************************************** Private Sub Form_Load() Dim calificacion As Integer calificacion = 3 If calificacion > 4 Then MsgBox "Calificacion excelente" ElseIf calificacion > 3 Then MsgBox "Calificacion buena" ElseIf calificacion > 2 Then MsgBox "Calificacion aceptable" Else MsgBox "Calificacion mala" End If End Sub Para terminar con la explicacin del anterior programa, a continuacin se muestra una tabla en la que se muestra vara diversos valores de la variable calificacin, los diversos mensajes que imprimira el programa anterior. Valor de la calificacin Calificacin = 1 Calificacin = 2 Calificacin = 3 Calificacin = 4 Calificacin = 5 variable Resultado mostrado programa Calificacin mala Calificacin mala Calificacin aceptable Calificacin buena Calificacin excelente por el
Private Sub Form_Load() Dim calificacion As Integer calificacion = 3 Select Case calificacion Case 1 MsgBox "Le fue muy mal" Case 2 MsgBox "le fue mal pero no tanto" Case 3 MsgBox "paso raspando" Case 4 MsgBox "le fue bien" Case 5 MsgBox "Le fue muy bien" Case Else MsgBox "No tiene nota valida" End Select End Sub
Tengamos en cuenta que la instruccin SELECT CASE, no necesariamente funciona con valores fijos y nicos, sino que tambin puede ser utilizada para establecer rangos de valores, tal como se muestra en el siguiente ejercicio:
'****************************************************************** 'Nombre: seleccion7.frm 'Descripcion: El siguiente programa muestra la utilizacin de ' la estructura SELECT CASE 'Tipo: El programa es bsico de SENTENCIAS DE SELECCION '***************************************************************** Private Sub Form_Load() Dim calificacion As Double calificacion = 4.5 Select Case calificacion Case Is < 1 MsgBox "Le fue pesimamente" Case 1 To 1.99 MsgBox "le fue muy mal " Case 2 To 2.99 MsgBox "le fue mal" Case 3 To 3.99 MsgBox "es una nota aceptable" Case 4 To 4.5 MsgBox "Le fue bien" Case 4.5 To 5
MsgBox "Le fue excelentemente" Case Else MsgBox "No tiene nota valida" End Select End Sub Y con el nimo del lograr la mejor comprensin de estos temas por parte del amigo estudiante / lector, a continuacin se muestran los resultados que arrojara el anterior programa si se hubieran dados los siguientes valores a la variable calificacion: Veamos: Valor de la calificacin Calificacin = 1 Calificacin = 1.5 Calificacin = 2 Calificacin = 2.5 Calificacin = 3 Calificacin = 3.5 Calificacin = 4 Calificacin = 4.5 Calificacin = 4.6 Calificacin = 5 variable Resultado mostrado programa Le fue muy mal Le fue muy mal Le fue mal Le fue mal Es una nota aceptable Es una nota aceptable Le fue bien Le fue bien Le fue excelentemente Le fue excelentemente por el
Cabe mencionar que en la estructura SELECT CASE, solamente se ejecuta una condicin como mximo y esa es la razn por la cual en nuestro ejercicio se ejecuta el caso: Case 4 To 4.5 Y el siguiente caso que tambin cumple la condicin, ya no se ejecuta, es decir el siguiente cdigo Case 4.5 To 5 A pesar de cumplir la condicin no se ejecuta por haberse ejecutado ya un caso que cumple la condicin.
Para lograr ejemplificar lo expuesto, a continuacin se presenta un ejercicio en el que se utiliza la instruccin is, dentro de una funcin case. Veamos: '****************************************************************** 'Nombre: seleccion8.frm 'Descripcion: El siguiente programa muestra la utilizacion de ' la estructura SELECT CASE 'Tipo: El programa es bsico de SENTENCIAS DE SELECCION '***************************************************************** Private Sub Form_Load() Dim nota As Double nota = 1 Select Case nota Case Is < 0 MsgBox "Nota por debajo de lo valido" Case 1, 3, 5 MsgBox "Nota valida e impar" Case Is = 0 MsgBox "La nota es cero" Case 2, 4 MsgBox "Nota valida y par" Case Is > 5 MsgBox "Nota por encima de lo valido" Case Else MsgBox "La nota no debe tener decimales" End Select End Sub A continuacin se muestra una tabla en la que se pueden apreciar los mensajes que muestra el programa anterior, suponiendo que la variable nota toma diversos valores. Veamos: Asignacin a variable nota -1 0 0.5 1 Mensaje producido por el programa Nota por debajo de lo valido La nota es cero La nota no debe tener decimales Nota valida e impar
2 3 4 5 6
Nota valida y par Nota valida e impar Nota valida y par Nota valida e impar Nota por encima de lo valido
Tengamos en cuenta que en el programa anterior se utilizo una sentencia como: Case 2,4 Para comparar con dos valores de una sola vez a la variable. Es decir que separando los valores por comas (,) es posible hacer varias comparaciones con valores constantes sin necesidad de tener que repetir otro case con cada nmero que se va a comparar.
ESTRUCTURAS DE ITERACIN
Las estructuras de iteracin son estructuras que ejecutan una o ms veces un conjunto de sentencias (o una sentencia) un nmero determinado de veces, hasta que se cumpla una condicin, mientras se cumpla una condicin o hasta que se den ciertas circunstancias que obliguen a no ejecutar por ms tiempo dichas instrucciones. Recordemos que las estructuras de seleccin ejecutaban un bloque de instrucciones determinado una vez o nunca, dependiento del cumplimiento de una condicin previamente establecida.
End Sub
Pues bien, todos estos problemas son sencillamente solucionados por Visual Basic con la implementacin de colecciones (que se escriben Collection). La forma de declarar un objeto de tipo Collection es la siguiente: Dim coleccion As New Collection En donde la variable coleccin es de tipo Collection y los elementos a dicha coleccin se pueden aadir de la siguiente manera: coleccion.Add "Uno" coleccion.Add "Dos" coleccion.Add "Tres" y para referirse al primer elemento insertado en dicha coleccin, se hace de la siguiente manera: coleccion.Item(1) y para eliminar un elemento de la coleccin se hace as:
coleccion.Remove (2) Bueno, pero con el fin de mostrarle a usted amigo lector / estudiante un programa completo que trabaje estos conceptos a continuacin se muestra un programa que maneja las colecciones. Veamos: '****************************************************************** 'Nombre: coleccion1.frm 'Descripcion: El siguiente programa muestra la utilizacion de ' colecciones, la adicin y eliminacin de elementos a las mismas 'Tipo: El programa es de COLECCIONES '***************************************************************** Option Base 1 Private Sub Form_Load() Form1.AutoRedraw = True Dim coleccion As New Collection coleccion.Add "Uno" coleccion.Add "Dos" coleccion.Add "Tres" Print coleccion.Item(1) Print coleccion.Item(2) Print coleccion.Item(3) coleccion.Remove (2) Print coleccion.Item(1) Print coleccion.Item(2) 'Print coleccion.Item(3) Generaria error End Sub Bien y ahora usted se estar preguntando: No estamos hablando acaso de la estructura FOR- EACH NEXT y qu relacin hay con las colecciones?. Pues la respuesta es bien sencilla: La estructura FOR- EACH NEXT, se cre con el fin de poder mostrar los elementos de una coleccin, sin tener necesidad de saber de antemano el nmero de elementos de dicha coleccin. En el siguiente programa de ejemplo, se muestra el uso de la estructura FOR- EACH NEXT para mostrar elementos de las colecciones y adems se muestra la forma de aadir un elemento al final o aadirlo antes de una posicin especificada. Veamos:
'****************************************************************** 'Nombre: for2.frm 'Descripcion: El siguiente programa muestra la utilizacion de ' la estructura FOR EACH NEXT y de las colecciones 'Tipo: El programa es bsico de ESTRUCTURAS DE ITERACIN y ' manejo del objeto COLLECTION '***************************************************************** Option Base 1 Private Sub Form_Load() Form1.AutoRedraw = True Dim coleccion As New Collection Dim refer_coleccion Dim contador As Integer For contador = 1 To 5 coleccion.Add CStr(contador * contador), CStr(contador) Next Print "Coleccion antes de borrar elementos" For Each refer_coleccion In coleccion Print refer_coleccion Next refer_coleccion coleccion.Remove (5) coleccion.Remove (2) Print "Coleccion despues de borrar elementos" For Each refer_coleccion In coleccion Print refer_coleccion Next refer_coleccion coleccion.Add "Textico2", "5", 3 Print "Coleccion despues de aadir un textico2" For Each refer_coleccion In coleccion Print refer_coleccion Next refer_coleccion End Sub
En donde el formato para insertar en un objeto collection es: Objeto_colection.Add Item, key, before, after Y en donde
Nombre del Argumento de la Significado de dicho argumento propiedad Add del objeto Collection Item el contenido de lo que se va a colocar en el elemento de la coleccin Key un identificador opcional para distinguir este elemento Before especifica la posicin antes de la cual se va a colocar el elemento After especifica la posicin despus de la cual se va a colocar el elemento Nota: Los argumentos Befores y After son exluyentes, lo que quiere decir que si se especifica un valor para Befores, no de debe especificarse un valor para After y viceversa, si se especifica un valor para After, no debe especificarse un valor para Befores.
End Sub
Observemos en el programa anterior que una vez se ejecuta un ciclo de iteraciones hasta que se cumple por primera vez la condicin, nunca ms se vuelve a ejecutar el ciclo, debido a que al evaluar la condicin, sta se cumple y por tanto se sale del ciclo de iteracin DO UNTIL LOOP. Para mayor comprensin del tema tratado, a continuacin se muestra un posible resultado del programa anterior(se dice que es un posible resultado, debido a que se utiliza una funcin aleatoria que hace de los resultados del programa un conjunto distinto por cada vez que se ejecuta el mismo) Dado1: 4 Dado2: 1 Dado1: 5 Dado2: 4 Dado1: 3 Dado2: 2 Dado1: 4 Dado2: 3 Dado1: 6 Dado2: 6 Dado1: 2 Dado2: 1 Dado1: 2 Dado2: 4 Dado1: 3 Dado2: 4 Dado1: 4 Dado2: 5 Dado1: 4 Dado2: 3 Dado1: 3 Dado2: 6 Dado1: 3 Dado2: 3
FIN DEL CICLO NUNCA MS SE VUELVE A EJECUTAR LAS SENTENCIAS Por lo tanto, si el usuario vuelve a presionar el botn de comando, el programa sacar el siguiente resultado: FIN DEL CICLO Por cada vez que vuelva a presionar dicho botn (exceptuando como hemos dicho la primera vez que ejecuta el botn de comando). CICLO DO LOOP - UNTIL Esta estructura de iteracin es similar a la estructura DO UNTIL - LOOP, con la diferencia que primero se ejecuta el bloque de instrucciones(o la instruccin) y posteriormente se evala la condicin. En caso de cumplirse la condicin se sale del ciclo. Para mayor comprensin, veamos pues el ejemplo: '****************************************************************** 'Nombre: do2.frm 'Descripcion: El siguiente programa muestra como utilizar ' el ciclo DO - UNTIL - LOOP 'Tipo: El programa es de ESTRUCTURAS DE ITERACIN '***************************************************************** Option Explicit Dim Dado1, Dado2 As Integer Private Sub Command1_Click() Do Dado1 = Int(6 * Rnd + 1)
Dado2 = Int(6 * Rnd + 1) Print "Dado1: " & CStr(Dado1) & "Dado2: " & CStr(Dado2) Loop Until Dado1 = 3 And Dado2 = 3 Print "FIN DEL CICLO" End Sub En este ejercicio a diferencia del anterior, siempre se va a ejecutar como mnimo una vez el bloque de sentencias y posteriormente se evala la condicin. En caso de cumplirse se sale del ciclo, pero es importante recordar que por lo menos una sola vez se garantiza la ejecucin del grupo de sentencias incluidas en esta estructura de iteracin. A continuacin se muestra un posible resultado de la ejecucin del anterior programa. Veamos: Dado1: 1 Dado2: 4 Dado1: 4 Dado2: 5 Dado1: 2 Dado2: 3 Dado1: 4 Dado2: 3 FIN DEL CICLO Si el usuario vuelve a presionar el botn de comando, el programa ejecuta otra vez el ciclo y puede generar otro resultado como el siguiente: Dado1: 4 Dado2: 1 Dado1: 3 Dado2: 2 Dado1: 4 Dado2: 3 FIN DEL CICLO Y en general como se mencionado anteriormente, est garantizada la ejecucin por lo menos una vez de las sentencias incluidas en la estructura de iteracin. Dado1: 6 Dado2: 6 Dado1: 2 Dado2: 4 Dado1: 3 Dado2: 4 Dado1: 4 Dado2: 5 Dado1: 3 Dado2: 6 Dado1: 3 Dado2: 3 Dado1: 4 Dado2: 6 Dado1: 1 Dado2: 1 Dado1: 3 Dado2: 5 Dado1: 3 Dado2: 5 Dado1: 4 Dado2: 5 Dado2: 4 Dado2: 2 Dado1: 5 Dado2: 6 Dado1: 3 Dado2: 3
USO DE EXIT DO
Es interesante observar que no slo es posible basarnos en una condicin para salir de un ciclo de iteracin como el DO WHILE, sino que tambin podemos utilizar alguna condicin de seleccin incorporada en el grupo de sentencias del ciclo, de tal suerte que cuando se cumpla, tambin se salga del ciclo de iteracin. Veamos pues el ejercicio para comprender mejor este concepto:
'****************************************************************** 'Nombre: do3.frm 'Descripcion: El siguiente programa muestra como utilizar ' el ciclo DO - UNTIL - LOOP y la sentencia ' EXIT DO para abortar el ciclo de iteracin 'Tipo: El programa es de ESTRUCTURAS DE ITERACIN '***************************************************************** Option Explicit Dim Dado1, Dado2 As Integer Private Sub Command1_Click() Do Dado1 = Int(6 * Rnd + 1) Dado2 = Int(6 * Rnd + 1) If Dado1 = 2 And Dado2 = 4 Then Print "Dado1= " & CStr(Dado1) & "Dado2= " & CStr(Dado2) Exit Do End If Print "Dado1: " & CStr(Dado1) & "Dado2: " & CStr(Dado2) Loop Until Dado1 = 2 And Dado2 = 4 Print "FIN DEL CICLO" End Sub A continuacin se muestra un posible resultado del programa anterior: Dado1: 4 Dado2: 5 Dado1: 3 Dado2: 6 Dado1= 3 Dado2= 3 Observemos que una vez se cumpla dicha condicin el programa ejecuta las sentencias incluidas en la estructura de seleccin IF - THEN - END IF, pero cuando se estn ejecutando dichas sentencias incluidas en esta estructura el programa ejecuta la sentencia: EXIT DO La cual tiene por objetivo salir del ciclo DO - LOOP en forma inmediata, con lo cual ya no se ejecuta la siguiente sentencia que se encuentra despus del IF THEN - END IF (es decir la sentencia: Print "Dado1: " & CStr(Dado1) & "Dado2: " & CStr(Dado2)). Ahora bien, la sentencia EXIT DO, no solamente sale del ciclo de iteracin, sino que aparte de todo contina la ejecucin del programa a partir de la sentencia que se encuentre inmediatamente despus de la palabra LOOP. Con lo anterior, podemos concluir que si el ciclo de iteracin DO - LOOP, se encuentra anidado en otro ciclo DO - LOOP y el ciclo interno ejecuta la sentencia EXIT DO, se pasa el control del programa un nivel arriba del bucle interno y en
general la sentencia EXIT DO transfiere el control del programa un nivel arriba, cuando se trata de bucles anidados. Con todo lo anteriormente mencionado, es importante tener en cuenta que si a un ciclo de iteracin tipo DO LOOP, no se le coloca la instruccin UNTIL, pero se tiene en cuenta la instruccin EXIT DO, colocada de tal suerte que acte abortando el ciclo en algn momento, es posible eliminar la sentencia UNTIL. Para comprender mejor lo anteriormente expuesto, veamos el siguiente programa que no es ms que el programa que venimos trabajando en este apartado del ejercicio eliminndole la sentencia UNTIL: '****************************************************************** 'Nombre: do4.frm 'Descripcion: El siguiente programa muestra como utilizar ' el ciclo DO - LOOP sin UNTIL y con la sentencia ' EXIT DO para abortar el ciclo de iteracin 'Tipo: El programa es de ESTRUCTURAS DE ITERACIN '***************************************************************** Option Explicit Dim Dado1, Dado2 As Integer Private Sub Command1_Click() Do Dado1 = Int(6 * Rnd + 1) Dado2 = Int(6 * Rnd + 1) If Dado1 = 2 And Dado2 = 4 Then Print "Dado1= " & CStr(Dado1) & "Dado2= " & CStr(Dado2) Exit Do End If Print "Dado1: " & CStr(Dado1) & "Dado2: " & CStr(Dado2) Loop ' Until Dado1 = 2 And Dado2 = 4 Print "FIN DEL CICLO" End Sub
'****************************************************************** 'Nombre: do5.frm 'Descripcion: El siguiente programa muestra como utilizar ' el ciclo DO - WHILE - LOOP 'Tipo: El programa es de ESTRUCTURAS DE ITERACIN '***************************************************************** Dim variable As Integer Private Sub Form_Load() variable = 3 Do While variable < 10 Print "Variable = " & CStr(variable) variable = variable + 1 Loop End Sub Los resultados arrojados por este programa son: Variable = 3 Variable = 4 Variable = 5 Variable = 6 Variable = 7 Variable = 8 Variable = 9