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
.
1while (<condición>) {2 // Bloque de código3}
Por ejemplo, el siguiente código muestra los números pares entre 0 y 10 (ambos incluidos).
1public 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
.
1public 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
.
1do {2 // Bloque de código3} 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.
1import java.util.Scanner;2
3public 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 saldo21 System.out.println("Mostrando saldo...");22 break;23 case 2:24 // Aquí debería ir el código para depositar dinero25 System.out.println("Depositar dinero...");26 break;27 case 3:28 // Aquí debería ir el código para retirar dinero29 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:
1for (<inicialización>; <condición de salida>; <paso>) {2 // Bloque de código3}
Por ejemplo, el siguiente código muestra los números pares entre 0 y 10 (ambos incluidos).
1public 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).
1public 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.