5. Bucles
En este capítulo aprenderás a repetir cosas con FOR ... NEXT,
WHILE ... WEND y REPEAT ... UNTIL, a meter un bucle dentro de otro y
a esperar con PAUSE.
Contar con FOR ... NEXT
Un bucle repite un grupo de líneas. FOR es el bucle que cuenta:
10 FOR i=1 TO 5
20 PRINT "Vuelta ";i
30 NEXT i
40 PRINT "Terminado!"
FOR i=1 TO 5 da a i el valor 1 y ejecuta las líneas siguientes. Al llegar
a NEXT i, suma 1 a i y vuelve, hasta que i pasa de 5. Así que escribe
de Vuelta 1 a Vuelta 5 y luego Terminado!.
La variable que cuenta (aquí i) tiene que tener un nombre de una sola
letra: FOR vuelta=1 TO 5 es un error.
STEP cambia lo que se suma cada vez, y puede ser negativo o tener
decimales:
10 FOR i=10 TO 0 STEP -2
20 PRINT i;" ";
30 NEXT i
40 PRINT
50 FOR x=0 TO 1 STEP 0.25: PRINT x;" ";: NEXT x
Escribe 10 8 6 4 2 0 y, en la línea siguiente, 0 0.25 0.5 0.75 1. Un
PRINT sin nada detrás solo termina la línea.
Cualquiera de los números puede ser una variable o una cuenta. Aquí tienes una tabla de multiplicar:
10 INPUT "Que tabla? ";t
20 FOR i=1 TO 10
30 PRINT i;" x ";t;" = ";i*t
40 NEXT i
Bucles dentro de bucles
Puedes meter un bucle dentro de otro. Cada uno necesita su letra:
10 FOR f=1 TO 5
20 FOR c=1 TO f
30 PRINT "*";
40 NEXT c
50 PRINT
60 NEXT f
El bucle de fuera cuenta las filas (f); en cada fila, el de dentro escribe
f estrellas. Sale un triángulo:
*
**
***
****
*****
WHILE ... WEND: repetir mientras se cumpla algo
A veces no sabes cuántas veces hay que repetir. WHILE ("mientras") repite
mientras se cumpla una condición, y la comprueba antes de cada vuelta:
10 LET dinero=100: LET t=0
20 WHILE dinero<200
30 LET dinero=dinero*1.1: LET t=t+1
40 WEND
50 PRINT "Se ha doblado en ";t;" vueltas"
Si cada vuelta (un año en el banco, por ejemplo) el dinero crece un 10 %, se dobla en 8. Si la condición no se cumple desde el principio, las líneas de dentro no se ejecutan nunca.
REPEAT ... UNTIL: repetir hasta que pase algo
REPEAT ("repite") comprueba su condición después de cada vuelta, así
que las líneas de dentro se ejecutan al menos una vez. Repite hasta
(UNTIL) que la condición se cumple:
10 RANDOMIZE
20 LET tiradas=0
30 REPEAT
40 LET d=INT (RND*6)+1: LET tiradas=tiradas+1
50 PRINT d;" ";
60 UNTIL d=6
70 PRINT: PRINT "Un seis en ";tiradas;" tiradas"
Con REPEAT, el juego de adivinar del capítulo 4 ya no necesita GO TO:
10 RANDOMIZE
20 LET secreto=INT (RND*100)+1: LET intentos=0
30 REPEAT
40 INPUT "Adivina mi numero (1-100): ";n
50 LET intentos=intentos+1
60 IF n<secreto THEN PRINT n;" es poco"
70 IF n>secreto THEN PRINT n;" es mucho"
80 UNTIL n=secreto
90 PRINT "Si! ";intentos;" intentos"
¿Qué bucle usar? FOR cuando sabes cuántas veces; WHILE cuando puede que
no haga falta ninguna; REPEAT cuando hay que hacerlo al menos una vez.
Esperar: PAUSE
PAUSE n espera n cincuentavos de segundo, así que PAUSE 50 es un
segundo. PAUSE 0 espera hasta que se pulse una tecla. Una tecla también
corta cualquier pausa.
10 FOR n=10 TO 1 STEP -1
20 PRINT n
30 PAUSE 50
40 NEXT n
50 PRINT "Despegue!"
Si conoces el Spectrum: WHILE, WEND, REPEAT y UNTIL son
extensiones de ZX-V; FOR, NEXT y PAUSE funcionan como en el 48K.
Pruébalo
- Escribe los números del 1 al 20 con sus cuadrados (el número por sí mismo).
- Escribe un programa que pida una palabra y la escriba al revés: con
HOLAescribeALOH.
Pista
Para el segundo, p$(i) es la letra número i. Recorre las letras desde
LEN p$ hasta 1 con STEP -1 y escribe cada una seguida de ;.
Una solución para el segundo
10 INPUT "Una palabra? ";p$
20 FOR i=LEN p$ TO 1 STEP -1
30 PRINT p$(i);
40 NEXT i
Referencia: FOR, NEXT,
WHILE, WEND,
REPEAT, UNTIL,
PAUSE.
Siguiente: 6. Matrices y datos · Anterior: 4. Decisiones