Modulo 03: Bucles en C

Idea central

Un bucle ejecuta un bloque de codigo repetidamente mientras se cumpla una condicion. Sin bucles, sumar 1..1000 requeriria 1000 lineas. Con un bucle, tres. Los bucles son el mecanismo principal para procesar colecciones, calcular series y construir menus interactivos.


Que aprendes

ConceptoPara que sirve
whileRepetir mientras una condicion sea verdadera (0 o mas iteraciones)
do-whileIgual que while pero garantiza al menos UNA ejecucion
forRepetir un numero conocido de veces; contador integrado
breakSalir del bucle inmediatamente
continueSaltar el resto de la iteracion actual y pasar a la siguiente
Bucles anidadosUn bucle dentro de otro; para tablas, matrices, triangulos

Explicacion

Categoria: bucles con condicion de entrada

Patron while: comprobar → ejecutar → comprobar → … Si la condicion 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
}

Categoria: bucles con condicion de salida

Patron do-while: ejecutar → comprobar → ejecutar → … Util para menus: 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);

Categoria: bucles con contador conocido

Patron for: inicializar; condicion; actualizar — todo en una sola linea.

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

Patron: 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);
}

Patron: 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 numero N (leido por teclado) es primo.

Razonamiento paso a paso:

  1. Un numero es primo si solo es divisible por 1 y por si mismo.
  2. Basta comprobar divisores desde 2 hasta N-1 (o hasta sqrt(N) para optimizar, pero aqui 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 tipicos 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. Condicion de bucle con = en lugar de ==

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

    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