viernes, 4 de octubre de 2013

Introducción a la programación usando BASIC (VI): BUCLES ANIDADOS


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

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


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


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

2 comentarios:

  1. Mucho cariño le tengo al BASIC ya que aprendí a programar con él :)

    Por 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??

    ResponderEliminar
    Respuestas
    1. 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