Ciclo Mientras

Ciclo Mientras (While Loop)


   La orden  "Para" (For) hace que una parte de un programa se repita incondicionalmente, una cierta cantidad de veces, pero en la práctica es muy frecuente que nos encontremos que una serie de operaciones se deben repetir "mientras" (While) se cumpla una condición.


En BASIC antiguos, estos se conseguía utilizando If  + Goto. 

    Por ejemplo, un programa que pida una contraseña, para restringir el acceso a personas no deseada:


10 Print "Escribe tu contraseña" 

20 Input clave$ 

30 If clave$ <> "xjk5" Then Goto 10


Muchas versiones de BASIC permiten escribir de estas formas mas simples:


If clave$ <> "xjk5" Then 10

If clave$ <> "xjk5" Goto 10


Este programa es corto y todavía resulta fácil de leer, pero en un programa mínimamente grande, si lo llenamos de saltos con la orden GOTO, termina siendo totalmente ilegible y muy difícil de seguir. Por eso, algunos BASIC más modernos incluían otras formas más elegantes de conseguir lo mismo.

La primera (que pocas versiones de BASIC de los años 80 permitían) es la orden WHILE, cuyo formato es


While condición 

  órdenes 

Wend

De modo que podríamos reescribir nuestro programa de una forma mucho más legible:


While clave$ <> "xjk5" 

  Print "Escribe tu contraseña" 

  Input clave$ 

Wend


Lo de escribir las líneas 20 y 30 más a la derecha es sólo buscando que el programa resulte más fácil de leer, como ya vimos en el apartado 6. Los intérpretes de BASIC "ignorarán" estos espacios en blanco (aunque puede que alguno "los borre"), de modo que "no estorban", pero a cambio conseguiremos que se vea mejor dónde empieza y dónde terminar la parte que se repite. (Este tipo de "sangrados" en un programa es lo que se conoce como escritura indentada).

En este programa hay una cosa peligrosa: estamos comprobando el valor de la variable clave$ antes de que se haya usado. En la mayoría de las versiones de BASIC, la primera vez que usamos una variable, se le da automáticamente el valor 0 (si es numérica) o el de una cadena de texto vacía (si es texto), de modo que no tendríamos problemas. Aun así, no es mala costumbre "dejarlo claro" en el propio programa, para evitar que quede "basura" de otras veces que hubiéramos utilizado nuestro programa:


10 clave$ = "" : REM /Aseguramos que sea una cadena vacia 

20 WHILE clave$ <> "xjk5" 

30 PRINT "ESCRIBE TU CLAVE DE ACCESO" 

40 INPUT clave$ 

50 WEND

En Basic256 no existe "WEND" para cerrar la parte repetitiva, sino que se usa "END WHILE", de modo que el programa quedaría:

REM Primero aseguramos que la cadena esté vacía 

clave$ = ""

REM Y después comienza la parte repetitiva

WHILE clave$ <> "xjk5" 

    PRINT "ESCRIBE TU CLAVE DE ACCESO" 

    INPUT clave$ 

END WHILE


Algunas versiones más modernas de BASIC (como QBasic) permiten otra opción más elegante y con más posibilidades: la construcción DO..LOOP, que se puede emplear de varias formas:


DO WHILE condición 

  órdenes 

LOOP


(se repite MIENTRAS se cumpla la condición, pero esa condición se comprueba antes que nada) o bien:

DO 

  órdenes 

LOOP WHILE condición

(se repite MIENTRAS se cumpla la condición, pero esa condición se comprueba tras cada "vuelta") o bien:

DO UNTIL condición 

  órdenes 

LOOP

(se repite HASTA QUE se cumpla la condición, pero esa condición se comprueba lo primero de todo) o también:

DO 

  órdenes 

LOOP UNTIL condición

(se repite HASTA QUE se cumpla la condición, pero esa condición se comprueba en último lugar)

De modo que la forma más elegante de escribir el programa anterior con QBasic y otros BASIC modernos sería:


DO 

  PRINT "ESCRIBE TU CLAVE DE ACCESO" 

  INPUT clave$ 

LOOP UNTIL clave$ = "xjk5"


que además coincide con la forma "natural" en que nosotros expresaríamos lo que queremos: algo como "pedir la clave de acceso, hasta que la introducida sea la correcta".

En Basic256 también existe UNTIL, y también comienza con DO, pero no existe la palabra LOOP, por lo que el programa anterior sería:

DO 

  PRINT "ESCRIBE TU CLAVE DE ACCESO" 

  INPUT clave$ 

UNTIL clave$ = "xjk5"


Ejercicio propuesto 11.1: Crea un programa que dé al usuario 10 oportunidades que para adivinar un número (generado al azar) del 1 al 1000

Ejercicio propuesto 11.2: Haz un programa que pida al usuario su nombre y su contraseña. No le debe dejar continuar hasta que el nombre sea "yo" y la contraseña sea "1234"

Ejercicio propuesto 11.3: Crea un programa que pida números al usuario y, para cada número n, escriba el valor de n*10. Deberá repetirse hasta que se introduzca el número 0.

Ejercicio propuesto 11.4: Crea un programa que pida números al usuario y, para cada número n, escriba la lista de sus divisores. Deberá repetirse hasta que se introduzca el número 0.