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:
| Vuelta | numero antes de imprimir | ¿numero <= 5? |
|---|---|---|
| 1 | 1 | true |
| 2 | 2 | true |
| 3 | 3 | true |
| 4 | 4 | true |
| 5 | 5 | true |
| fin | 6 | false |
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.