Lección 4 · ~14 min · ← Lección 3
Bucles: for, while, do-while, foreach
Cuatro bucles, un modelo mental: repite un cuerpo mientras se cumpla una condición. Las diferencias están en dónde vive el conteo y qué estás recorriendo.
for: cuando sabes cuántas veces
Tres cláusulas en la cabecera — inicio, condición de continuación, paso:
for (int i = 1; i <= 5; i++) // i empieza en 1; repite mientras i <= 5; i++ tras cada vuelta
{
Console.Write(i * 2 + " ");
}
Console.WriteLine();
La variable de bucle i nace y muere dentro del for — intentar usarla después es el error CS0103.
El patrón acumulador
La forma de bucle más útil: una variable declarada antes del bucle, actualizada en cada vuelta:
int suma = 0; // el acumulador empieza en 0 — siempre
int cuenta = 0;
for (int i = 1; i <= 5; i++)
{
suma += i; // pliega cada valor dentro
cuenta++;
}
Console.WriteLine($"suma: {suma}, cuenta: {cuenta}");
while: cuando NO sabes cuántas veces
// duplica un número hasta pasarse de 10 — ¿cuántas vueltas? aún no lo sabemos
int n = 1;
while (n <= 10)
{
Console.WriteLine(n);
n = n * 2; // sin esta línea: bucle infinito (ver abajo)
}
Regla: algo dentro del cuerpo debe empujar la condición hacia falso. El motor de aquí tiene un guardián de pasos que detiene bucles descontrolados en vez de congelar tu pestaña — en Visual Studio, un bucle infinito simplemente… corre.
do-while: comprueba DESPUÉS, corre al menos una vez
El clásico para validar entrada — pregunta primero, luego decide si volver a preguntar:
string[] intentos = { "abc", "-5", "42" };
int pos = 0;
int valor;
do
{
int.TryParse(intentos[pos], out valor); // intenta parsear el siguiente intento
pos++;
} while (valor <= 0); // repite si no obtuvimos un número positivo
Console.WriteLine("aceptado: " + valor);
Un while normal comprueba antes de la primera vuelta — si la condición es falsa de entrada, el cuerpo nunca corre. do-while garantiza una vuelta. Esa diferencia es justo por lo que Contar los dígitos resuelve su caso n = 0 con un do-while.
foreach: sobre una colección, sin contar nada
int[] puntos = { 72, 95, 88 };
foreach (int p in puntos) // "para cada elemento, llámalo p"
{
Console.WriteLine("puntos: " + p);
}
Console.Write("letras de Ada: ");
foreach (char c in "Ada") // los strings son secuencias de char
{
Console.Write(c + " ");
}
Console.WriteLine();
break y continue: dirigir desde dentro
int[] puntos = { 72, 95, 88 };
// break: sale del bucle entero (primera coincidencia)
for (int i = 0; i < puntos.Length; i++)
{
if (puntos[i] > 90)
{
Console.WriteLine($"encontré {puntos[i]} en el índice {i}");
break;
}
}
// continue: salta solo el resto de ESTA vuelta
for (int i = 1; i <= 5; i++)
{
if (i % 2 == 0) continue; // salta los pares
Console.Write(i + " ");
}
Bucles anidados: la esquina de la tabla de multiplicar
for (int fila = 1; fila <= 3; fila++)
{
for (int col = 1; col <= 3; col++)
{
Console.Write(fila * col + " ");
}
Console.WriteLine(); // salto de línea tras cada fila — nota DÓNDE está
}
El bucle interno corre completo por cada paso del externo: 3 × 3 = 9 impresiones. El bug clásico del principiante es poner el WriteLine() dentro del interno (cada número en su línea) o fuera de ambos (todo en una línea) — ejecútalo y muévelo hasta que la forma tenga sentido.
¿Qué bucle, cuándo?
| Bucle | Úsalo cuando… | Movimiento característico |
|---|---|---|
for | Sabes cuántas vueltas (o el rango) | Contar: for (int i = 0; i < n; i++) |
while | Repite hasta que cambie una condición; quizá cero veces | Centinela: "hasta que la entrada sea válida" |
do-while | Igual, pero al menos una vez | Menús / reintentos |
foreach | Quieres los elementos, no los índices | Sumar, imprimir una colección |
Practica ahora
- Suma 1..100 con un
for, luego verifícalo con la fórmula de Gaussn * (n + 1) / 2. - Imprime la tabla 3×3 solo con las celdas de la diagonal (fila == col).
- Que te corrijan: Suma de 1 a N y luego Contar los dígitos — ambos puro oficio de bucles.