lunes, 1 de octubre de 2012

Estructuras básicas de control en Visual Basic



Estructuras básicas de control


Estructuras de control
Las estructuras de control contienen bloques de código que serán ejecutados en función del resultadoobtenido al evaluar una expresión asociada a la estructura. A este proceso de redirección del flujo delprograma hacia un determinado bloque de código se le denomina bifurcación.
Según el modo de ejecución del código que contienen, las estructuras de control se dividen en lossiguientes tipos: selección y repetición.
Selección
Las estructuras de selección o decisión permiten ejecutar un bloque de código entre varios disponibles,según el resultado de la evaluación de una expresión situada en la cabecera de la estructura.
If...End If
La sintaxis de esta estructura puede aplicarse de diferentes formas en función del tipo de decisión aresolver.
Decisión simple.
La sintaxis de decisión simple se muestra en el Código fuente

If Expresión Then
' código
' ......
' ......
End If


Si al evaluar Expresión se devuelve como resultado Verdadero, se ejecutarán las líneas o bloque decódigo comprendido entre If y End If. Si Expresión es Falso, se desviará la ejecución a la primeralínea de código que haya después de End If. Veamos un ejemplo en el Código fuente.
Sub Main()
Dim Valor As Integer
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
If Valor = 5 Then
Console.WriteLine("Estamos dentro de la estructura If," & _
" ya que su expresión devuelve Verdadero")
End If
Console.ReadLine()
End Sub


Decisión simple en una línea.

En el caso de que sólo haya que ejecutar una instrucción sencilla cuando se cumple la expresión de laestructura, podemos omitir la palabra clave End If, escribiendo la sentencia a ejecutar en la mismalínea de la declaración de la estructura If, justo a continuación de la palabra Then. La sintaxis en estecaso, se simplifica, como muestra el Código fuente.
If Expresión Then Instrucción

Veamos un ejemplo en el Código fuente
Sub Main()
Dim Valor As Integer
Dim Resultado As Integer
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
If Valor = 5 Then Resultado = Valor + 10
Console.WriteLine()
End Sub

Como habrá comprobado el lector, la sentencia que hay a continuación de Then sólo se ejecutarácuando la variable Valor contenga 5

Decisión doble.
Además de ejecutar un bloque de código cuando la expresión valga Verdadero, podemos tambiénejecutar código cuando la expresión devuelva Falso. En este caso añadiremos a la estructura la palabraclave Else, como muestra la sintaxis del Código fuente
If Expresión Then
' código cuando Expresión es Verdadero
' ......
' ......
Else
' código cuando Expresión es Falso
' ......
' ......
End If

Veamos un ejemplo en el Código fuente
Sub Main()
Dim Valor As Integer
Dim Resultado As Integer
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
If Valor = 5 Then
Resultado = Valor + 10
Else
Resultado = 777
End If
Console.WriteLine("La variable resultado contiene {0}", Resultado)
Console.ReadLine()
End Sub

En este ejemplo, cuando Valor contenga 5 se ejecutará el bloque de código que hay a continuación deIf, pero cuando Valor contenga un número distinto, se ejecutará el código que hay a continuación deElse. La ejecución en cualquier caso, continuará después a partir de la siguiente línea que haya a partirde la palabra clave End If.

Decisión doble en una línea.

Al igual que ocurre con la decisión simple, si para cada resultado de la expresión, sólo necesitamosejecutar una instrucción, podemos escribir todo el código en una sola línea. Veamos la sintaxis en elCódigo fuente
If Expresión Then InstrucciónVerdadero Else InstrucciónFalso

En el Código fuente tenemos un ejemplo de uso.
Sub Main()
Dim Valor As Integer
Dim Resultado As Integer
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
If Valor = 5 Then Resultado = Valor + 10 Else Resultado = 777
Console.WriteLine("La variable resultado contiene {0}", Resultado)
Console.ReadLine()
End Sub

Si bien la ejecución de la estructura If en una línea puede ser útil en ocasiones, tiene comocontrapartida el que nuestro código se vuelva más difícil de leer. Por ello es más recomendable el usode esta estructura de control en su formato If...End If.
Decisión múltiple.
En el caso de que la expresión principal a evaluar devuelva Faso, podemos agregar expresionesadicionales utilizando la palabra clave ElseIf, con su bloque de código respectivo. En el caso de queninguna de ellas se cumplan, podemos incluir un Else, para ejecutar un bloque de código por defecto.
Veamos la sintaxis en el Código fuente
If ExpresiónA Then
' código cuando ExpresiónA es Verdadero
' .......
ElseIf ExpresiónB Then
' código cuando ExpresiónB es Verdadero
' .......
[ElseIf ExpresiónN Then]
' código cuando ExpresiónN es Verdadero
' .......
[Else]
' código cuando ninguna epxresión devuelve Verdadero
' .......
End If

A continuación vemos un ejemplo en el Código fuente
Sub Main()
Dim Valor As Integer
Dim Resultado As Integer
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
If Valor = 5 Then
Resultado = Valor + 10
ElseIf Valor > 100 Then
Resultado = Valor + 200
ElseIf Valor < 1 Then
Resultado = -8
Else
Resultado = 777
End If
Console.WriteLine("La variable Resultado contiene {0}", Resultado)
Console.ReadLine()
End Sub

En esta situación, si la primera expresión es Verdadero, se ejecutará el código situado a partir de If.Sin embargo, si If devuelve Falso, se comprobarán sucesivamente las expresiones de cada uno de losElseIf existentes. En el caso de algún ElseIf devuelva Verdadero, se ejecutará el código que haya apartir del mismo. Si ninguna de las anteriores situaciones se cumple, se ejecutará el código que haya apartir de Else en el caso de que este se haya definido.

Select Case...End Select
Se trata de una evolución en la estructura If...End If de decisión múltiple, y su trabajo consiste enevaluar una expresión y comparar el resultado con la lista de expresiones de cada uno de los casosproporcionados. El Código fuente muestra la sintaxis.
Select Case Expresión
Case ListaExpresionesA
' código si se cumple ListaExpresionesA
' .....
[Case ListaExpresionesB]
' código si se cumple ListaExpresionesB
' .....
[Case Else]
' código si no se cumple ninguna ListaExpresiones
' .....
End Select

La lista de expresiones asociada a cada Case en esta estructura estará separada por comas y podrá teneralguno de los siguientes formatos:
·         Expresión.
·         ExpresiónMenor To ExpresiónMayor
·         Is OperadorComparación Expresión
Tras evaluar la expresión de la estructura, si se encuentra una coincidencia con alguno de los Case, seejecuta el bloque de código situado entre dicho Case y el siguiente. En caso de que no haya ningunacoincidencia, podemos opcionalmente, ejecutar un bloque por defecto, utilizando la palabra clave CaseElse. Finalizada esta estructura, la ejecución continuará a partir de la línea situada después de EndSelect.
Veamos a continuación, en el Código fuente 146 un ejemplo de uso de esta estructura
Sub Main()
Dim Valor As Integer
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
Select Case Valor
Case 5
Console.WriteLine("El valor es 5")
Case 120, 250
Console.WriteLine("El valor es 120 ó 250")
Case 3000 To 4000
Console.WriteLine("El valor está en el rango de 3000 a 4000")
Case Is < 10
Console.WriteLine("El valor es menor de 10")
Case Else
Console.WriteLine("El valor es {0}, y no se cumple ningún caso", Valor)
End Select
Console.ReadLine()
End Sub
En el caso de que tras evaluar la expresión, haya más de un Case cuya lista de expresiones se cumpla,se ejecutará el que esté situado en primer lugar. En el ejemplo anterior, cuando la variable Valorcontiene 5, se cumplen dos casos. Ver Código fuente.
Case 5
Console.WriteLine("El valor es 5")
' .....
' .....
Case Is < 10
Console.WriteLine("El valor es menor de 10")
Sin embargo sólo se ejecuta el código del primer Case.

Por otro lado, la lista de expresiones puede ser una combinación de los distintos formatos disponibles.Ver Código fuente

Case 12 To 15, 4, 7, Is > 20



Repetición
Estas estructuras, también denominadas bucles, ejecutan un bloque de código de forma repetitivamientras se cumpla una condición asociada a la estructura. A cada una de las veces en que se ejecuta elcódigo contenido en estas estructuras se le denomina iteración.
While...End While
Se trata del tipo más sencillo, ejecuta las líneas de código que contiene, mientras que la expresiónsituada junto a While devuelva Verdadero. Veamos su sintaxis en el Código fuente
While Expresión
' código
' .....
End While
Y a continuación, un ejemplo en el Código fuente
Sub Main()
Dim Valor As Integer
Dim Contador As Integer
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
Console.WriteLine("Mostrar en consola todos los números desde 1 hasta el introducido")
While Contador < Valor
Console.Write("-" & Contador)
Contador += 1
End While
Console.ReadLine()
End Sub


Do...Loop
Esta estructura ejecuta un conjunto de líneas de código, en función del valor devuelto por unaexpresión, que a modo de condición, podemos situar al comienzo o final de la estructura.
Es posible además, no utilizar la expresión de evaluación al principio o final, debiendo en ese caso,introducir alguna condición en el interior del código de la estructura, para forzar la salida del bucle yevitar caer en un bucle infinito. La instrucción Exit Do nos permite forzar la salida del bucle, pudiendoemplearla tantas veces como sea necesario.
Veamos a continuación, las diferentes variantes disponibles.
Condición al principio.
La sintaxis se muestra en el Código fuente
Do While | Until Expresión
' código
' ......
[Exit Do]
' código
' ......
Loop

La diferencia entre usar While o Until reside en que empleando While, el código del bucle se ejecutarámientras la expresión devuelva Verdadero. En el caso de Until, el código se ejecutará mientras que laexpresión devuelva Falso. Veamos los ejemplos del Código fuente
Sub Main()
Dim Valor As Integer
Dim Palabra As String
Dim Contador As Integer
Dim Pruebas As Integer
' bucle con While
Do While Valor <> 200
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
Loop
' bucle con Until
Do Until Palabra = "coche"
Console.WriteLine("Introducir una palabra")
Palabra = Console.ReadLine()
Loop
' inicializar contador,
' en este caso vamos a pedir también
' al usuario que introduzca un número,
' pero si después de cinco intentos,
' no consigue acertar, forzamos la salida
' de la estructura
Contador = 1
Do While Pruebas <> 200
Console.WriteLine("Introducir un número - Intento nro.{0}", Contador)
Pruebas = Console.ReadLine()
If Contador = 5 Then
Exit Do
Else
Contador += 1
End If
Loop
End Sub


En el último caso de este ejemplo, podemos observar como empleamos además, la anidación dediferentes estructuras, combinándolas para realizar las comprobaciones oportunas.
Condición al final.
La diferencia en este caso, consiste en que el contenido de la estructura se ejecuta al menos una vez. El Código fuente muestra su sintaxis.
Do
' código
' ......
[Exit Do]
' código
' ......
Loop While | Until Expresión
El Código fuente muestra algunos ejemplos.
Sub Main()
Dim Valor As Integer
Dim Palabra As String
' bucle con While
Do
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
Loop While Valor <> 200
' bucle con Until
Do
Console.WriteLine("Introducir una palabra")
Palabra = Console.ReadLine()
Loop Until Palabra = "coche"
End Sub


Sin condición.
Este es el modo más sencillo de la estructura: sin incluir condición al principio o final. También es elmodo más peligroso, ya que si no incluimos un control dentro del código, corremos el riesgo de caeren un bucle infinito. En el ejemplo del Código fuente, establecemos una condición de salidamediante una estructura If dentro del bucle, que comprueba el contenido de la variable, y fuerza lasalida cuando tenga un valor superior a cierto número.
Sub Main()
Dim Valor As Integer
Do
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
' comprobar y salir del bucle si es necesario
If Valor > 400 Then
Exit Do
End If
Loop
End Sub


For...Next
Esta estructura ejecuta un bloque de código un número determinado de veces, establecido por un rangode valores y controlado por un contador. El Código fuente 156 muestra su sintaxis
For Contador = Inicio To Fin [Step Incremento]
' código
' ......
[Exit For]
' código
' ......
Next


El elemento Contador se inicializa con un valor y el código existente entre For y Next es ejecutado unaserie de veces, hasta que el valor de Contador se iguala a Fin.
Por defecto, los incrementos de Contador son en uno, pero podemos cambiar este aspecto utilizando elmodificador Step, mediante el que podemos establecer el número en el que se van a realizar losincrementos. Step también nos permite realizar decremento utilizando un número negativo.
Si queremos realizar una salida de la ejecución de esta estructura antes de haber completado el númerode iteraciones establecidas, podemos utilizar la instrucción Exit For, que provocará dicha salida deigual modo que el explicado anteriormente en la estructura Do...Loop.
El Código fuente muestra diferentes ejemplos de uso de este tipo de bucle.
Sub Main()
Dim Contador As Integer
Dim Final As Integer
' recorrido simple del bucle
Console.WriteLine("Bucle For normal")
For Contador = 1 To 10
Console.WriteLine("Variable Contador: {0}", Contador)
Next
Console.WriteLine()
' recorrer el bucle especificando un incremento
Console.WriteLine("Bucle For con incremento")
Console.WriteLine("Introducir el número de ejecuciones para el bucle")
Final = Console.ReadLine()
For Contador = 1 To Final Step 4
Console.WriteLine("Variable Contador: {0}", Contador)
Next
Console.WriteLine()
' recorrer el bucle especificando un decremento
Console.WriteLine("Bucle For con decremento")
For Contador = 18 To 4 Step -1
Console.WriteLine("Variable Contador: {0}", Contador)
Next
Console.WriteLine()
' este bucle no se ejecutará,
' al ser mayor el valor de contador
' que el valor final, y no haber
' establecido un decremento
For Contador = 18 To 4
Console.WriteLine("Variable Contador: {0}", Contador)
Next
' recorrer el bucle y salir antes de completar
' todas las iteraciones
Console.WriteLine("Bucle For con salida antes de completar")
For Contador = 1 To 10
Console.WriteLine("Variable Contador: {0}", Contador)
If Contador = 7 Then
Exit For
End If
Next
Console.ReadLine()
End Sub


Un truco para optimizar y acelerar la ejecución en un bucle de este tipo, consiste en utilizar comocontador una variable de tipo Integer, en vez de una de tipo Short, Long, Decimal, etc. Esto es debidoa que los tipos Integer se actualizan más rápidamente que los otros tipos numéricos, aunque ladiferencia sólo será apreciable en bucles que ejecuten muchos miles de iteraciones y que contenganmuchas instrucciones. Ver Código fuente
Dim ContRapido As Integer
Dim ContLento As Decimal
' este bucle se ejecutará más rápido que el siguiente
For ContRapido = 1 To 10000
' código
Next
For ContLento = 1 To 10000
' código
Next
For Each...Next
Se trata de una variante de la estructura For...Next, y su misión consiste en ejecutar un bloque decódigo por cada uno de los elementos existentes en un array o colección. El Código fuente muestra su sintaxis.
For Each Elemento In ColecArray
' código
' ......
[Exit For]
' código
' ......
Next
El Código fuente muestra un ejemplo del uso de esta estructura de control.
Sub Main()
' crear un array y rellenarlo con valores
Dim lsColores() As String = {"Azul", "Verde", "Marino", "Violeta"}
Dim lsColor As String
' en cada iteración se obtiene un elemento
' del array lsColores, y se guarda en la variable lsColor
For Each lsColor In lsColores
Console.WriteLine(lsColor)
Next
End Sub

No hay comentarios:

Publicar un comentario