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
| Concepto | Para qué sirve |
|---|---|
while | Repetir mientras una condición sea verdadera (0 o más iteraciones) |
do-while | Igual que while pero garantiza al menos UNA ejecución |
for | Repetir un número conocido de veces; contador integrado |
break | Salir del bucle inmediatamente |
continue | Saltar el resto de la iteración actual y pasar a la siguiente |
| Bucles anidados | Un 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:
- Un número es primo si solo es divisible por 1 y por sí mismo.
- Basta comprobar divisores desde 2 hasta N-1 (o hasta sqrt(N) para optimizar, pero aquí usamos N-1 para claridad).
- Si encontramos un divisor, ya no es primo: usamos
breakpara salir antes. - Necesitamos una variable bandera
es_primopara 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
-
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 -
Olvidar el punto y coma en do-while
// MAL do { ... } while (condicion) // falta ; // BIEN do { ... } while (condicion); -
Condición de bucle con = en lugar de ==
// MAL: asignacion, siempre verdadero si x != 0 while (x = 5) { ... } // BIEN while (x == 5) { ... } -
Í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 -
breakenswitchanidado dentro de bucle no sale del buclefor (...) { 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.
- Ej 01 — Leer N y mostrar los numeros del 1 al N, uno por linea (verde)
- Ej 02 — Leer N y calcular la suma 1+2+…+N (verde)
- Ej 03 — Leer N y calcular N! (factorial) (verde)
- Ej 04 — Leer un numero y mostrar su tabla de multiplicar del 1 al 10 (amarillo)
- Ej 05 — Leer N y mostrar los N primeros terminos de la serie de Fibonacci (amarillo)
- Ej 06 — Mostrar un triangulo de asteriscos de altura N (rojo)
- Ej 07 — Menu do-while con 3 opciones (rojo)
Conexiones
- 00_README
- Linux
- 02-condicionales — módulo anterior: if/else/switch
- 04-funciones — módulo siguiente: definir y llamar funciones propias