AnteriorPosterior

7. Bucles 1: Mientras (while), contadores

Por: Nacho Cabanes
Actualizado: 19-01-2022 12:14
Tiempo de lectura estimado: 7 min.

 

Versión en video (11:24 min):

Pascal

7. Bucles 1: Mientras (while), contadores

7.1. La orden "while"

Vamos a ver cómo podemos crear fragmentos de un programa que se repitan un cierto número de veces o según se cumpla (o no) una condición. Es lo que se suele llamar bucles (en inglés "loops", que algunos autores traducen como lazos).

Como primera forma de crear estructuras repetitivas, vamos a ver la orden "while", que nos permitirá que un fragmento de programa se repita mientras una condición sea verdadera.

Vamos a usar un ejemplo para ver su necesidad. Partiremos de un programa que nos pida dos números y muestre el resultado de dividir el primero entre el segundo, si el segundo no es cero. Si el segundo es cero, como se trata de una división que no se puede realizar, avisaremos al usuario y le volveremos a pedir el segundo dato:

(*
Dividir un número entre otro,
excepto si es cero.
Primera aproximación (incorrecta), con "if"
*)

program noDividirEntreCero;

var
  dividendo, divisor: integer;

begin
    write('Dime el dividendo: ');
    readln(dividendo);
    write('Dime el divisor: ');
    readln(divisor);

    if divisor = 0 then
    begin
        write('No debe ser 0. Dimelo otra vez: ');
        readln(divisor);
    end;

    writeLn('La división es ', dividendo / divisor);
    readln;
end.

Si lo probamos, veremos que el usuario se puede equivocar más de una vez, y en ese caso, el programa fallará la segunda vez que introduzca el valor 0 para el divisor.

Por eso, la pregunta que debemos hacernos es ¿puede ocurrir el error más de una vez? En caso de que la respuesta sea "sí", deberemos cambiar ese "if" (si) por un "while" (mientras). En este caso, eso permitirá pedir el divisor al usuario tantas veces como sea necesario, mientras siga introduciendo un valor inadecuado.

La orden "while" no va seguida de "then", sino de "do" (mientras ... haz ...), por lo que el programa anterior quedaría así:

(*
Dividir un número entre otro,
excepto si es cero.
Segunda versión, con "while"
*)

program noDividirEntreCero2;

var
  dividendo, divisor: integer;

begin
    write('Dime el dividendo: ');
    readln(dividendo);
    write('Dime el divisor: ');
    readln(divisor);

    while divisor = 0 do
    begin
        write('No debe ser 0. Dimelo otra vez: ');
        readln(divisor);
    end;

    writeLn('La división es ', dividendo / divisor);
    readln;
end.

Un segundo ejemplo, que nos dijera el doble de cada número que introduzca el usuario, y que se repita mientras que el número introducido no sea un cero, podría ser así:

(* WHILE1.PAS, "while" para ver el doble de varios numeros *)
(* Curso de Pascal, 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.

7.2. Contadores

Es muy frecuente necesitar crear un "contador" para que un bloque de programa se repita una cantidad concreta de veces. Veremos más adelante otra orden más adecuada para crear contadores, la orden "for", pero "while" también nos puede servir: bastará con dar un cierto valor inicial a una variable, repetir algo mientras no supere un cierto valor límite, e incrementaar el valor de esa variable al final d cada repetición, como en el siguiente ejemplo:

(* Contar de 1 a 5, con while         *)
(* Curso de Pascal, por Nacho Cabanes *)

program contador1;

var
    i: integer;

begin
    i := 1;
    while i <= 5 do
    begin
        write(i, ' ');
        i := i + 1;
    end
end.

Por supuesto, se puede usar el contador sin necesidad de mostrarlo en pantalla. Por ejemplo, podemos escribir 5 veces la palabra Hola, haciendo apenas un pequeño cambio en el programa anterior:

(* Hola 5 veces, con while            *)
(* Curso de Pascal, por Nacho Cabanes *)

program contador2;

var
    i: integer;

begin
    i := 1;
    while i <= 5 do
    begin
        write('Hola ');
        i := i + 1;
    end
end.

Vamos a practicarlo con algún ejercicio...

Ejercicios propuestos

Ej.07.01: Crea un programa que pida al usuario dos números enteros y muestre el valor de suma. Luego pedirá otros dos y mostrará su suma, y así sucesivamente, mientras que no sean cero ambos números.

Ej.07.02: La raíz cuadrada de un número x se puede calcular con "sqrt(x)" (se usa la palabra "sqrt" como abreviatura de "square root"). Haz un programa que pida al usuario un número y muestre su raíz cuadrada, luego otro, hasta que el número introducido sea negativo, momento en el que se mostrará el mensaje "No se puede hallar la raíz de un número negativo" y terminará el programa.

Ej.07.03: Escribe los números pares del 2 al 10, creando un contador.

31172 visitas desde el 14-05-2019

AnteriorPosterior