TEMA 1.10
ESTRUCTURA DE REPETICIÓN WHILE...WEND

En este tema vamos a ver una estructura repetitiva más primitiva que el PARA ya que no maneja automáticamente el contador y por lo tanto es más difícil de utilizar, pero usada corréctamente puede ser bastante más flexible.

Recordemos el ejemplo de escribir los números del 1 al 5 con la instrucción FOR.

FOR n = 1 TO 5
	PRINT n
NEXT

Ahora veremos como se hace lo mismo en QBasic usando la instrucción WHILE (Mientras).

n = 1
WHILE n <= 5
	PRINT n
	n = n + 1
WEND

Esto lo que hace es ejecutar el bloque de instrucciones (Lo que hay entre el WHILE y el WEND) una y otra vez mientras se cumpla la condición del WHILE. Un poco más difícil que con el FOR. Vamos a verlo paso a paso:

Se puede ver que el funcionamiento es parecido al del FOR, solo que aquí lo tenemos que controlar todo nosotros. Las dos reglas que dijimos sobre los contadores del FOR ya aquí no tienen sentido porque de hecho nosotros vamos a tener que incrementar el contador haciendo una asignación y una vez terminado podemos estar seguro del valor que tiene la variable.

Una norma que sí conviene respetar (Aunque no siempre es necesario) es que la instrucción que incrementa el contador sea la última del bloque, ya que si está en otro sitio ejecutaremos unas instrucciones con un valor y las demás con el otro, con lo que nos podemos liar. Un error muy típico es que se nos olvide de poner la instrucción de incrementar el contador, produciendo un bucle infinito que hará que nuestro programa no termine nunca. Si un programa se bloquea es conveniente revisar esto.

También puede pasar que no lleguemos a entrar al MIENTRAS porque la condición ya sea falsa la primera vez, por ejemplo:

contador = 120
WHILE contador < 100
	PRINT "Esto no se va a llegar a escribir nunca.”
	contador = contador + 1
WEND

Hasta ahora hemos hablado de contador, pero como veremos en los ejemplos podemos usar un acumulador, o ninguno de los dos, ya que la condición del WHILE puede ser cualquiera y no hay porqué contar ni acumular algo siempre.

Veamos algunos ejemplos de MIENTRAS:

Rutina que escribe del 0 al 100 de 2 en 2:

c = 0
WHLE c <= 100
	PRINT c
	c = c + 2
WEND

Escribir de 50 hasta 1 hacia atrás:

c = 50
WHILE c >= 1
	PRINT c
	c = c - 1
WEND

Calcular el factorial de un número que pedimos al usuario (Este ejemplo se mejorará en otro tema más adelante):

INPUT "Escribe un número para calcular su factorial: ", num
c = 1
factorial = 1
WHILE c <= num
	factorial = factorial * c
	c = c + 1
WEND
PRINT "El factorial de”; num; "es”; factorial

Leer números por teclado hasta que se escriba el 0:

INPUT "Escribe números (0 para salir):”, num
WHILE num <> 0
	INPUT "Escribe números (0 para salir):”, num
WEND

Este último ejemplo presenta lo que se conoce como lectura anticipada. Antes de llegar al WHILE hemos tenido que conseguir el valor de la variable num porque si no lo hacemos puede pasar que num valga cero y por lo tanto no lleguemos a entrar al bucle. Esto es útil en casos como la lectura de ficheros secuenciales, pero otras veces conviene evitarlo para no repetir instrucciones. Veremos como hacerlo en el siguiente tema.

Una última cosa es que hay una teoría en informática que dice que cualquier algoritmo puede ser programado usando solamente instrucciones MIENTRAS. Es decir, ni bloques IF, ni ELSE, ni CASE, ni FOR, ni otras estructuras que veremos más adelante. Yo no lo he comprobado, pero si a alguien le ha gustado mucho este tema ya puede empezar a hacerlo.













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