El ciclo While
El ciclo While es útil para repetir la ejecución de un bloque de código un número variable de veces. Para determinar si se debe ejecutar el bloque de código, se utiliza una condición booleana, al igual que en un If. La estructura del ciclo While es la siguiente:
- While [CondiciónBooleana]
- ...
- EndWhile
En el ciclo While anterior, el bloque de código se ejecuta si la condición booleana es True. Después de que se ejecuta el bloque de código, el ciclo While reevalúa la condición y, si aún es True, vuelve a ejecutar el bloque, y esta repetición continúa hasta que la condición se vuelve False. Cuando la condición es False, el flujo de ejecución continúa con la instrucción inmediatamente posterior a su correspondiente instrucción EndWhile.
Por ejemplo:
- a = 0
- While a <= 10
- a = a + 1
- EndWhile
En el ejemplo, el ciclo se ejecuta hasta que la variable "a" supera el valor 10. De hecho, la condición inicial devuelve True si "a" es menor o igual a 10.
Es responsabilidad del programador garantizar que la condición booleana se vuelva False en algún momento. Si esto no sucede, el cuerpo del ciclo tenderá a ejecutarse un número infinito de veces. Para prevenir este peligro, se ha impuesto un límite de aproximadamente 250.000 iteraciones, después de las cuales el ciclo While genera un error. Dado que los ciclos infinitos son uno de los errores de programación más comunes, siempre se recomienda prestar mucha atención al construir un ciclo While.
Por ejemplo:
- a = 0
- While a <= 10
- a = a - 1
- EndWhile
En el ejemplo, la condición siempre será True, ya que la variable "a", al ser decrementada, nunca superará el valor 10. Por lo tanto, el ciclo tenderá a ejecutarse un número infinito de veces. Después de aproximadamente 250.000 iteraciones, la ejecución terminará con un error.
Hemos visto el ciclo While clásico, en el que la condición booleana se expresa y ejecuta al principio. La condición booleana inicial permite evitar ejecutar el bloque de código si no es necesario hacerlo. Para ejecutar el bloque de código al menos una vez, hay disponible una estructura While en la que la condición booleana se coloca al final.
- While
- ...
- EndWhile [CondiciónBooleana]
A diferencia de la condición colocada al principio, si la condición booleana al final es True, el ciclo termina. La palabra clave EndWhile se utiliza siempre para delimitar el final de un ciclo While. Por lo tanto, el fin del While (End of While) ocurrirá si la condición es True.
Por ejemplo:
- a = 0
- While
- a = a + 1
- EndWhile a > 10
En este caso, el bloque del ciclo While se ejecuta al menos una vez. La iteración del ciclo termina cuando la variable "a" es mayor que 10.
La condición booleana puede colocarse al principio del ciclo While, de modo que el bloque de código se ejecuta si la condición es True. O bien, la condición puede colocarse al final del ciclo, y en este caso el ciclo termina si la condición es True. Una característica particular es que la condición puede colocarse simultáneamente al principio y al final, obteniendo dos controles condicionales al principio y al final del ciclo. Esta situación especial tiene un sentido real si las dos condiciones controlan variables diferentes.
Por ejemplo:
- a = 0
- b = 0
- While a <= 10
- a = a + 1
- b = Random(10)
- EndWhile b >= 5
El ejemplo anterior ilustra el uso de la doble condición. El bloque While se ejecuta si la variable "a" es menor o igual a 10, o termina si la variable "b" es mayor o igual a 5. En la variable "b", en cada iteración se asigna un valor aleatorio que puede ir de 0 a 9.
El cuerpo de un ciclo While puede contener otro ciclo: en ese caso, se habla de ciclos anidados.
Por ejemplo:
- a = 0
- While a <= 10
- b = Random(10)
- While b < 5
- // Haz algo
- EndWhile
- a = a + 1
- EndWhile
El ciclo secundario se ejecuta solo si la variable "b" es menor que 5. En la variable "b", en cada iteración del ciclo primario, se asigna un valor aleatorio de 0 a 9.
La iteración de un ciclo While puede interrumpirse utilizando la instrucción Break. Cuando se encuentra la instrucción Break, la ejecución pasa a ejecutar la instrucción inmediatamente posterior al cuerpo del ciclo.
Por ejemplo:
- a = 0
- While a <= 10
- b = Random(10)
- If b = 5
- Break
- EndIf
- a = a + 1
- EndWhile
En el ejemplo anterior, si la variable "b" es igual a 5, el ciclo terminará; de lo contrario, continuará con todas las iteraciones. La instrucción Break generalmente no debería utilizarse, ya que existen herramientas más adecuadas para escribir un ciclo. Sin embargo, en caso de necesidad, su uso puede tolerarse.
La instrucción Continue tiene un efecto similar al Break en la ejecución del ciclo. Se interrumpe, pero a diferencia de Break, la ejecución regresa al principio o al final (dependiendo de dónde esté la condición booleana) y, si es necesario, el cuerpo del ciclo se vuelve a ejecutar.
Por ejemplo:
- a = 0
- While a <= 10
- b = Random(10)
- If b = 5
- Continue
- EndIf
- a = a + 1
- EndWhile
En el ejemplo anterior, si la variable "b" es igual a 5, el ciclo se vuelve a ejecutar, por lo que la variable "a" no se incrementa. En cambio, en el siguiente ejemplo, la condición de control se coloca al final, por lo que la instrucción Continue salta la ejecución al final del ciclo.
- a = 0
- While
- b = Random(10)
- If b = 5
- Continue
- EndIf
- a = a + 1
- EndWhile a > 10
Si el ciclo While tiene una doble condición de control, la instrucción Continue hará que la ejecución salte siempre a la condición de inicio. Al igual que la instrucción Break, Continue puede ser reemplazada por instrucciones más eficientes que hagan el código más legible.