6. Los bucles (1): FOR
BASIC
6. Los bucles (1): FOR
Llamaremos "bucle" a una parte del programa que se repite un cierto número de veces. En BASIC, la forma más estándar de conseguirlo es con la orden FOR, que vamos a ver directamente con un ejemplo:
10 REM Escribimos un saludo 10 veces
20 FOR i = 1 TO 10
30 PRINT "Hola"
40 PRINT "Como estas?"
50 NEXT i
60 PRINT "Se acabaron las repeticiones"
(Fuente "0601.bas". Probado en GwBasic 2.02, Locomotive Basic de Amstrad CPC, Commodore 64 Basic V2, Msx Basic 2.1)
En español, este FOR se podría traducir como un "Desde", de modo que la línea 20 sería "desde que i valga 1 hasta 10", es decir estamos usando una variable auxiliar, que comenzará valiendo 1, y el trozo de programa se repite hasta que esa variable i valga 10, aumentando de 1 en 1.
La línea 50 indica el final de la parte que se repite, y hace que se pase al próximo (next) valor de la variable i. Es decir, hace que pase de 1 a 2 y que se vuelvan a repetir las líneas 30 y 40; en la siguiente pasada, i aumenta de 2 a 3, y se vuelven a repetir las líneas 30 y 40; así sucesivamente, hasta que i vale 10, momento en que dejan de repetirse las líneas 30 y 40.
El resultado de este programa será:
Hola
Como estas?
Hola
Como estas?
Hola
Como estas?
Hola
Como estas?
Hola
Como estas?
Hola
Como estas?
Hola
Como estas?
Hola
Como estas?
Hola
Como estas?
Hola
Como estas?
Se acabaron las repeticiones
Es muy frecuente emplear la orden FOR para contar, aprovechando eso de que la variable aumenta desde un valor que indicamos hasta el otro. Por ejemplo, podemos contar del 1 al 8 así:
10 REM Escribimos del 1 al 8
20 FOR n = 1 TO 8
30 PRINT n
40 NEXT n
(Fuente "0602.bas". Probado en GwBasic 2.02, Locomotive Basic de Amstrad CPC, Commodore 64 Basic V2, Msx Basic 2.1)
que escribiría lo siguiente en pantalla:
1
2
3
4
5
6
7
8
Ejercicio propuesto 6.1: Crea un programa que escriba los números del 10 al 20.
O podemos escribir la tabla de multiplicar del 5 así:
10 REM Tabla de multiplicar del 5
20 FOR factor = 1 TO 10
30 PRINT "5 x "; factor; " vale: ";
40 PRINT factor * 5
50 NEXT factor
(Fuente "0603.bas". Probado en GwBasic 2.02, Locomotive Basic de Amstrad CPC, Msx Basic 2.1)
El resultado de este programa sería:
5 x 1 vale: 5
5 x 2 vale: 10
5 x 3 vale: 15
5 x 4 vale: 20
5 x 5 vale: 25
5 x 6 vale: 30
5 x 7 vale: 35
5 x 8 vale: 40
5 x 9 vale: 45
5 x 10 vale: 50
(Nota: en el BASIC de los Commodore 64, no se permite usar como contador la palabra "factor"; si se cambia por "fact" o alguna más breve, funcionará correctamente).
Ejercicio propuesto 6.2: Crea un programa que escriba la tabla de multiplicar de un número escogido por el usuario.
No necesariamente tenemos que contar de uno en uno. Para ello se emplea la orden STEP (paso, en inglés). Por ejemplo, podemos escribir los número pares del 2 al 20 así:
10 REM Numeros pares del 1 al 20
20 FOR n = 2 TO 20 STEP 2
30 PRINT n
40 NEXT n
(Fuente "0604.bas". Probado en GwBasic 2.02, Locomotive Basic de Amstrad CPC, Commodore 64 Basic V2, Msx Basic 2.1)
Ejercicio propuesto 6.3: Crea un programa que escriba los 10 primeros múltiplos de 3, usando STEP (3, 6, 9, ... hasta llegar a 30).
También podemos contar "hacia atrás", si usamos un paso negativo:
10 REM Descontar desde 10 hasta 0
20 FOR x = 10 TO 0 STEP -1
30 PRINT x
40 NEXT x
(Fuente "0605.bas". Probado en GwBasic 2.02, Locomotive Basic de Amstrad CPC, Commodore 64 Basic V2, Msx Basic 2.1)
Ejercicio propuesto 6.4: Crea un programa que escriba tantos asteriscos (en la misma línea) como indique el usuario.
Podemos incluir un FOR dentro de otro. Por ejemplo, podríamos escribir la tabla de multiplicar completa (de todos los números del 1 al 10) así:
10 REM Tabla de multiplicar completa
20 FOR tabla = 1 TO 10
30 FOR factor = 1 TO 10
40 PRINT tabla; " x "; factor; " vale: ";
50 PRINT tabla * factor
60 NEXT factor
70 PRINT : REM Linea en blanco entre tablas
80 NEXT tabla
(Fuente "0606.bas". Probado en GwBasic 2.02, Locomotive Basic de Amstrad CPC, Msx Basic 2.1)
(Nota: nuevamente, en el BASIC de los Commodore 64, no podremos usar la variable "factor"; que deberíamos cambiar "fact" o alguna más breve).
En este programa he ido escribiendo un poco más a la derecha lo que dependía de cada FOR, para intentar que resulte más legible. Esto es lo que se conocer como "escritura indentada", y yo lo comenzaré a emplear a partir de ahora.
El resultado de este programa debería ser algo así:
1 x 1 vale: 1
1 x 2 vale: 2
1 x 3 vale: 3
[... (muchas mas lineas aqui en medio) ...]
9 x 7 vale: 63
9 x 8 vale: 72
9 x 9 vale: 81
9 x 10 vale: 90
10 x 1 vale: 10
10 x 2 vale: 20
10 x 3 vale: 30
10 x 4 vale: 40
10 x 5 vale: 50
10 x 6 vale: 60
10 x 7 vale: 70
10 x 8 vale: 80
10 x 9 vale: 90
10 x 10 vale: 100
_Ejercicio propuesto 6.5: Crea un programa que escriba un rectángulo de asteriscos, con la anchura y altura que indique el usuario. Sería algo como:
Anchura? 5
Altura? 3
*****
*****
*****
En la mayoría de las versiones de BASIC no es necesario detallar después de la palabra NEXT el nombre de la variable a la que se refiere, porque el propio intérprete de BASIC será capaz de deducirlo:
10 REM Numeros pares del 1 al 20
20 FOR n = 2 TO 20 STEP 2
30 PRINT n
40 NEXT : REM Se sobreentiende que es "n"
(Fuente "0607.bas". Probado en GwBasic 2.02, Locomotive Basic de Amstrad CPC, Commodore 64 Basic V2, Msx Basic 2.1)
Aun así, en programas grandes, puede ser interesante conservar el nombre de la variable, buscando una mayor legibilidad.
Nota: Los ejemplos de este apartado deberían funcionar en Basic256 sin grandes cambios. Apenas sería necesario recordar quitar los números de línea y que no se pueden escribir varios textos distintos con una misma orden PRINT, de modo que la tabla de multiplicar se escribiría con
REM Tabla de multiplicar del 5
FOR factor = 1 TO 10
PRINT "5 x ";
PRINT factor;
PRINT " vale: ";
PRINT factor * 5
NEXT factor
(Fuente "0608.bas". Probado en Basic256)
Ejercicio propuesto 6.6: Crea un programa que te pida tu nombre y un número, y escriba tu nombre tantas veces como indique ese número.
_Ejercicio propuesto 6.7: Crea un programa que escriba un triángulo decreciente formado por asteriscos, cuya altura escogerá el usuario, así:
> ****
> ***
> **
> *_
Más adelante veremos otras órdenes más sofisticadas para controlar partes del programa que se repitan, como es el caso de WHILE.