11 septiembre 2014

Pascal - 3b: while, repeat .. until

Comienza el curso escolar, así que va siendo el momento de completar la versión "blog" (reducida) del curso de Pascal... vamos con ello...

3.3. Mientras... (while)

Hemos visto como 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. 
 

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. 
 


(Como siempre, más detalles, junto con ejercicios propuestos, en la página oficial del curso)