TEMA 1.9
ESTRUCTURA DE REPETICIÓN FOR...NEXT





1.9.1 - Introducción a estructuras de control repetitivas

En los siguientes temas vamos a ver las instrucciones que existen en la Programación Estructurada para conseguir que un bloque de instrucciones se puedan ejecutar más de una vez sin necesidad de escribirlas repetidas en el listado del código fuente del programa.

En lenguaje ensamblador y en las versiones antiguas da BASIC se usan instrucciones de tipo GOTO que continúan la ejecución del programa en otra parte, pero esto da lugar a programas muy reliados (Código "espagueti") que son muy difíciles de depurar y pueden contener errores. Para solucionar el problema en la Programación Estructuradas existen estructuras de control que encierran un conjunto de instrucciones (con una instrucción al principio y otra al final) y lo que hacen es ejecutar el bloque de instrucciones entero un número determinado de veces, mientras se cumpla una condición o hasta que se cumpla una condición, según sea la estructura. A estas estructuras también se las conoce como "Bucles" o "Lazos".





1.9.2 - Cómo detener un programa

Al usar estas estructuras nos podemos encontrar con el problema de que si el programa no está escrito correctamente nunca se salga de la estructura de control produciéndose el efecto llamado "Bucle infinito" que puede llegar a bloquear el ordenador.

En un programa normal ya compilado y terminado que se ejecute bajo Windows puede pasar que el ordenador se bloquee y aparezca una pantalla azul recuerdo de Bill Gates de tipo "El sistema está ocupado o no responde...", con lo que casi seguro que vamos a tener que reiniciar el ordenador.

En los entornos de programación esto normalmente no llegará a ocurrir. En caso de que nuestro programa se bloquee puede que se agoten los recursos del sistema y el programa se detenga dando un error de tiempo de ejecución y volviendo al editor de código.

Si el programa se queda bloqueado se puede pulsar la siguiente combinación de teclas:

Control + Pausa

para detener la ejecución del programa y volver al editor de código donde habrá que repasar el código para que esto no ocurra y el programa funcione siempre bien. En algunos casos tras pulsar esta combinación de teclas habrá que pulsar una vez la tecla ENTER para desbloquear el programa.





1.9.3 - Instrucción FOR...NEXT

Empecemos con un ejemplo como siempre. Vamos a escribir un programa que escriba los números del 1 al 5 usando las instrucciones que ya conocemos.

CLS
PRINT 1
PRINT 2
PRINT 3
PRINT 4
PRINT 5

Como se puede ver es un programa bastante tonto. Hay cinco instrucciones casi iguales. Solo cambia el valor de la expresión que cada vez vale lo que en la instrucción anterior más uno, por lo tanto también podíamos haber hecho esto:

CLS
n = 0
n = n + 1
PRINT n
n = n + 1
PRINT n
n = n + 1
PRINT n
n = n + 1
PRINT n
n = n + 1
PRINT n

Se puede comprobar que el resultado es el mismo que en el programa anterior y ahora sí que tenemos cinco pares de instrucciones completamente idénticos. Vamos a hacer el mismo programa con la nueva instrucción FOR ("Para" en castellano):

CLS
FOR n = 1 TO 5
	PRINT n
NEXT

Ya está. Mira que sencillo, pero ahora viene la explicación.

Esto lo que hace es que se ejecute lo que hay entre el FOR y el NEXT cinco veces siguiendo estos pasos:

Todo esto puede parecer muy complicado, pero con la práctica conseguiremos que esta sea una de las instrucciones más fáciles de entender de la programación, sólo habrá que detenerse a pensar en estos pasos cuando algún programa no haga lo que queremos y no demos con el error.

Veamos la sintaxis de la instrucción FOR:

FOR contador = inicio TO final
	bloqueInstrucciones
NEXT

contador es la variable que usaremos como contador (el FOR la modifica automáticamente) y tendrá que ser de tipo numérico, normalmente entero aunque también puede ser real. Ya hemos hablado de los contadores en el tema de los operadores de asignación.

inicio es una expresión numérica cuyo valor tomará el contador la primera vez.

final es una expresión numérica cuyo valor lo usará el FOR de forma que solo entrará si el contador no supera al valor de esta expresión. En nuestro ejemplo el final era 5 y cuando el contador (n) llegaba a valer 6 ya no entrábamos.

Ahora vamos a ver dos normas muy importantes que hay que seguir siempre con los contadores de los FOR

Estas normas nos las podríamos saltar sin dar un error de ejecución, pero puede que el mismo algoritmo de distintos resultados en distintas versiones de BASIC, ya que el contador es manejado internamente por el intérprete del lenguaje de programación y puede que no siempre se haga de la misma forma.

Los valores inicio y fin no tienen por que ser expresiones constantes. En este ejemplo escribiremos los números desde uno hasta donde quiera el usuario:

CLS
INPUT "Escribe hasta dónde quieres llegar: ", max
FOR n = 1 TO max
	PRINT n
NEXT

No es necesario que tengamos que usar siempre el valor del contador para calcular algo. Este FOR escribe "Hecho en Ronda" siete veces:

FOR n = 1 TO 7
	PRINT "Hecho en Ronda"
NEXT

y este hace exáctamente lo mismo:

FOR n = 82 TO 88
	PRINT "Hecho en Ronda"
NEXT

El siguiente escribe los pares del 2 al 10, es decir, 2, 4, 6, 8, 10.

FOR n = 1 TO 5
	PRINT n * 2
NEXT

En QBasic hay una forma de hacer esto más fácilmente:

FOR n = 2 TO 10 STEP 2
	PRINT n
NEXT

Antes veíamos que el FOR incrementa automáticamente al contador en 1 en cada pasada. Usando la palabra clave STEP seguida de una expresión numérica conseguimos modificar este incremento.

Otro ejemplo con STEP que se explica solo.

CLS
INPUT "Escribe un número: ", s
PRINT "Estos son los números del 0 al 100 de "; s; " en "; s
FOR n = 0 TO 100 STEP s
	PRINT n
NEXT

Todo esto funciona muy bien, espero que se entienda. Pero puede surgir una duda, supongamos que escribimos el número 7 y el programa escribe de siete en siete, dando este resultado:

Escribe un número: 7
Estos son los números del 0 al 100 de 7 en 7
0
7
14
21
28
35
42
49
56
63
70
77
84
91
98

Como se puede ver, no se ha alcanzado el 100 es porque el siguiente valor que sería el 105 ya supera al 100 que es valor final del FOR y no se ejecuta.

También puede ocurrir que la expresión del STEP valga 0. En este caso el FOR incrementará en cero el contador con lo que nunca se llegará al valor final y se producirá un bucle infinito. Habrá que pulsar Ctrl+Pausa para detener el programa y corregir el código.

Ahora ya podemos hacer que un FOR funcione hacia atrás, escribiendo la expresión final menor que la inicial y una expresión negativa en el STEP. Como ejemplo un FOR que escriba los números del 10 al 1.

FOR n = 10 TO 1 STEP -1
	PRINT n
NEXT

Si no usamos el STEP negativo y escribimos el valor final menor que el inicial, nunca se ejecutará el bloque FOR. Si un programa no funciona bien porque un FOR no se ejecuta nunca será conveniente revisar esto.

Como siempre, dentro del bloque FOR puede ir cualquier tipo de instrucciones, incluido otro FOR. Veamos un ejemplo:

FOR i = 1 TO 8
	FOR j = 1 TO 5
		PRINT "Hola"
	NEXT
NEXT

¿Cuantas veces escribirá "Hola" este programa? Si el FOR interior se ejecuta entero 8 veces y cada vez escribe "Hola" 5 veces, en total lo hará 8 por 5 igual a 40 veces, es decir, el producto.

Este tipo de instrucciones son especialmente útiles en algoritmos que ya veremos más adelante como el recorrido de matrices.
Hay que tener cuidado de no usar la misma variable contador para los dos FOR, ya que romperíamos la regla de no modificar el valor del contador del primer FOR y el programa no funcionaría bien.

QBasic permite escribir a continuación del NEXT el nombre del contador del FOR, por ejemplo:

FOR i = 1 TO 8
	FOR j = 1 TO 5
		PRINT "Hola"
	NEXT j
NEXT i

Esto puede ser útil para saber en un listado muy complicado a que FOR corresponde cada NEXT, pero si encolumnamos correctamente nuestro programa esto no será necesario.

El FOR en Basic es bastante flexible. En otros lenguajes funciona de otra forma o incluso puede que ni siquiera exista, ya que como veremos a continuación no es imprescindible para construir un algoritmo.













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