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
| Concepto | Para que sirve |
|---|---|
while | Repetir mientras una condicion sea verdadera (0 o mas iteraciones) |
do-while | Igual que while pero garantiza al menos UNA ejecucion |
for | Repetir un numero conocido de veces; contador integrado |
break | Salir del bucle inmediatamente |
continue | Saltar el resto de la iteracion actual y pasar a la siguiente |
| Bucles anidados | Un 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:
- Un numero es primo si solo es divisible por 1 y por si mismo.
- Basta comprobar divisores desde 2 hasta N-1 (o hasta sqrt(N) para optimizar, pero aqui 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 tipicos 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); -
Condicion de bucle con = en lugar de ==
// MAL: asignacion, siempre verdadero si x != 0 while (x = 5) { ... } // BIEN while (x == 5) { ... } -
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 -
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
- MOC_Linux
- 02-condicionales — modulo anterior: if/else/switch
- 04-funciones — modulo siguiente: definir y llamar funciones propias