Bucle Do Loop
Mientras que el desarrollo de la iteración For se basa en la ejecución de un ciclo definido por los límites de una variable-contador, Do...Loop se basa en el cumplimiento (o no) de una determinada condición.
La sintaxis de Do es notablemente más compleja que For, como tendremos ocasión de comprobar en esta entrada por comparación con [la anterior], admitiendo Do dos variaciones básicas que, a su vez, presentan dos formas diferentes de plantear la condición de persistencia o finalización del bucle mediante dos instrucciones diferentes: While y Until. Veamos cada una de ellas (fuente de los gráficos libreoffice.org).
La primera de estas dos opciones es la que está representada en el gráfico siguiente: podemos advertir que las condiciones se plantean al inicio de la estructura, ubicándose las instrucciones While y Until asociadas a Do.
Este posicionamiento de la condición permite que no se ejecute el bucle ninguna vez si la condición que se establece no es verdadera (Do While)...
sub BucleA1
Dim iCondicion As Integer
iCondicion = 0
Do While iCondicion > 5
MsgBox iCondicion
iCondicion = iCondicion +1
Loop
End Sub
... como en este caso. Para que se ejecutar el bucle deberíamos cambiar el signo de la condición ( Do While iCondicion < 5) ...
... o mientras no lo sea (Do Until)...
sub BucleA2
Dim iCondicion As Integer
iCondicion = 0
Do Until iCondicion < 5
MsgBox iCondicion
iCondicion = iCondicion +1
Loop
End Sub
... no se ejecuta el bucle y para que se ejecute deberemos cambiar la condición en sentido contrario (Do Until iCondicion > 5) (1).
Contrariamente a la anterior, una segunda opción sitúa la condición asociada a Loop, motivo por el que While o Until se posicionan tomando a esta instrucción como referencia. El esquema siguiente representa esta segunda opción.
La consecuencia de este posicionamiento es que el bucle se ejecutará como mínimo al menos una vez, hasta que se comprueba que se cumple o no se cumple la condición que se establece. Por ejemplo...
sub BucleB1
Dim iCondicion As Integer
iCondicion = 0
Do
MsgBox iCondicion
iCondicion = iCondicion +1
Loop While iCondicion > 5
End Sub
... en este caso (Loop While) el bucle se ejecuta una vez MsgBox iCondicion -> 0, ya que la condición se comprueba asociada a la instrucción Loop. Para que se ejecute hasta que deja de cumplirse la condición debemos cambiar el signo de la comparación (Loop While iCondicion < 5): ahora se ejecutará hasta que iCondicion valga 5 (iCondicion=5), momento en que dejará de cumplirse.
Otra posibilidad es la que representa el siguiente script:
sub BucleB2
Dim iCondicion As Integer
iCondicion = 0
Do
MsgBox iCondicion
iCondicion = iCondicion +1
Loop Until iCondicion < 5
End Sub
En él también se ejecuta el bucle una vez hasta que se comprueba que se cumple la condición para que no se ejecute, momento en el que finaliza en cumplimiento de la instrucción dada (Loop Until iCondicion < 5), siendo necesario cambiar dicha condición (Loop Until iCondicion > 5) para que persista ejecutándose hasta que se cumpla la condición se finalización que se establece.
Las función específica y diferenciada de While y Until también resulta de interés, ya que optar por una o por otra implica priorizar el cumplimiento de la condición para que se ejecute el bucle (While), o establecer la condición que impida su cumplimiento (Until)
Como podemos observar, mientras que asociar la condición a Do vs. Loop modifica el funcionamiento del bucle...
- Do (While|Until) Condición -> Puede no ejecutarse nunca el bucle
- Loo (While|Until) Condición -> El bucle se ejecutará al menos en una ocasión.
- While -> Repite el bucle hasta que la condición sea falsa (deje de cumplirse)
- Until -> Repite el bucle mientras la condición es verdadera y finaliza cuando pasa a ser falsa.
En cualquier caso es necesario tener mucho cuidado con cómo se planea el bucle ya que de hacerlo incorrectamente podemos generar un error de funcionamiento que derive en el bloqueo del programa. Y este peligro es mayor cuando usamos los bucles Do...Loop.
NOTA
(1) Queda claro en los ejemplos anteriores que de la inversión de la ejecución o no del bucle son responsables las instrucciones While vs. Until. De ellas hablaremos más abajo.
No hay comentarios:
Publicar un comentario
Comenta esta entrada