Saltar al contenido principal

Bucles for

En Java 0 repetíamos una instrucción escribiéndola varias veces. Eso funciona para dos o tres repeticiones, pero resulta frágil cuando queremos mostrar cien valores, sumar un intervalo o construir una tabla. Un bucle permite expresar la repetición una sola vez.

Usamos for cuando conocemos el recorrido: sabemos cuándo empieza, hasta dónde llega y cómo avanza.

Un contador que cambia​

for (int numero = 1; numero <= 5; numero++) {
System.out.println(numero);
}

El encabezado tiene tres partes:

int numero = 1  → inicialización: ocurre una vez
numero <= 5 → condición: se comprueba antes de cada vuelta
numero++ → actualización: ocurre al terminar cada vuelta

El recorrido es:

Vueltanumero antes de imprimir¿numero <= 5?
11true
22true
33true
44true
55true
fin6false

Cuando la condición es falsa, el cuerpo ya no se ejecuta.

Práctica inmediata​

Predice la salida antes de ejecutar:

for (int numero = 2; numero <= 10; numero += 2) {
System.out.println(numero);
}

La actualización suma 2, por lo que muestra 2, 4, 6, 8 y 10.

Recorridos ascendentes y descendentes​

El contador no tiene que empezar en 1 ni avanzar de uno en uno:

for (int cuenta = 5; cuenta >= 1; cuenta--) {
System.out.println(cuenta);
}
System.out.println("¡Despegue!");

Aquí la condición permite continuar mientras cuenta sea al menos 1, y cuenta-- reduce su valor.

Mini reto: múltiplos​

Muestra los múltiplos de 3 desde 3 hasta 18.

for (int numero = 3; numero <= 18; numero += 3) {
System.out.println(numero);
}

La actualización representa directamente el salto entre dos múltiplos consecutivos.

Acumular resultados​

Un contador suele registrar cuántas veces ocurre algo. Un acumulador conserva un resultado que crece en cada vuelta.

Para sumar del 1 a un límite:

int limite = 5;
int suma = 0;

for (int numero = 1; numero <= limite; numero++) {
suma = suma + numero;
}

System.out.println("Suma: " + suma); // 15

suma debe declararse antes del bucle. Si la reiniciáramos a 0 dentro, perderíamos el resultado anterior en cada vuelta.

Para un producto, el valor inicial suele ser 1:

int producto = 1;

for (int numero = 1; numero <= 4; numero++) {
producto *= numero;
}

System.out.println(producto); // 24

Empezar en 0 haría que todos los productos siguientes continuaran valiendo 0.

Contar los valores que cumplen una condición​

int cantidadPares = 0;

for (int numero = 1; numero <= 10; numero++) {
if (numero % 2 == 0) {
cantidadPares++;
}
}

System.out.println("Pares: " + cantidadPares); // 5

El bucle visita todos los valores, pero el contador solo cambia cuando el resto de dividir entre 2 es cero.

Tabla de multiplicar​

int tabla = 7;

for (int factor = 1; factor <= 10; factor++) {
int resultado = tabla * factor;
System.out.println(tabla + " x " + factor + " = " + resultado);
}

La variable resultado se crea de nuevo en cada vuelta porque solo necesitamos el producto actual.

Bucles anidados, con moderación​

Podemos colocar un bucle dentro de otro. El interior completa todas sus vueltas por cada vuelta del exterior:

for (int fila = 1; fila <= 3; fila++) {
for (int columna = 1; columna <= 4; columna++) {
System.out.print("*");
}
System.out.println();
}

La salida tiene tres filas y cuatro columnas:

****
****
****

Todavía no necesitamos estructuras más complejas: basta con observar que el bucle interior empieza y termina tres veces.

Errores habituales​

Una condición que nunca termina​

for (int numero = 1; numero <= 5; numero--) {
System.out.println(numero);
}

El contador disminuye, por lo que siempre seguirá siendo menor o igual que 5. La actualización correcta para este recorrido era numero++.

Confundir < y <=​

for (int numero = 1; numero < 5; numero++) {
System.out.println(numero);
}

Muestra del 1 al 4. Si 5 también forma parte del intervalo, necesitamos <= 5. Este desplazamiento de una posición se conoce como error off-by-one.

Reiniciar el acumulador​

for (int numero = 1; numero <= 5; numero++) {
int suma = 0;
suma += numero;
}

Además de perder la suma anterior, suma deja de existir al terminar cada vuelta. Debe declararse antes del for.

Ejercicio: resumen de un intervalo​

Escribe un programa que, para los números del 1 al 20:

  • muestre los que sean múltiplos de 4;
  • cuente cuántos ha mostrado;
  • calcule su suma.

Antes de programar, predice el resultado: deben aparecer 4, 8, 12, 16 y 20; la cantidad será 5 y la suma 60.

Solución razonada​

public class ResumenMultiplos {
public static void main(String[] args) {
int cantidad = 0;
int suma = 0;

for (int numero = 1; numero <= 20; numero++) {
if (numero % 4 == 0) {
System.out.println(numero);
cantidad++;
suma += numero;
}
}

System.out.println("Cantidad: " + cantidad);
System.out.println("Suma: " + suma);
}
}

El for controla el intervalo. La condición selecciona los múltiplos, mientras cantidad y suma conservan información entre vueltas.

Más adelante utilizaremos for para recorrer las posiciones de un array. Antes veremos qué hacer cuando no conocemos de antemano el número de repeticiones.