8. Bucles 2: Repetir... hasta (Repeat... until)
Versión en video (8:18 min):
Pascal
8. Bucles 2: Repetir... hasta (Repeat... until)
8.1. La orden "repeat"
Una peculiaridad del bloque "while" es que, en caso de que la condición sea falsa inicialmente, no se repetirá nada, como ocurre en el siguiente ejemplo:
(* WHILE2.PAS, "while" que no se llega a repetir *)
(* Curso de Pascal, por Nacho Cabanes *)
Program While2;
begin
while 2 < 1 do
writeLn('Dos es menor que uno');
end.
Si, por el contrario, queremos asegurarnos de que el bloque repetitivo se ejecute al menos una vez, deberemos comprobar la condición al final. Para eso tenemos la estructura repeat...until, que se utiliza así:
repeat
sentencia2;
sentencia1;
(* ... *)
sentenciaM;
sentenciaN
until condicion;
Es decir, repite un grupo de sentencias hasta que la condición sea cierta.
Un detalle adicional que es necesario enfatizar es que se trata de un grupo de sentencias, no sólo una, como ocurría en "while", de modo que ahora no necesitaremos "begin" y "end" para crear sentencias compuestas.
Además, la condición será la opuesta al caso de usar un while: "mientras sea positivo" es lo mismo que decir "hasta que sea negativo o cero".
Como último detalle, de menor importancia, no hace falta terminar con punto y coma la sentencia que va justo antes de "until", al igual que ocurre con "end".
Un ejemplo clásico del uso de repeat..until es un programa de "clave de acceso", como éste, que iremos mejorando posteriormente, cuando veamos cómo manejar cadenas de texto y formas de "esconder" lo que se teclea (por ejemplo, cambiando colores o escribiendo asteriscos):
(* REPEAT1.PAS, comprobacion de una clave de acceso *)
(* Curso de Pascal, por Nacho Cabanes *)
program Repeat1;
var
claveCorrecta, intento: integer;
begin
claveCorrecta := 1234;
repeat
WriteLn( 'Introduce la clave de acceso...' );
ReadLn( intento )
until intento = claveCorrecta;
WriteLn( 'Acceso concedido' );
(* Aquí iría el resto del programa *)
end.
Es habitual mejorarlo un poco, incluyendo un aviso al usuario en caso de que la contraseña introducida no sea la correcta:
(* REPEAT2.PAS, comprobacion de una clave de acceso *)
(* Curso de Pascal, por Nacho Cabanes *)
program Repeat2;
var
claveCorrecta, intento: integer;
begin
claveCorrecta := 1234;
repeat
WriteLn( 'Introduce la clave de acceso...' );
ReadLn( intento )
if intento <> claveCorrecta then
WriteLn( 'Acceso no permitido' );
until intento = claveCorrecta;
WriteLn( 'Acceso concedido' );
(* Aquí iría el resto del programa *)
end.
8.2. Bucles sin fin
Un bucle "while" cuya condición sea siempre "cierta" será un bucle sin fin, como en este ejemplo:
(* Bucle sin fin, con "while" *)
(* Curso de Pascal, por Nacho Cabanes *)
Program BucleSinFin1;
begin
while 1 = 1 do
write('Hola ');
end.
Se puede conseguir los mismo con un "repeat ... until" cuya condición sea siempre falsa:
(* Bucle sin fin, con "repeat" *)
(* Curso de Pascal, por Nacho Cabanes *)
Program BucleSinFin2;
begin
repeat
write('Hola ');
until 1 = 2;
end.
Ejercicios propuestos
Ej.08.01: Crea un programa que pida números positivos al usuario, y vaya calculando la suma de todos ellos, usando "repeat". Terminará cuando se teclea un número negativo o cero.
Ej.08.02: Crea un programa que pida al usuario su código de usuario y su contraseña (ambos serán números enteros), y no le permita seguir hasta que introduzca como código "1000" y como contraseña "1234", usando "repeat"
Ej.08.02: Crea una versión mejorada del ejercicio anterior (08.01), que sólo permita tres intentos.