Artículo publicado en el número 6 de RetroWiki Magazine
BUCLES ANIDADOS.
Los bucles FOR son
sencillos de usar, y podemos anidar unos dentro de otros sin problemas, para
crear estructuras que recorran varias variables a la vez. Como primer ejemplo
muy sencillo crearé un programa que imprime las tablas de multiplicar:
10 PRINT "Tablas de multiplicar"
20 FOR I=1 TO 9
30 PRINT "Tabla del ";I
40 FOR J=1 TO 10
50 PRINT " ";I;"x";J;"=";I*J
60 NEXT J
70 PRINT
80 NEXT I
20 FOR I=1 TO 9
30 PRINT "Tabla del ";I
40 FOR J=1 TO 10
50 PRINT " ";I;"x";J;"=";I*J
60 NEXT J
70 PRINT
80 NEXT I
Vemos que recorremos en I desde 1, imprimimos la cabecera de la tabla, luego
recorremos J desde 1 hasta 10, imprimimos la tabla multiplicando I por J, aumentamos
I en uno, y volvemos a empezar con la cabecera y recorriendo J de 1 a 10, y
así hasta que I alcance 9. Para mejorar la lectura, los bucles se indentan,
y así es más sencillo leer el programa, así que lo reescribo de esta manera:
10 PRINT "Tablas de multiplicar"
20 FOR I=1 TO 9
30 PRINT "Tabla del ";I
40 FOR J=1 TO 10
50 PRINT " ";I;"x";J;"=";I*J
60 NEXT J
70 PRINT
80 NEXT I
20 FOR I=1 TO 9
30 PRINT "Tabla del ";I
40 FOR J=1 TO 10
50 PRINT " ";I;"x";J;"=";I*J
60 NEXT J
70 PRINT
80 NEXT I
El programa es el mismo, pero así es más sencillo leerlo. Lo importante es que
se entienda que el bucle interno, el que recorre J, siempre empieza en 1 cada
vez que llega a la instrucción FOR, es un concepto que suele costar de
entender a los principiantes.
El resultado de la ejecución del programa no es muy bonito, ya que imprime 100
líneas en la pantalla:
Lo mejoraremos, imprimiendo varias tablas en horizontal, así caben más a la
vez en la pantalla, para ello usaremos la instrucción STEP del bucle:
100 PRINT "Tablas de multiplicar"
110 LET C=5
120 FOR I=1 TO 9 STEP C
130 GOSUB 210
140 FOR J=1 TO 10
150 GOSUB 270
160 NEXT J
170 PRINT
180 NEXT I
190 IF (INKEY$="") THEN GOTO 190
200 STOP
210 REM ----- Imprimir la cabecera -------------------------
220 LET A=80/C
230 FOR K=1 TO C
240 PRINT TAB(A*(K-1)); "Tabla del ";I+(K-1);
250 NEXT K
260 RETURN
270 REM ----- Imprimir la linea ----------------------------
280 PRINT
290 LET A=80/C
300 FOR K=0 TO C-1
310 PRINT TAB(A*K); I+K;"x";J;"=";(I+K)*J;
320 NEXT K
330 RETURN
110 LET C=5
120 FOR I=1 TO 9 STEP C
130 GOSUB 210
140 FOR J=1 TO 10
150 GOSUB 270
160 NEXT J
170 PRINT
180 NEXT I
190 IF (INKEY$="") THEN GOTO 190
200 STOP
210 REM ----- Imprimir la cabecera -------------------------
220 LET A=80/C
230 FOR K=1 TO C
240 PRINT TAB(A*(K-1)); "Tabla del ";I+(K-1);
250 NEXT K
260 RETURN
270 REM ----- Imprimir la linea ----------------------------
280 PRINT
290 LET A=80/C
300 FOR K=0 TO C-1
310 PRINT TAB(A*K); I+K;"x";J;"=";(I+K)*J;
320 NEXT K
330 RETURN
Empezamos definiendo en C las columnas que deseamos tener en la pantalla, para
que quepan en una sola usaremos 5 columnas, pero podéis jugar con esta variable
y ver las diferencias. Luego un bucle de 1 a 9 de C en C, imprimimos la cabecera
con GOSUB 210, luego un bucle de 1 a 10 e imprimimos las líneas con otro GOSUB
270. No es necesario hacer esta separación, pero el programa queda más compacto
y legible, además de que podemos cambiar de manera sencilla la parte de la cabecera
o de las líneas, debéis pensar en hacer los programas lo más modulares posibles,
es una buena técnica de programación.
Para imprimir la cabecera dividimos el ancho de la pantalla (80 columnas) entre
las tablas que vamos a imprimir, así tenemos el ancho de cada tabla (80/5=16).
Montamos un bucle desde 1 hasta las columnas a montar, e imprimimos las cabeceras,
para ello usaremos I que nos da la base, y K-1 para recorrer desde 0 hasta 4,
así tendremos I+0, I+1, I+2, I+3, I+4.
Para imprimir las líneas usamos lo mismo, pero recorremos el bucle desde 0 hasta
4 directamente, y así no tenemos que ir restando uno cada vez. Ambos sistemas
son equivalentes, podéis usar el que más os guste o el que mas claro veais.
Ahora el resultado es mejor caben 10 tablas en una sola pantalla, pero ojo, ¿el
bucle no era de 1 hasta 9?, pues sí pero realmente recorre I haciendo igual
a 1 y hace el primer ciclo de 5 tablas, 1+5=6 y hace el segundo ciclo de 5 tablas,
y luego 6+5=11 y salimos del bucle por pasarnos de 9, por tanto realmente solo recorre dos valores al usar un STEP (1 y 6), no los 9 indicados, o los 10 que se imprimem, esto lo he puesto así para que se entienda mejor su uso. Probar con varios valores de C y lo entenderéis
mejor.
Adelante, escribir el programa, mejorarlo, probar cosas, solo se aprende a programar
programando, por tanto no dejéis de buscar problemas sencillos de programación
y solucionarlos con nuestro querido BASIC.
Jose Antonio Vaqué Urbaneja,
podéis contactar conmigo en mi mail
podéis contactar conmigo en mi mail
Mucho cariño le tengo al BASIC ya que aprendí a programar con él :)
ResponderEliminarPor cierto, no sé si sabes que puedes usar las etiquetas < code > y < pre > para conseguir que se muestre así, aunque intuyo que estás usando algún tipo de javascript??
Hola, yo también empecé con Basic, en aquella época era muy habitual que en una máquina que costaba 5 millones de pesetas de hace 30 años, se programara en Basic. Esto lo escribo en Word, y cuando se publica la revista lo copio aqui, no me acordaba del code, lo usaré a partir de ahora, gracias Jose.
Eliminar