sábado, 22 de julio de 2023

OOo Basic. Estructuras

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. 



Precisamente
 la diferencia entre ambos (For y Do) radica en que mientras que la primera implica necesariamente la ejecución de al menos una iteración, en Do
 puede darse el caso de que no se ejecute en ningún momento, dado que es posible que la condición necesaria no se cumpla nunca.


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.
... el uso de While vs Until invierte el sentido del cumplimiento de la condició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.
Parece claro que el bucle Do presenta más dificultades de uso que el bucle For, por lo que éste es preferible siempre que lo que se pretenda ejecutar permita ser planteado de forma alternativa con una o con otra estructura; pero no es menos cierto que Do...Loop puede ser oportuno en determinadas circunstancias, como cuando queremos asegurar el cumplimiento de una condición y una forma determinada de funcionamiento del bucle, como en el uso de una clave de acceso por motivos de seguridad.

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