Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


3.3. Mientras... (while)

Hemos como visto podemos crear estructuras repetitivas con la orden "for". Pero muchas veces no sabremos la cantidad de veces que se debe repetir un bloque de un programa, sino que deberemos repetir mientras se cumpla una condición. La primera forma de conseguirlo es con "while", que se usa:

while condicion do
    Sentencia;

Que se podría traducir como "MIENTRAS se cumpla la condición HAZ sentencia".

Un ejemplo que nos diga el doble de todos los números que queramos podría ser:

(* WHILE1.PAS, "while" para ver el doble de varios numeros *)
(* Parte de CUPAS5, por Nacho Cabanes                      *)

Program While1;

var
    num: integer;

begin
    writeLn('Dime numeros y te dire su doble. Usa 0 para terminar.');
    write( 'Primer numero? ' );
    readLn( num );
    while num <> 0 do
    begin
        writeLn( 'Su doble es ', num*2 );
        write( 'Siguiente numero? ' );
        readLn( num )
    end
end. 

En el ejemplo anterior, sólo se entra al bloque begin-end (una sentencia compuesta) si el primer número es correcto (no es cero). Entonces se escribe su doble, se pide el siguiente número y vuelve a comprobar que sea correcto.

Si ya de principio la condición es falsa, entonces la sentencia no se ejecuta ninguna vez, como ocurre en este ejemplo:

(* WHILE2.PAS, "while" que no se llega a repetir *)
(* Parte de CUPAS5, por Nacho Cabanes            *)

Program While2;

begin
    while (2 < 1) do
        writeLn('Dos es menor que uno');
end. 

Ejercicio propuesto 3.3.1: Crea un programa vaya sumando los números que el usuario introduzca, y mostrando dicha suma, hasta que introduzca el número 0, usando "while".
Ejercicio propuesto 3.3.2: Crea un programa que escriba en pantalla los números del 1 al 10, usando "while".

3.4. Repetir... hasta (Repeat)

Si 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 usa así:

repeat 
    sentencia; 
    (* ... *)
    sentencia; 
    sentencia 
until condicion;

Es decir, REPITE un grupo de sentencias HASTA que la condición sea cierta. Cuidado con eso: 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.

El conjunto de sentencias se ejecutará al menos una vez, porque la comprobación se realiza al final.

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 cuando veamos cómo manejar cadenas de texto y formas de "esconder" lo que se teclea, bien cambiando colores o bien escribiendo asteriscos u otras letras en su lugar:

(* REPEAT1.PAS, comprobacion de una clave de acceso *)
(* Parte de CUPAS5, por Nacho Cabanes               *)

program Repeat1;

var
    ClaveCorrecta, Intento: integer;

begin
    ClaveCorrecta := 123;
    repeat
        WriteLn( 'Introduce la clave de acceso...' );
        ReadLn( Intento )
    until Intento = ClaveCorrecta
    (* Aquí iría el resto del programa *)
end. 

Ejercicio propuesto 3.4.1: Crea un programa que pida números positivos al usuario, y vaya calculando la suma de todos ellos (terminará cuando se teclea un número negativo o cero), usando "repeat".
Ejercicio propuesto 3.4.2: Crea un programa que escriba en pantalla los números pares del 26 al 10 (descen­diendo), usando "repeat".
Ejercicio propuesto 3.4.3: 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"
Ejercicio propuesto 3.4.4: Mejora el programa de la clave de acceso con "repeat" (3.4.3), para que avise si la clave no es correcta.
Ejercicio propuesto 3.4.5: Mejora más todavía el programa de la clave de acceso con "repeat" (3.4.4), para que sólo haya tres intentos.