índice del curso de VB .NET

Curso de iniciación a la programación
con Visual Basic .NET

Entrega número seis, (11/Nov/2002)
Publicada el 11/Nov/2002
Revisado el 12/Nov/2002


En la entrega anterior te dije que no iba a dejar que pasara un año para publicar la siguiente, pero... casi, casi... si me descuido, si que pasa un año... en fin... Aunque tengo que decirte que ha sido por causas ajenas y por otras en las que no voy a entrar en detalles... lo importante, al menos para mí, es que aquí tienes la sexta entrega de este curso de iniciación a Visual Basic .NET
Lo que si es importante, es que en las fechas en las que estoy escribiendo estas líneas, la versión definitiva de Visual Basic .NET ya es algo real... y también tengo que decirte que todo lo dicho anteriormente es aplicable a esta versión, que según Microsoft es Visual Studio .NET 2002, (te recuerdo que anteriormente estaba trabajando con la Beta 2 de Visual Studio .NET)

Bien, empecemos.
Según te comenté hace casi un año... en esta entrega vamos a seguir viendo cosas relacionadas con las comparaciones (IF / THEN) y también veremos cómo hacer bucles, etc.
Aunque esto de los bucles ya vimos algo en la tercera entrega, aquí lo veremos con algo de más detalle, es decir, te lo voy a explicar.

Pero empecemos con If Then y los operadores lógicos.
Como vimos en la cuarta entrega podíamos usar AND, OR y NOT, pero en esta nueva versión de Visual Basic los dos primeros tienen su versión especial, la cual es la más recomendable, ahora veremos porqué.

Cuando hacemos una comparación usando AND, nuestro querido VB comprueba si las dos expresiones usadas con ese operador son ciertas, esto está claro, por ejemplo si tenemos lo siguiente:
IF N = 3 AND X > 10 THEN
Se comprueba si el contenido de N es igual a 3 y también si el contenido de X es mayor de 10.
Y tu dirás... vale, muy bien, está claro, ¿cual es el problema?
Pues ninguno... bueno, si, si hay un problema.
¿Qué pasa si el contenido de N no es 3?
Tu dirás: Que no se cumple la condición.
Y estarás en lo cierto, pero... aunque el contenido de N no sea igual a 3, también se comprueba si el contenido de X es mayor de 10.
Si lo piensas durante unos segundos... (ya) comprobarás que realmente no sería necesario hacer la segunda comprobación, ya que si la primera no se cumple... ¿qué necesidad hay de comprobar la segunda?
Como sabemos, AND "necesita" que las dos expresiones sean ciertas para dar por cierta la expresión completa.
Esto en teoría no sería problemático, ya que Visual Basic no tarda mucho tiempo en comprobar la segunda expresión, al menos en este ejemplo, ya que si en lugar de ser una "simple" comparación, en la segunda parte del AND tuviéramos algún tipo de expresión que se tomara su tiempo... sería un desperdicio inútil tener que esperar ese tiempo, sobre todo sabiendo que no es necesario hacer esa segunda comprobación.
En las versiones anteriores de Visual Basic, e incluso en la época del BASIC de MS-DOS, este tipo de expresiones se solían "partir" en dos comparaciones IF, ya que, si la primera no se cumple, no es necesario hacer la segunda, por tanto esa comparación se podría hacer de la siguiente forma:
IF N = 3 THEN
   IF X > 10 THEN
Es decir, sólo comprobamos la segunda expresión si se cumple la primera.
Ahora, con Visual Basic .NET no es necesario tener que llegar a este "desdoblamiento" y podemos hacer la comparación "casi" como lo que hemos visto, pero usando una instrucción (u operador) especial: AndAlso.

Cuando usamos AndAlso, Visual Basic .NET sólo comprobará la segunda parte, si se cumple la primera.

Es decir, si N no vale 3, no se comprobará si X es mayor que 10, ya que no lo necesita para saber que TODA la expresión no se cumple. Por tanto, la comparación anterior podemos hacerla de esta forma:
IF N = 3 ANDALSO X > 10 THEN

Lo mismo, (o casi), ocurre con OR, aunque en este caso, sabemos que si el resultado de cualquiera de las expresiones usadas con ese operador es verdadero, la expresión completa se da por buena.
Por ejemplo, si tenemos:
IF N = 3 OR X > 10 THEN
En el caso de que N valga 3, la expresión (N = 3 OR X > 10) sería verdadera, pero, al igual de lo que pasaba con AND, aunque N sea igual a 3, también se comprobará si X vale más de 10, aunque no sea estrictamente necesario.
Para que estos casos no se den, Visual Basic .NET pone a nuestra disposición del operador OrElse.

Cuando usamos OrElse, Visual Basic .NET sólo comprobará la segunda parte si no se cumple la primera.

Es decir, si N es igual a 3, no se comprobará la segunda parte, ya que no es necesario hacerlo. En este caso la comparación quedaría de esta forma:
IF N = 3 ORELSE X > 10 THEN

A estos dos operadores se les llama operadores de cortocircuito (shortcircuit operators) y a las expresiones en las que participan se llaman expresiones cortocircuitadas.

Otra cosa que debemos tener en cuenta cuando evaluamos expresiones lógicas, o cuando simplemente evaluamos expresiones, por ejemplo para asignar el resultado a una variable, hay que tener presente que Visual Basic .NET sigue un orden a la hora de evaluar las distintas partes de la expresión.
Esto es lo que se llama:

Prioridad de los operadores

Tenemos que tener en cuenta que los operadores pueden ser aritméticos, de comparación y lógicos. Veamos cada grupo por separado, te advierto que algunos de estos operadores aún no los hemos visto, pero... creo que es conveniente saberlo y ya tendremos ocasión de aprender para que sirven.

Prioridad de los operadores aritméticos y de concatenación:

Exponenciación (^)
Negación (-)
Multiplicación y división (*, /)
División de números enteros (\)
Módulo aritmético (Mod)
Suma y resta (+, -)
Concatenación de cadenas (&)
 

Operadores de comparación:

Igualdad (=)
Desigualdad (<>)
Menor o mayor que (<, >)
Mayor o igual que (>=)
Menor o igual que (<=)
 

Operadores lógicos:

Negación (Not)
Conjunción (And, AndAlso)
Disyunción (Or, OrElse, Xor)
 

Cuando en una misma expresión hay sumas y restas o multiplicación y división, es decir operadores que tienen un mismo nivel de prioridad, éstos se evalúan de izquierda a derecha.
Cuando queramos alterar este orden de prioridad, deberíamos usar paréntesis, de forma que primero se evaluarán las expresiones que estén dentro de paréntesis.
Por ejemplo, si tenemos esta expresión:
X = 100 - 25 - 3
El resultado será diferente de esta otra:
X = 100 - (25 - 3)
En el primer caso el resultado será 72, mientras que en el segundo, el resultado será 78, ya que primero se evalúa lo que está entre paréntesis y el resultado (22) se le resta a 100.

 

Bucles en Visual Basic .NET

Cada vez que queramos "reiterar" o repetir un mismo código un número determinado de veces, e incluso un número indeterminado de veces, tendremos que echar mano de los bucles.

En Visual Basic .NET existen diferente instrucciones para hacer bucles (o reiteraciones), veamos esas instrucciones y después las veremos con más detalle:

For / Next, con este tipo de bucle podemos repetir un código un número determinado de veces.

La forma de usarlo sería:
For <variable numérica> = <valor inicial> To <valor final> [Step <incremento>]
   ' contenido del bucle, lo que se va a repetir
Next
La variable numérica tomará valores que van desde el valor inicial hasta el valor final, si no se especifica el valor del incremento, éste será 1.
Pero si nuestra intención es que el valor del incremento sea diferente a 1, habrá que indicar un valor de incremento; lo mismo tendremos que hacer si queremos que el valor inicial sea mayor que el final, con idea de que "cuente" de mayor a menor, aunque en este caso el incremento en realidad será un "decremento" ya que el valor de incremento será negativo.

Lo entenderemos mejor con un algunos ejemplos:

Dim i As Integer
'
For i = 1 To 10
    ' contará de 1 hasta 10
    ' la variable i tomará los valores 1, 2, 3, etc.
Next
'
For i = 1 To 100 Step 2
    ' contará desde 1 hasta 100 (realmente 99) de 2 en 2
    ' la variable i tomará los valores 1, 3, 5, etc.
Next
'
For i = 10 To 1 Step -1
    ' contará desde 10 hasta 1
    ' la variable i tomará los valores 10, 9, 8, etc.
Next
'
For i = 100 To 1 Step -10
    ' contará desde 100 hasta 1, (realmente hasta 10)
    ' la variable i tomará los valores 100, 90, 80, etc.
Next
'
For i = 10 To 1
    ' este bucle no se repetirá ninguna vez
Next
'
For i = 1 To 20 Step 50
    ' esto sólo se repetirá una vez
Next

En algunos casos, hay que tener en cuenta que el valor final del bucle puede que no sea el indicado, todo dependerá del incremento que hayamos especificado. Por ejemplo, en el tercer bucle, le indicamos que cuente desde 1 hasta 100 de dos en dos, el valor final será 99.
En otros casos puede incluso que no se repita ninguna vez... este es el caso del penúltimo bucle, ya que le decimos que cuente de 10 a 1, pero al no indicar Step con un valor diferente, Visual Basic "supone" que será 1 y en cuanto le suma uno a 10, se da cuenta de que 11 es mayor que 1 y como le decimos que queremos contar desde 10 hasta 1, pues... sabe que no debe continuar.

For Each, este bucle repetirá o iterará por cada uno de los elementos contenidos en una colección.

La forma de usarlo es:
For Each <variable> In <colección del tipo de la variable>
    ' lo que se hará mientras se repita el bucle
Next
Este tipo de bucle lo veremos con más detalle en otras entregas, pero aquí veremos un par de ejemplos.
Sólo decirte que podemos usar este tipo de bucle para recorrer cada uno de los caracteres de una cadena, este será el ejemplo que veremos, ya que, como tendrás la oportunidad de comprobar, será un tipo de bucle que usaremos con bastante frecuencia.

Dim s As String
'
For Each s In "Hola Mundo"
    Console.WriteLine(s)
Next
Console.ReadLine()

While / End While, se repetirá mientras se cumpla la expresión lógica que se indicará después de While.

La forma de usarlo es:
While <expresión>
    ' lo que haya que hacer mientras se cumpla la expresión
End While
Con este tipo de bucles, se evalúa la expresión y si el resultado es un valor verdadero, se ejecutará el código que esté dentro del bucle, es decir, entre While y End While.
La expresión será una expresión lógica que se evaluará para conseguir un valor verdadero o falso.
Veamos algunos ejemplos:

Dim i As Integer
'
While i < 10
    Console.WriteLine(i)
    i = i + 1
End While
Console.ReadLine()
'
'
Dim n As Integer = 3
i = 1
While i = 10 * n
    ' no se repetirá ninguna vez
End While

En el primer caso, el bucle se repetirá mientras i sea menor que 10, fíjate que el valor de i se incrementa después de mostrarlo, por tanto se mostrarán los valores desde 0 hasta 9, ya que cuando i vale 10, no se cumple la condición y se sale del bucle.
En el segundo ejemplo no se repetirá ninguna vez, ya que la condición es que i sea igual a 10 multiplicado por n, cosa que no ocurre, ya que i vale 1 y n vale 3 y como sabemos 1 no es igual a 30.

Do / Loop, este tipo de bucle es muy parecido al anterior, aunque algo más flexible.

Si se utiliza sólo con esas dos instrucciones, este tipo de bucle no acabará nunca y repetirá todo lo que haya entre Do y Loop.
Pero la flexibilidad a la que me refería es que este tipo de bucle se puede usar con dos instrucciones que nos permitirán evaluar expresiones lógicas:
While y Until
Pero no debemos confundir este While con el While/End While que acabamos de ver anteriormente, aunque la forma de usarlo es prácticamente como acabamos de ver.
La ventaja de usar While o Until con los bucles Do/Loop es que estas dos instrucciones podemos usarlas tanto junto a Do como junto a Loop, la diferencia está en que si los usamos con Do, la evaluación se hará antes de empezar el bucle, mientras que si se usan con Loop, la evaluación se hará después de que el bucle se repita al menos una vez.

Veamos cómo usar este tipo de bucle con las dos "variantes":
Do While <expresión>
    '
Loop

Do
    '
Loop While <expresión>

Do Until <expresión>
    '
Loop

Do
    '
Loop Until <expresión>
 

Usando Do con While no se diferencia en nada con lo que vimos anteriormente, con la excepción de que se use junto a Loop, pero como te he comentado antes, en ese caso la evaluación de la expresión se hace después de que se repita como mínimo una vez.

Until, a diferencia de While, la expresión se evalúa cuando no se cumple la condición, es como si negáramos la expresión con While (Not <expresión>)
Una expresión usadas con Until podríamos leerla de esta forma: hasta que la expresión se cumpla:
Do Until X > 10 (repite hasta que X sea mayor que 10)
Veamos un ejemplo para entenderlo mejor:

i = 0
Do Until i > 9
    Console.WriteLine(i)
    i = i + 1
Loop

Este bucle se repetirá para valores de i desde 0 hasta 9 (ambos inclusive).
Y este también:

i = 0
Do While Not (i > 9)
    Console.WriteLine(i)
    i = i + 1
Loop

Con esto entenderás mejor a lo que me refería con negar la expresión con While.

En el caso de que Until se use junto a Loop, la expresión se comprobará después de repetir al menos una vez el bucle.

Y esto son todos los bucles que podemos usar.
Pero aún no hemos acabado esta entrega... (después de lo que se ha hecho esperar... ¡que menos!)

Lo que nos queda por ve, es que cuando estamos dentro de un bucle, podemos abandonarlo de dos formas:
1- Esperando a que el bucle termine.
2- Saliendo "abruptamente" o abandonándolo antes de que termine de forma lógica o por los valores que le hemos indicado (al menos en el caso de los bucles For)

Para poder abandonar un bucle, esto veremos que es ampliable a otros temas), hay que usar la instrucción Exit seguida del tipo de bucle que queremos abandonar:
Exit For
Exit While
Exit Do

Esto es útil si necesitamos abandonar el bucle por medio de una condición, normalmente se utiliza con un If / Then.

En otras ocasiones veremos estas instrucciones en plena acción, pero eso será en otra ocasión, ya que esta entrega la vamos a dejar aquí.

En la próxima entrega veremos otra forma de tomar decisiones, hasta ahora sólo hemos visto que podemos tomarlas con If / Then.

Sólo me queda hacer el resumen de lo que hemos visto en esta sexta entrega:
- Otra forma de evaluar expresiones lógicas de una forma más "lógica", usando AndAlso y OrElse en lugar de And y Or.
-Los diferentes tipos de bucles que podemos usar con Visual Basic .NET
-Cómo abandonar un bucle de forma explícita.

Lo dicho, espero que la próxima entrega no se haga tanto de rogar y podamos verla antes de que acabe este año.

Nos vemos.
Guillermo
Nerja, 11 de Noviembre de 2002


ir a la entrega anterior ir al índice del curso vb.NET
 
ir al Glosario .NET
ir a la siguiente entrega (o al índice si esta es la última)

la Luna del Guille o... el Guille que está en la Luna... tanto monta...