Curso de C · Módulo 4 de 12

Bucles en C: for, while y do-while

Qué aprenderás en este módulo

repetir tareas sin repetir código.

Incluye 5 ejercicios con pistas y solución y un quiz de 5 preguntas. Tiempo estimado: 60 minutos.

1. for: cuando sabes cuántas veces

for (int i = 0; i < 5; i++) {      // inicio ; condición ; paso
    printf("%d ", i);              // 0 1 2 3 4
}

Orden de ejecución: inicio (una vez) → condición → cuerpo → paso → condición → ... Convención: empieza en 0 y usa < con el tamaño (i < n) → ejecuta exactamente n veces.

2. while: mientras se cumpla una condición

int n = 1;
while (n < 100) {
    n *= 2;
}

Puede ejecutarse cero veces (si la condición ya es falsa al empezar).

3. do { } while: al menos una vez

int opcion;
do {
    printf("Elige 1-3: ");
    scanf("%d", &opcion);
} while (opcion < 1 || opcion > 3);   // valida entrada

4. break y continue

for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) continue;   // salta los pares
    if (i > 7) break;           // sale del bucle
    printf("%d ", i);           // 1 3 5 7
}

5. Bucles anidados

Un bucle dentro de otro: el interior se ejecuta completo por cada vuelta del exterior.

for (int fila = 1; fila <= 3; fila++) {
    for (int col = 1; col <= fila; col++)
        printf("*");
    printf("\n");
}
// *
// **
// ***

Total de iteraciones internas = filas × columnas: ¡los anidados se encarecen rápido!

6. Patrones que usarás cada día

Patrón Esqueleto
Acumulador suma = 0; for (...) suma += x;
Máximo max = v[0]; for (...) if (v[i] > max) max = v[i];
Contador n = 0; for (...) if (cond) n++;
Bandera ok = 1; for (...) if (falla) { ok = 0; break; }
Leer hasta fin while (scanf("%d", &x) == 1) { ... }

7. Errores típicos

  • Off-by-one: i <= n en lugar de i < n (una vuelta de más).
  • Bucle infinito: olvidas actualizar la variable de la condición.
  • ; tras el for: for (...); → el cuerpo queda vacío.
  • Modificar el contador dentro del cuerpo sin querer.

Prueba esto

  1. Imprime los números del 10 al 1 en orden descendente.
  2. Suma los dígitos de un número (n % 10 extrae el último, n /= 10 lo quita).
  3. Tabla de multiplicar completa (1..9 × 1..9) con dos for anidados.

Ejercicios prácticos del módulo 4

Programar se aprende programando: intenta cada ejercicio antes de mirar las pistas, y usa la solución solo para comparar. Marca los que resuelvas y tu progreso se guarda en este navegador.

4.1 Tabla de multiplicar
Lee n e imprime su tabla de multiplicar del 1 al 10, una linea por producto: 7 x 1 = 7 7 x 2 = 14 ... 7 x 10 = 70

Entrada de ejemplo

7

Salida esperada

7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70

Tu punto de partida

#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    // TODO: bucle for de 1 a 10

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

for (int i = 1; i <= 10; i++) { ... }

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= 10; i++)
        printf("%d x %d = %d\n", n, i, n * i);
    return 0;
}
4.2 Suma y factorial
Lee n (1 <= n <= 20) e imprime la suma de 1 a n y el factorial de n: suma=15 factorial=120 Usa long long para el factorial (20! no cabe en un int). Para imprimirlo, formato %lld.

Entrada de ejemplo

5

Salida esperada

suma=15 factorial=120

Tu punto de partida

#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    long long suma = 0, fact = 1;
    // TODO

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

Un solo bucle de 1 a n basta para las dos cosas.

Pista 2

suma += i; fact *= i;

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    long long suma = 0, fact = 1;
    for (int i = 1; i <= n; i++) {
        suma += i;
        fact *= i;
    }
    printf("suma=%lld factorial=%lld\n", suma, fact);
    return 0;
}
4.3 FizzBuzz
El clasico. Lee n e imprime los numeros de 1 a n, uno por linea, pero: - multiplos de 3 -> Fizz - multiplos de 5 -> Buzz - multiplos de 3 y de 5 -> FizzBuzz

Entrada de ejemplo

15

Salida esperada

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

Tu punto de partida

#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    // TODO

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

Comprueba PRIMERO el caso de 15 (o 3 y 5 a la vez); si no, Fizz se come a FizzBuzz.

Pista 2

if (i % 15 == 0) ... else if (i % 3 == 0) ... else if (i % 5 == 0) ... else ...

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        if (i % 15 == 0) printf("FizzBuzz\n");
        else if (i % 3 == 0) printf("Fizz\n");
        else if (i % 5 == 0) printf("Buzz\n");
        else printf("%d\n", i);
    }
    return 0;
}
4.4 Piramide de asteriscos
Lee la altura h e imprime una piramide centrada. Ejemplo con h = 4: * *** ***** ******* Fila i (desde 1): (h - i) espacios y (2*i - 1) asteriscos. Necesitas bucles anidados.

Entrada de ejemplo

4

Salida esperada

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

Tu punto de partida

#include <stdio.h>

int main(void) {
    int h;
    scanf("%d", &h);
    // TODO: for externo por filas, dos for internos (espacios y asteriscos)

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

Por cada fila: primero un bucle que pone espacios, luego otro que pone asteriscos, y un \n.

Pista 2

putchar('*') imprime un unico caracter.

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    int h;
    scanf("%d", &h);
    for (int i = 1; i <= h; i++) {
        for (int s = 0; s < h - i; s++) putchar(' ');
        for (int k = 0; k < 2 * i - 1; k++) putchar('*');
        putchar('\n');
    }
    return 0;
}
4.5 Primos hasta n
Lee n (>= 2) e imprime todos los numeros primos hasta n, separados por un espacio, en una sola linea: 2 3 5 7 11 13 (sin espacio final obligatorio: se ignoran los espacios al final de linea). Pista de eficiencia: basta probar divisores hasta la raiz cuadrada.

Entrada de ejemplo

13

Salida esperada

2 3 5 7 11 13

Tu punto de partida

#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    // TODO

    return 0;
}

Cópialo en tu editor, complétalo, compílalo (gcc -Wall -Wextra programa.c -o programa) y prueba la entrada de ejemplo. Para que se corrija solo con varios casos de prueba, descarga el curso.

Pista 1

Un bucle externo recorre candidatos; uno interno busca algun divisor.

Pista 2

Usa una bandera (int primo = 1) que pones a 0 si encuentras divisor, y sal con break.

Pista 3

Recuerda: 1 no es primo, por eso empiezas en 2.

Ver solución (inténtalo antes)
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);
    for (int i = 2; i <= n; i++) {
        int primo = 1;
        for (int d = 2; d * d <= i; d++) {
            if (i % d == 0) { primo = 0; break; }
        }
        if (primo) printf("%d ", i);
    }
    printf("\n");
    return 0;
}

Quiz del módulo 4

5 preguntas para comprobar que has fijado los conceptos. Las opciones se barajan cada vez.