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