Ciclos

Objetivos: Introducir la noción de repetición de instrucciones.

Temas:


Ejercicio 1: ¿Qué despliega el siguiente programa?

    int x= 5;
    x= x+1;
    println(x);
Solución del ejercicio: el programa despliega 6. Primero se evalúa x+1, que es 5+1, es decir 6. Luego se almacena el resultado 6 en la variable x.

Moralejas:

  1. Al evaluar el lado derecho de una asignación, las apariciones de la misma variable que se está asignando deben ser reemplazadas por el valor anterior de la variable.

  2. El símbolo = no significa igualdad (aquí claramente x es distinto de x+1), significa asignar un nuevo valor (almacenar un nuevo valor). Es por esto que en otros lenguajes se opta por usar := para la asignación (como en Pascal).


Ejercicio 2: hacer un programa que sume 3 valores ingresados por el usuario.

Diálogo:

    ? 3
    Total= 3
    ? 10
    Total= 13
    ? 1
    Total= 14
Solución:

    int suma= 0;
    int num;
    print("? ");
    num= readInt(); suma= suma+num;
    print("Total= "); println(suma);
    print("? ");
    num= readInt(); suma= suma+num;
    print("Total= "); println(suma);
    print("? ");
    num= readInt(); suma= suma+num;
    print("Total= "); println(suma);
Es fácil modificar este programa para que ahora sume 20 números, repitiendo las 3 últimas líneas tantas veces como sea necesario. ¿Pero qué pasa si se desconoce la cantidad de valores que desea sumar el usuario?


Instrucción de repetición

Motivación: hacer un programa que sume los valores ingresados por el usuario hasta que ingrese un 0.

    ? 3
    Total= 3
    ? 10
    Total= 13
    ? 1
    Total= 14
    ? 100
    Total= 114
    ? 0
    Fin!
Todos los lenguajes de programación tienen mecanismos para repetir la ejecución de grupos de instrucciones una y otra vez, sin que sea necesario reescribir tales instrucciones. En Java, esto se logra con la instrucción while:

    int suma= 0;
    int num;
    print("? ");
    num= readInt();
    while (num!=0) { 
      suma= suma+num;
      print("Total= "); println(suma);
      print("? ");
      num= readInt();
    }
    println("Fin!");
(Ver el programa completo en Suma.java.)

La instrucción while es una instrucción de control y repite la ejecución de una o más instrucciones una y otra vez, mientras la condición encerrada entre () sea verdadera.

Sintaxis:

while (``condición'') { ``instrucciones'' }

Semántica:

La instrucción while se ejecuta de la siguiente manera:

  1. Se evalúa la condición.

  2. Si la condición es falsa, se termina la ejecución de while, y se prosigue con la instrucción que sigue al while (en este caso println("Fin!")).

  3. Si la condición es verdadera, se ejecutan secuencialmente las instrucciones.

  4. Se re-evalúa la condición.

  5. Si la condición es falsa, se prosigue como en 2.-

  6. Si la condición es verdadera, se prosigue como en 3.-

  7. etc.
Obs.:

Ejecución paso a paso de un programa

Consiste en ejecutar una a una las instrucciones observando los cambios que produce en las variables del programa. Como ejemplo, ejecutaremos paso a paso el programa anterior. Por conveniencia enumeramos las instrucciones:

(1)  int suma= 0;
(2)  int num;
(3)  print("? ");
(4)  num= readInt();
(5)  while (num!=0) {
(6)    suma= suma+num;
(7)    print("Total= "); println(suma);
(8)    print("? ");
(9)    num= readInt();
(10) }
(11) println("Fin!");
Ejecución paso a paso: junto con la traza de las instrucciones que se van ejecutando, se debe ir indicando lo que aparece en pantalla y el contenido de las variables.

(1) suma= 0           (5) verdadera
(2)                   (6) suma= 14
(3)                   (7) y (8)
(4) num= 3            (9) num= 100
(5) verdadera         (5) verdadera
(6) suma= 3           (6) suma= 114
(7) y (8)             (7) y (8)
(9) num= 10           (9) num= 0
(5) verdadera         (5) falsa
(6) suma= 13          (10)
(7) y (8)
(9) num= 1
Obs.:

Ejercicio 3: ejecute paso a paso el siguiente programa.
(1) int x= 15;
(2) int y= 24;
(3) while (x!=y) {
(4)   if (x>y)
(5)     x= x-y;
(6)   else
(7)     y= y-x;
(8) }
(9) println(x);
El diagrama de flujo es:

Solución:

(1) x= 15         (3) v
(2) y= 24         (4) f
(3) v             (7) y= 3
(4) f             (3) v
(7) y= 9          (4) v
(3) v             (5) x= 3
(4) v             (3) f
(5) x= 6          (9)

Ejercicio propuesto:

Ejecute paso a paso el siguiente programa:

    int n= 4;
    double f= 1.0;
    int i= 1;
    while (i<=n) {
      f= f*i;
      i= i+1;
    }
    println(f);