Manual de Basic Spectrum 48k.

Capítulo 4

Iteración con bucles

Resumen

  • FOR, NEXT
  • TO, STEP

Suponga que desea introducir 5 números y sumarlos juntos. Una forma (que no le recomendamos que haga la introducción por el teclado a no ser que sea "masoquista") es escribir:

10 LET total=0
20 INPUT a
30 LET total=total+a
40 INPUT a
50 LET total=total+a
60 INPUT a
70 LET total=total+a
80 INPUT a
90 LET total=total+a
100 INPUT a
110 LET total=total+a
120 PRINT total

Este método no es una buena práctica de programación. Puede ser tolerable para cinco números, pero puede imaginar cuán tedioso sería el procedimiento para sumar diez números y en el caso de un centenar sería prácticamente imposible.

Mucho mejor es establecer una variable para contar hasta 5 y luego, interrumpir el programa como en el desarrollo siguiente (que sí le instamos a introducir por el teclado):

10 LET total=0
20 LET cuenta=1
30 INPUT a
40 REM cuenta=numero de veces que a se ha introducido hasta ahora
50 LET total=total+a
60 LET cuenta=cuenta+1
70 IF cuenta<=5 THEN GO TO 30
80 PRINT total

Observe cuán fácil sería cambiar la línea 70 de modo que este programa sume diez números o incluso un centenar.

Esta clase de contaje es tan útil que hay dos comandos especiales para hacerlo más fácil: los comandos u órdenes FOR y NEXT. Siempre se utilizan conjuntamente.

Con el empleo de estos nuevos medios, el programa que acaba de introducir por el teclado realiza exactamente lo mismo que:

10 LET total=0
20 FOR c=1 TO 5
30 INPUT a
40 REM c=numero de veces que a se ha introducido hasta ahora
50 LET total=total+a
60 NEXT c
80 PRINT total

(Para conseguir este programa a partir del anterior, ha de corregir las líneas 20, 40, 60 y 70, TO es SYMBOL SHIFT con F).

Observe que hemos cambiado cuenta por c. La variable de contaje (o variable de control) de un bucle FOR-NEXT debe contener una sola letra para su nombre.

El efecto de este programa es que c opera a través de los valores 1 (el valor inicial), 2,3,4 y 5 (el límite) y para cada uno, se ejecutan las líneas 30, 40 y 50. A continuación, cuando c ha terminado con sus cinco valores, se ejecuta la línea 80.

Una sutileza adicional es que la variable de control no tiene que incrementarse en 1 en cada ocasión, sino que puede cambiar este 1 a cualquier otro valor que desee mediante el empleo de una parte STEP en el comando FOR. La forma más general para un comando FOR es:

FOR variable de control = valor inicial TO límite STEP paso

en donde la variable de control es una sola letra y el valor incial, límite y paso son, en su totalidad, elementos que puede calcular el ordenador como números (como los números reales, o sumas o los nombres de variables numéricas). Por consiguiente, si sustituye la línea 20 en el programa por:

20 FOR c=1 TO 5 STEP 3/2

entonces c operará con los valores 1, 2,5 y 4. Observe que no tiene que limitarse a números enteros y también, que la variable de control no tiene que alcanzar el límite exactamente (mantiene la iteración por bucle en tanto que sea inferior o igual al límite).

Pruebe el siguiente programa para imprimir los números desde 1 a 10 en orden inverso.

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

Anteriormente dijimos que el programa mantiene la iteración por bucle mientras que la variable de control sea inferior o igual al límite. Si profundiza en lo que ello significaría en este caso, constatará que no se trata de algo banal. La regla normal ha de modificarse cuando el paso es negativo pues, entonces, el programa realiza la iteración por bucle en tanto que la variable de control sea superior o igual al límite

Debe tener cuidado si está realizando dos bucles FOR-NEXT conjuntamente, uno en el interior del otro. Pruebe el siguiente programa, que imprime los números correspondientes a un juego completo de dominó (de seis puntos).

10 FOR m=0 to 6                \
20 FOR n=0 to m      \         |
30 PRINT m;":";n;""; | bucle n | bucle m
40 NEXT n            /         |
50 PRINT                       |
60 NEXT m                      /

Puede observar que el bucle n está completamente en el interior del bucle m (se dice que están adecuadamente "anidados" o encajados). Lo que debe evitarse es tener dos bucles FOR-NEXT que se solapen sin estar completamente uno en el interior del otro, somo es el casos que se indica a continuación:

5 REM este programa es erroneo
10 FOR m=0 to 6      \         \
20 FOR n=0 to m      |         |
30 PRINT m;":";n;""; | bucle m | bucle n
40 NEXT m            /         |
50 PRINT                       |
60 NEXT n                      /

Dos bucles FOR-NEXT deben estar uno en el interior del otro o completamente separados.

Otra cosa a evitar es saltar a la parte media de un bucle FOR-NEXT desde el exterior. La variable de control sólo está adecuadamente establecida cuando ejecuta su sentencia FOR y si la omitiera, la sentencia NEXT produciría confusión en el ordenador. Probablemente obtendrá un informe de error con el mensaje NEXT without FOR (NEXT sin FOR) o variable not found (variable no encontrada).

No hay nada que le detenga con el empleo de FOR y de NEXT en un comando directo. Por ejemplo, pruebe:

FOR m=0 to 10: PRINT m: NEXT m

A veces, puede utilizarle como una forma (algo artificial) de eludir la restricción de que no puede realizar la función GO TO en cualquier lugar en el interior de un comando (porque un comando no tiene ningún número de línea). Por ejemplo:

FOR m=0 to 1: STEP 0: INPUT a: PRINT a: NEXT m

El paso (STEP) de cero, en este caso, hace que el comando (u orden) se repita a si mismo "eternamente".

Este procedimiento no es recomendable, porque si se produce un error, entonces habrá perdido el comando y tendrá que volverle a introducir por el teclado (y CONTINUE ya no actuará).

Ejercicios

  1. Una variable de control no sólo tiene un nombre y un valor, como una variable ordinaria, sino tambien un límite, un paso y una referencia a la sentencia después de la sentencia FOR correspondiente. Persuádase a sí mismo de que cuando se ejecuta la sentencia FOR toda esta información esté disponible (utilizando el valor inicial como el primer valor que toma la variable) y también de que esta información es suficiente para que la sentencia NEXT conozca en cuanto incrementar el valor, si ha de saltar hacia atrás y, de ser así, a dónde debe efectuarse el salto.


  2. Ejecutar el tercer programa anterior y luego, teclee:

    PRINT c

    ¿Por qué la respuesta 6 y no 5?

    (Respuesta: El comando NEXT en la línea 60 se ejecuta 5 veces y cada vez se añade 1 a c. La última vez, c se hace 6 y luego, el comando NEXT decide no realizar el bucle hacia atrás, sino seguir adelante, al haber c sobrepasado su límite).

    ¿Qué sucede si pone STEP 2 en la línea 20?


  3. Cambie el tercer programa de modo que en lugar de sumar automáticamente cinco números, le pida que introduzca cuantos números quiera sumar. Cuando ejecute este programa, ¿que sucede si introduce 0, con el signifacado de que no quiere sumar ningún número? ¿Por qué podría esperar que ello causara problemas al ordenador, aunque esté claro lo que usted quiere decir? (El ordenador ha de efectuar una búsqueda para el comando NEXT c, que no suele ser habitualmente necesario). De hecho, todo ello se ha tenido en cuenta.


  4. En la línea 10 del cuarto programa anterior, cambie 10 por 100 y ejecute el programa. Imprimirá los números desde 100 a 89 en la pantalla y luego comunicará el mensaje scroll? en la parte inferior de la pantalla. Ello le da una oportunidad de ver los números que están a punto de desaparecer de la pantalla por la parte superior. Si pulsa n, STOP o la tecla BREAK, el programa se interrumpirá con el informe D BREAK-CONT repeats. Si pulsa cualquier otra tecla, entonces el ordenador imprimirá otras 22 líneas y le interrogará de nuevo con la misma pregunta anterior.


  5. Suprima le línea 30 del cuarto programa. Cuando ejecute el nuevo programa así abreviado, el ordenador imprimirá el primer número y se parará con el mensaje 0 OK. Si teclea:

    NEXT n

    el programa recorrerá una vez el bucle e imprimirá el número siguiente.

Manual de Basic Spectrum 48k.