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
forSabes cuántas vueltas (o el rango)Contar: for (int i = 0; i < n; i++)
whileRepite hasta que cambie una condición; quizá cero vecesCentinela: "hasta que la entrada sea válida"
do-whileIgual, pero al menos una vezMenús / reintentos
foreachQuieres los elementos, no los índicesSumar, imprimir una colección

Practica ahora