Módulo 03: Bucles en C

Idea central

Un bucle ejecuta un bloque de código repetidamente mientras se cumpla una condición. Sin bucles, sumar 1..1000 requeriría 1000 líneas. Con un bucle, tres. Los bucles son el mecanismo principal para procesar colecciones, calcular series y construir menús interactivos.


Qué aprendes

ConceptoPara qué sirve
whileRepetir mientras una condición sea verdadera (0 o más iteraciones)
do-whileIgual que while pero garantiza al menos UNA ejecución
forRepetir un número conocido de veces; contador integrado
breakSalir del bucle inmediatamente
continueSaltar el resto de la iteración actual y pasar a la siguiente
Bucles anidadosUn bucle dentro de otro; para tablas, matrices, triángulos

Explicación

Categoría: bucles con condición de entrada

Patrón while: comprobar → ejecutar → comprobar → … Si la condición es falsa desde el inicio, el cuerpo no se ejecuta nunca.

// Sintaxis
while (condicion) {
    // cuerpo
}
 
// Ejemplo: contar de 1 a 5
int i = 1;
while (i <= 5) {
    printf("%d\n", i);
    i++;            // sin esto: bucle infinito
}

Categoría: bucles con condición de salida

Patrón do-while: ejecutar → comprobar → ejecutar → … Útil para menús: siempre se muestra al menos una vez.

// Sintaxis
do {
    // cuerpo
} while (condicion);   // <-- punto y coma obligatorio
 
// Ejemplo: pedir un numero positivo
int n;
do {
    printf("Introduce un numero positivo: ");
    scanf("%d", &n);
} while (n <= 0);

Categoría: bucles con contador conocido

Patrón for: inicializar; condición; actualizar — todo en una sola línea.

// Sintaxis
for (inicio; condicion; actualizacion) {
    // cuerpo
}
 
// Ejemplo: suma de 1 a N
int suma = 0;
for (int i = 1; i <= N; i++) {
    suma += i;
}

Patrón: break y continue

// break: abandona el bucle al encontrar el primero multiplo de 7
for (int i = 1; i <= 100; i++) {
    if (i % 7 == 0) {
        printf("Primer multiplo de 7: %d\n", i);
        break;
    }
}
 
// continue: imprime solo los impares
for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) continue;   // salta pares
    printf("%d\n", i);
}

Patrón: bucles anidados

El bucle externo controla filas; el interno controla columnas.

// Tabla de multiplicar del 2 y del 3
for (int fila = 2; fila <= 3; fila++) {
    for (int col = 1; col <= 5; col++) {
        printf("%d x %d = %d\n", fila, col, fila * col);
    }
}

Worked example

Problema: Calcular si un número N (leído por teclado) es primo.

Razonamiento paso a paso:

  1. Un número es primo si solo es divisible por 1 y por sí mismo.
  2. Basta comprobar divisores desde 2 hasta N-1 (o hasta sqrt(N) para optimizar, pero aquí usamos N-1 para claridad).
  3. Si encontramos un divisor, ya no es primo: usamos break para salir antes.
  4. Necesitamos una variable bandera es_primo para recordar si hubo divisor.
#include <stdio.h>
 
int main(void) {
    int n;
    printf("Introduce un numero entero positivo (>1): ");
    scanf("%d", &n);
 
    int es_primo = 1;           // asumimos que es primo
 
    for (int i = 2; i < n; i++) {
        if (n % i == 0) {       // encontramos un divisor
            es_primo = 0;       // no es primo
            break;              // no hace falta seguir
        }
    }
 
    if (es_primo && n > 1) {
        printf("%d ES primo.\n", n);
    } else {
        printf("%d NO es primo.\n", n);
    }
 
    return 0;
}

Traza con n = 7:

  • i=2: 7%2=1 → no divisor
  • i=3: 7%3=1 → no divisor
  • i=4: 7%4=3 → no divisor
  • i=5: 7%5=2 → no divisor
  • i=6: 7%6=1 → no divisor
  • Bucle termina, es_primo=1 → imprime “7 ES primo.”

Traza con n = 6:

  • i=2: 6%2=0 → divisor encontrado, es_primo=0, break
  • Imprime “6 NO es primo.”

Errores típicos en C

  1. Bucle infinito por no actualizar el contador

    // MAL
    int i = 1;
    while (i <= 10) {
        printf("%d\n", i);
        // olvide i++
    }
    // BIEN: anadir i++ al final del cuerpo
  2. Olvidar el punto y coma en do-while

    // MAL
    do { ... } while (condicion)   // falta ;
    // BIEN
    do { ... } while (condicion);
  3. Condición de bucle con = en lugar de ==

    // MAL: asignacion, siempre verdadero si x != 0
    while (x = 5) { ... }
    // BIEN
    while (x == 5) { ... }
  4. Índice fuera de rango en bucles con arrays (anticipación)

    int arr[5];
    for (int i = 0; i <= 5; i++) {   // i=5 accede fuera del array
        arr[i] = i;
    }
    // BIEN: condicion i < 5
  5. break en switch anidado dentro de bucle no sale del bucle

    for (...) {
        switch (opcion) {
            case 1: break;   // sale del switch, NO del for
        }
    }
    // Para salir del for, usar una variable bandera o goto (avanzado)

Ejercicios

Practica lo de este módulo. Cada enlace abre el ejercicio con su enunciado, diagrama de flujo, explicación y el código listo para copiar.


Conexiones