Apuntes Java: Control de la ejecución – II

Iteraciones con while

Sintaxis formato 1:

while (expresión_booleana)
    bloque_de_código

Sintaxis formato 2:

do
    bloque_de_código
while (expresión_booleana)

La sentencia o bloque se sentencias (se aplica la misma idea que para el if-else) se ejecuta mientras que la expresion_booleana se evalue como true

La diferencia entre ambos formatos es que en el primero la expresión se evalúa al principio del bloque de sentencias y en el segundo se evalúa al final.

Ejemplo:

int contador = 0;
while (contador < 5) {
    contador++;
}

La variable contador va incrementándose en cada ejecución del bucle hasta que alcanza el valor de 5, momento en que deja de ejecutarse, pasando la ejecución a la siguiente sentencia.

Iteraciones con for

El formato es:

for ( [inicializacion] ; [expresion_booleana] ; [incremento] )
    bloque_de_código

inicializacion es una sentencia que se ejecuta la primera vez que se entra en el bucle for . Normalmente es una asignación. Es opcional.

expresion_booleana es una expresión que se evalua antes de la ejecución de la sentencia, o bloque de sentencias, para cada iteración. La sentencia o bloque de sentencias se ejecutan mientras que la expresion_booleana se evalue como cierta. Es opcional.

incremento es una sentencia que se ejecuta cada vez que se llega al final de la sentencia o bloque de sentencias. Es opcional.

Una utilización clásica de un bucle de tipo for se muestra a continuación para evaluar un contador un número fijo de veces:

for ( int i = 1 ; i <= 10 ; i++ )
   bloque_de_código

La sentencia (o bloque de sentencias) se evaluará 10 veces. En cada ejecución (pasada) el valor de la variable i irá variando desde 1 hasta 10 (inclusive). Cuando salga del bloque de sentencias i estará fuera de su ámbito (porque se define en el bloque for).

Si se omiten las tres clausulas del bucle se obtiene un bucle infinito:

for ( ; ; )
   bloque_de_código

Obsérvese que se pueden omitir las clausulas pero no los separadores (;).

Ejemplo: Cálculo del factorial de un número: n! = n x (n-1) x (n-2) . . .  x 1

long factorial (long n) {
    long f = 1;
    for (long i = 2 ; i <= n ; i++) {
        f *= i;
    }
    return f;
}

Existe un segundo formato para el bucle for que se verá en la lección Arrays.

break y continue

Ya hemos visto en la lección el uso de break en la sentencia de evaluación múltiple switch, como una forma de finalizar la ejecución de un bloque de código asociado a una cláusula case. Además de este uso, y con el mismo significado se puede usar la cláusula break en un bucle while o for para finalizar la ejecución del mismo, independientemente de las condiciones de finalización del propio bucle.

El uso de break es típico en las iteraciones en las que se busca algo (un número en una lista, por ejemplo), como una forma de interrumpir la búsqueda una vez que se ha encontrado el objeto buscado, o como una forma de salir de un bucle infinito. Por ejemplo:

for ( ; ;) {
    . . . 
    if (. . . ) break;
}

Por otra parte, la cláusula continue permite finalizar la iteración en curso, en un bucle while o for, sin ejecutar el resto de las sentencias, pasando a evaluar directamente la expresión del bucle. Por ejemplo:

for (float i = 1 ; i < 10 ; i++) {
    if (i % 2 == 0) continue;
    System.out.println(i + " es impar");
}
  • i % 2 calcula el resto de la división i/2
  • System.out.println envia a la salida estándar el texto que se pasa como parámetro. Se pueden concatenar expresiones númericas y Strings con el símbolo +, como en el ejemplo.
  • La salida del programa sería:
1 es impar
3 es impar
5 es impar
7 es impar
9 es impar

Bucles anidados

Es posible colocar un bucle for en el bloque de código correspondiente a otro bucle for. Cuando se hace esto se dice que ambos bucles están anidados. Cuando esto sucede, para cada iteración del bucle más externo se produce todo el conjunto de iteraciones previsto para el bucle más interno. Por ejemplo:

for (int i = 0 ; i < 3 ; i++) {
for (int j = i ; j < 3 ; j ++) {
System.out.println("i vale " + i + " y j vale " + j);
}
}
  • Las llaves {} no son necesarias, ya que hay una sóla sentencia por bucle, pero se añade para clarificar la sintaxis.
  • La salida del programa sería:
i vale 0 j vale 0
i vale 0 j vale 1
i vale 0 j vale 2
i vale 1 j vale 1
i vale 1 j vale 2
i vale 2 j vale 2

Si se usa la cláusula break en un bucle anidado se produce la finalización del bucle más interno únicamente.

Última actualización: 4/11/2016