Tema 1.11
ESTRUCTURA DE REPETICIÓN DO...LOOP





1.11.1 - ESTRUCTURA DO...LOOP

Esta estructura es similar a la WHILE, solo que la condición se especifica al final del bloque, con lo que puede ser más fácil de entender y nunca tendremos que hacer "lecturas anticipadas" ya que siempre se entra por lo menos una vez.

La principal novedad de este bloque es que podemos repetir las instrucciones MIENTRAS se cumpla la condición o HASTA que se cumpla.

El siguiente ejemplo escribe los números del 1 al 5 usando una instrucción DO...LOOP WHILE que hace que el bucle se ejecute MIENTRAS nuestro contador sea menor que 5.

n = 0
DO
	n = n + 1
	PRINT n
LOOP WHILE n < 5

Observa que el contador se incrementa al principio del bucle, y por lo tanto la primera vez que escribamos n, ya tendrá el valor de 1. La última vez escribirá 5 y al llegar a la condición se comprobará que NO es menor que 5 y ya salimos.

Ahora haremos lo mismo con la instrucción DO... LOOP UNTIL que ejecutará el bloque HASTA QUE el contador llegue a valer 5.

n = 0
DO
	n = n + 1
	PRINT n
LOOP UNTIL n = 5

Esto es parecido. Observa que la condición es justo la contraria. La última vez n vale 5 y después de escribirla se comprueba que la condición es verdadera y se sale del bucle.

Las instrucciones DO...LOOP UNTIL son normalmente las más fáciles de comprender. En la ayuda de QBasic recomiendan que se dejen de usar las instrucciones WHILE...WEND para usar mejor las DO...LOOP, pero algunas veces será mejor usar las WHILE...WEND como en el caso de los ficheros secuenciales que ya veremos más adelante.





1.11.2 - DEPURACIÓN DE DATOS DE ENTRADA

Ahora ya estamos en condiciones de ver una forma de conseguir que un programa que requiere la intervención del usuario para introducir datos de entrada no avance HASTA QUE el usuario no escriba los datos correctos.

En el tema de Entrada/Salida vimos que QBasic es capaz de controlar que no se metan valores fuera de rango, por ejemplo que si el programa pide un entero no se pueda escribir un numero mayor de 32767. Aquí lo que vamos a ver es como conseguir que se pedimos un mes el programa no avance hasta que el usuario escriba un número entre 1 y 12. Esto lo deberíamos hacer en cualquier programa siempre que pidamos al usuario que escriba algo.

Para hacer este control lo que hacemos es meter la instrucción INPUT dentro de un bloque REPETIR, del que no salimos HASTA que la respuesta sea correcta o MIENTRAS sea incorrecta.

Vamos a ver unos ejemplos que aclararán todas las posibles situaciones.

Leer un número menor que 100

CLS
DO
	INPUT "Escribe un número menor que 100: ",num
LOOP UNTIL num < 100

Aquí no seguimos hasta que el número sea menor que 100. En el siguiente ejemplo seguiremos repitiendo la pregunta mientras el número sea mayor o igual que 100

CLS
DO
	INPUT "Escribe un número menor que 100: ",num
LOOP WHILE num >= 100

Puedes volver a comprobas aquí que para el mismo problema la condición del LOOP WHILE es justo la inversa a la del LOOP UNTIL.

Ahora pedimos un mes, que tiene que ser entre 1 y 12

CLS
DO
	INPUT "Escribe un mes (0 a 12): ",mes
LOOP UNTIL (mes >= 1) AND (mes <= 12)

En este caso tenemos un intervalo y por lo tanto hay que controlar dos condiciones que uniremos con el operador AND, con lo que no seguimos HASTA que la primera se cumpla Y la segunda también.

También lo podíamos haber hecho con un bloque DO...LOOP WHILE

CLS
DO
	INPUT "Escribe un mes (0 a 12): ",mes
LOOP WHILE (mes < 1) OR (mes > 12)

Ahora no salimos MIENTRAS alguna de las dos condiciones se cumpla, son justo las contrarias a la del ejemplo anterior, ya que usamos el operador OR que también se puede decir que es el contrario al AND.

Por último vamos a ver un problema muy típico: Un programa que nos pide una clave de acceso para poder seguir. Este es el caso más sencillo en el que no pasamos hasta que no demos con la clave, otros problemas más complicados serían que el programa terminara tras varios intentos fallidos o que admitiera varias claves llévándonos según la que sea a una parte del programa.

CONST ClaveCorrecta$="Ábrete Sésamo"
CLS
DO
	INPUT "Escribe la clave: ",clavePrueba$
LOOP UNTIL clavePruebas = claveCorrecta$
PRINT "Ya has entrado"

Recordar también que en un programa terminado para explotación la clave nunca va a estar en el listado del programa, sino que será obtenida de algún tipo de fichero o base de datos para que el usuario tenga la posibilidad de cambiarla.













CuRSo De iNTRoDuCCióN a La PRoGRaMaCióN CoN QBaSiC
© 2004 Juan M. González