Saltearse al contenido

Sentencias de repetición

Las sentencias de iteración o repetición permiten ejecutar un bloque de código varias veces, en función de una condición.

Cada ejecución del bloque de código se conoce como iteración, bucle o ciclo. Razón por la cual, a las sentencias de iteración también son denominadas bajo estos nombres.

Entre ellas podemos encontrar a la sentencia while (y su variante do-while) y la sentencia for (y su variante for-each).

Sentencia while

La sentencia while permite ejecutar continuamente un bloque de código, siempre y cuando se cumpla una condición. Es decir, mientras la condición establecida en la sentencia while sea verdadera (true), el bloque de código se ejecutará.

La sintaxis de la sentencia while emplea la palabra reservada del mismo nombre, seguida de una condición entre paréntesis y un bloque de código entre llaves {}.

La condición debe ser una expresión booleana, es decir, una expresión que pueda evaluar a true o false.

1
while (<condición>) {
2
// Bloque de código
3
}

Por ejemplo, el siguiente código muestra los números pares entre 0 y 10 (ambos incluidos).

1
public class EjemploWhile {
2
public static void main(String[] args) {
3
int numero = 0;
4
5
while (numero <= 10) {
6
System.out.println(numero);
7
numero += 2;
8
}
9
}
10
}

En el ejemplo planteado anteriormente, se respetan ambas consideraciones. La condición establecida en la sentencia while es verdadera (true) desde el principio, y la expresión establecida como condición dentro de la sentencia while cambia en cada iteración, se incrementa en 2 unidades (numero += 2). Por lo tanto, jamás se dará lugar a un ciclo infinito.

Sin embargo, existen maneras de interrumpir abruptamente la ejecución de un ciclo, aun cuando la condición establecida se evalúe siempre a true, evitando así, un ciclo infinito. Para lo cual emplearemos nuevamente la palabra reservada break.

Reformulamos el ejemplo anterior, modificando la expresión establecida como condición dentro de la sentencia while con el valor true.

1
public class EjemploWhile {
2
public static void main(String[] args) {
3
int numero = 0;
4
5
while (true) {
6
System.out.println(numero);
7
numero += 2;
8
9
if (numero > 10) {
10
break;
11
}
12
}
13
}
14
}

Como podemos observar, el bloque de código continúa ejecutándose y consultando mediante una sentencia if si el valor de la variable numero es mayor a 10. En cuanto se cumple la condición, se ejecuta la sentencia break, interrumpiendo la ejecución del ciclo.

Si lo analizamos con un poco más de detalle, podemos observar que las condiciones del ejemplo original y el ejemplo reformulado son equivalentes. En el ejemplo original, el bucle continúa ejecutándose mientras la condición se cumpla (numero <= 10). En el ejemplo reformulado, el bucle continúa ejecutándose mientras la condición no se cumpla (numero > 10). Esto se conoce como una condición de salida.

Esto nos indica que, en algunos casos, es conveniente o necesario definir bucles que únicamente se interrumpan cuando se cumpla una condición de salida.

Por ejemplo, muchos programas que emplean una interfaz gráfica (GUI) se ejecutan en un bucle infinito, que únicamente se interrumpe cuando el usuario cierra la ventana principal. Es decir, el bucle se ejecuta mientras la ventana principal esté abierta, y se interrumpe cuando el usuario la cierra.

Sentencia do-while

La sentencia do-while es una variante de la sentencia while. La diferencia radica en que, en la sentencia do-while, el bloque de código se ejecuta al menos una vez, antes de evaluar la condición.

La sintaxis de la sentencia do-while emplea la palabra reservada do, seguida de un bloque de código entre llaves {}. A continuación, se emplea la palabra reservada while, seguida de una condición entre paréntesis.

Al igual que en una sentencia while convencional, la condición debe ser una expresión booleana, es decir, una expresión que pueda evaluar a true o false.

1
do {
2
// Bloque de código
3
} while (<condición>);

Por ejemplo, si deseamos mostrar un menú de opciones al usuario, y ejecutar una acción diferente en función de la opción seleccionada, podemos emplear una sentencia do-while para mostrar el menú al menos una vez, antes de evaluar la opción seleccionada.

1
import java.util.Scanner;
2
3
public class MenuExample {
4
public static void main(String[] args) {
5
Scanner scanner = new Scanner(System.in);
6
int opcion;
7
8
do {
9
System.out.println("===== Menú de Opciones =====");
10
System.out.println("1. Ver Saldo");
11
System.out.println("2. Depositar Dinero");
12
System.out.println("3. Retirar Dinero");
13
System.out.println("4. Salir");
14
System.out.print("Ingrese su opción: ");
15
16
opcion = scanner.nextInt();
17
18
switch (opcion) {
19
case 1:
20
// Aquí debería ir el código para ver el saldo
21
System.out.println("Mostrando saldo...");
22
break;
23
case 2:
24
// Aquí debería ir el código para depositar dinero
25
System.out.println("Depositar dinero...");
26
break;
27
case 3:
28
// Aquí debería ir el código para retirar dinero
29
System.out.println("Retirar dinero...");
30
break;
31
case 4:
32
System.out.println("Saliendo...");
33
break;
34
default:
35
System.out.println("Opción inválida. Intente de nuevo.");
36
}
37
38
} while (opcion != 4);
39
40
scanner.close();
41
}
42
}

Sentencia for

Si bien la sentencia while es muy útil, existen muchos casos en los que las sentencias se emplean para ejecutar un bloque de código un número determinado de veces.

Por ejemplo, si deseamos mostrar los números pares entre 0 y 10 (ambos incluidos), sabemos mucho antes de ejecutar el bucle, que el bloque de código se ejecutará 6 veces (para los números 0, 2, 4, 6, 8 y 10).

En estos casos, es preferible emplear la sentencia for, que permite ejecutar un bloque de código un número conocido de veces.

Por esta razón, la sentencia for suele emplearse para recorrer colecciones de elementos, ya que se conoce de antemano el número de elementos que contiene la colección. Más adelante veremos con más detalle el concepto de colección. Por supuesto, la sentencia for puede emplearse en otros casos que no involucren colecciones.

En Java, la sintaxis de la sentencia for esta conformada por tres partes:

  • Inicialización: se emplea para inicializar una variable de control. Esta parte se ejecuta una sola vez, antes de iniciar el bucle (antes de la primera iteración).
  • Condición de salida: se emplea para establecer una condición de salida del bucle. Esta parte se evalúa antes de cada iteración. Si la condición se cumple (true), el bucle continúa ejecutándose. Si la condición no se cumple (false), el bucle se interrumpe.
  • Paso: se emplea para actualizar la variable de control. Esta parte se ejecuta al final de cada iteración.

Siguiendo las consideraciones anteriores, la sintaxis de la sentencia for es la siguiente:

1
for (<inicialización>; <condición de salida>; <paso>) {
2
// Bloque de código
3
}

Por ejemplo, el siguiente código muestra los números pares entre 0 y 10 (ambos incluidos).

1
public class EjemploFor {
2
public static void main(String[] args) {
3
for (int numero = 0; numero <= 10; numero += 2) {
4
System.out.println(numero);
5
}
6
}
7
}

Como podemos observar, la sentencia for es más compacta que la sentencia while, ya que la inicialización, la condición de salida y la actualización se establecen en una sola línea. Esto permite que el código sea más legible y fácil de entender.

Además, la sentencia for permite declarar un expresión que tienda a decrementar la variable de control, en lugar de incrementarla. Esto se considera como paso negativo. Por ejemplo, el siguiente código muestra los números pares entre 10 y 0 (ambos incluidos).

1
public class EjemploFor {
2
public static void main(String[] args) {
3
for (int numero = 10; numero >= 0; numero -= 2) {
4
System.out.println(numero);
5
}
6
}
7
}

Sentencia for-each

La sentencia for-each es una variante de la sentencia for. La diferencia radica en que, en la sentencia for-each, la variable de control toma el valor de cada elemento de una colección, en cada iteración.

Dado que no hemos hablado de colecciones, no profundizaremos en la sentencia for-each en este momento. Sin embargo, la analizarémos con más detalle posteriormente.