Condicionales en C — ejercicios para dominar if, else y switch
Los condicionales en C ejercicios con solución cierran este bloque. Ya viste la teoría y practicaste con programas reales. Ahora toca resolver por tu cuenta con gedit y gcc en Fedora. Tres niveles de dificultad con especial atención al error más silencioso de los condicionales en C, olvidar las llaves y crear bloques incompletos sin que el compilador avise. Si te atascas, recuerda que tienes a tu disposición las soluciones y además, pythontutor.com para encontrar con mayor facilidad, el error de tu código.
Tabla de Contenidos
Condicionales en C ejercicios — Nivel Básico
Ejercicio 1 — Conversor de calificaciones entre sistemas
Escribe un programa que pida una nota en el sistema español (0-10) y la convierta al sistema americano de letras y al sistema numérico americano (0-100). Usa if/else if/else para la conversión a letras y operaciones aritméticas para la conversión numérica.
Las equivalencias son:
- 9-10 → A → 90-100
- 7-8.9 → B → 70-89
- 5-6.9 → C → 50-69
- 3-4.9 → D → 30-49
- 0-2.9 → F → 0-29
La salida debe ser:
Nota española (0-10): 7.5 --- Conversiones --- Sistema español: 7.50 / 10 Sistema americano: 75.00 / 100 Sistema de letras: B Estado: Aprobado
💡 Pista — el error de las llaves: Cuando encadenas varios else if asegúrate de que cada bloque tiene sus llaves. Sin ellas solo la primera línea pertenece al bloque y el compilador no avisa:
/* MAL — solo printf pertenece al else if */
else if (nota >= 7.0)
letra = 'B';
printf("Notable\n"); /* siempre se ejecuta */
/* BIEN */
else if (nota >= 7.0) {
letra = 'B';
printf("Notable\n");
}
Ejercicio 2 — Clasificador de triángulos por lados
Escribe un programa que pida los tres lados de un triángulo y lo clasifique. Primero valida si los lados forman un triángulo válido (la suma de dos lados siempre debe ser mayor que el tercero), luego clasifica por tipo de ángulo y por igualdad de lados.
Clasificación por lados:
- Equilátero: los tres lados iguales
- Isósceles: exactamente dos lados iguales
- Escaleno: los tres lados diferentes
Clasificación por ángulos (usa el teorema de Pitágoras):
- Rectángulo:
c² == a² + b²(siendo c el lado mayor) - Obtusángulo:
c² > a² + b² - Acutángulo:
c² < a² + b²
La salida debe ser:
Lado A: 3 Lado B: 4 Lado C: 5 --- Clasificación --- ¿Es triángulo válido? Sí Tipo por lados: Escaleno Tipo por ángulos: Rectángulo
💡 Pistas:
- Para validar el triángulo comprueba las tres condiciones con
&&:a+b > c && a+c > b && b+c > a - Para encontrar el lado mayor usa
if/else if, necesitas saber cuál escpara Pitágoras - Para comparar flotantes con
==en Pitágoras puede haber imprecisión — usaintsi los lados son enteros - El error de llaves es especialmente peligroso aquí porque tienes muchas condiciones anidadas, pon llaves en absolutamente todo
Condicionales en C ejercicios — Nivel Intermedio
Ejercicio 3 — Sistema de login con intentos limitados
Simula un sistema de login que pida usuario y contraseña. Sin bucles todavía, el usuario tiene exactamente 3 intentos predefinidos con if/else if/else. El usuario correcto es sergio (inicial 's') y la contraseña es 1234.
Como en C las cadenas son complejas (las veremos con punteros), usa solo el primer carácter del usuario (char) y la contraseña numérica (int).
La salida debe ser:
=== SISTEMA DE LOGIN === Inicial del usuario (s=sergio): s Contraseña: 1234 ✓ Acceso concedido. Bienvenido, sergio. Nivel de acceso: Administrador
O si falla:
=== SISTEMA DE LOGIN === Inicial del usuario (s=sergio): s Contraseña: 9999 ✗ Contraseña incorrecta. Acceso denegado.
Añade también un nivel de acceso basado en la contraseña usando switch:
- 1234 → Administrador
- 5678 → Usuario
- 9999 → Invitado
- Cualquier otra → Sin acceso
💡 Pistas:
- Usa
char inicialconscanf(" %c", &inicial), espacio antes de%cobligatorio - La condición de acceso es
inicial == 's' && contrasena == 1234 - Para el nivel de acceso usa
switch, es exactamente el caso de uso para el que fue diseñado - El error de llaves aquí puede hacer que el mensaje de acceso denegado se muestre siempre aunque el login sea correcto, pon llaves en cada rama del
if/else
Condicionales en C ejercicios — Desafío Final
Ejercicio 4 — Calculadora de tarifas de transporte
Simula el sistema de tarifas de un transporte público. El precio del billete depende de la edad, el tipo de tarjeta y la distancia:
Precio base por distancia:
- 1-3 zonas: 1.50€
- 4-6 zonas: 2.50€
- 7+ zonas: 3.50€
Descuentos por edad y tarjeta (sobre el precio base):
- Menor de 4 años: gratis (100% descuento)
- 4-12 años: 50% descuento
- 13-25 años con tarjeta joven: 30% descuento
- 65+ años: 40% descuento
- Sin descuento: precio completo
Recargo:
- Hora punta (7-9h y 17-19h): +20% sobre el precio final
La salida debe ser:
=== CALCULADORA DE TARIFAS === Edad: 22 ¿Tienes tarjeta joven? (1=sí, 0=no): 1 Número de zonas: 4 Hora actual (0-23): 8 --- Desglose --- Precio base (4-6 zonas): 2.50€ Descuento tarjeta joven: -0.75€ (30%) Subtotal: 1.75€ Recargo hora punta: +0.35€ (20%) TOTAL: 2.10€
💡 Pistas:
- Divide el programa en partes: primero calcula el precio base con
if/else ifpor zonas, luego aplica el descuento con otroif/else ifpor edad y tarjeta, luego el recargo con otroif - Para la hora punta usa
||— hora punta si(hora >= 7 && hora <= 9) || (hora >= 17 && hora <= 19) - El error de llaves es crítico aquí porque tienes bloques dentro de bloques, si olvidas una llave el descuento puede aplicarse siempre o nunca
- Los precios son
float— recuerda%.2fpara mostrar dos decimales
Soluciones Comentadas
Solución Ejercicio 1:
#include <stdio.h>
int main() {
float nota;
char letra;
float nota_americana;
int aprobado;
printf("Nota española (0-10): ");
scanf("%f", ¬a);
if (nota < 0 || nota > 10) {
printf("Error: nota fuera de rango\n");
return 1;
}
/* Conversión a letra */
if (nota >= 9.0) {
letra = 'A';
} else if (nota >= 7.0) {
letra = 'B';
} else if (nota >= 5.0) {
letra = 'C';
} else if (nota >= 3.0) {
letra = 'D';
} else {
letra = 'F';
}
nota_americana = nota * 10;
aprobado = (nota >= 5.0);
printf("\n--- Conversiones ---\n");
printf("Sistema español: %.2f / 10\n", nota);
printf("Sistema americano: %.2f / 100\n", nota_americana);
printf("Sistema de letras: %c\n", letra);
printf("Estado: %s\n", aprobado ? "Aprobado" : "Suspenso");
return 0;
}
Solución Ejercicio 2:
#include <stdio.h>
int main() {
float a, b, c;
float mayor, cuadrado_mayor, suma_cuadrados;
int valido;
printf("Lado A: "); scanf("%f", &a);
printf("Lado B: "); scanf("%f", &b);
printf("Lado C: "); scanf("%f", &c);
/* Validar triángulo */
valido = (a + b > c) && (a + c > b) && (b + c > a);
printf("\n--- Clasificación ---\n");
printf("¿Es triángulo válido? %s\n", valido ? "Sí" : "No");
if (!valido) {
printf("No se puede clasificar\n");
return 1;
}
/* Clasificación por lados */
if (a == b && b == c) {
printf("Tipo por lados: Equilátero\n");
} else if (a == b || b == c || a == c) {
printf("Tipo por lados: Isósceles\n");
} else {
printf("Tipo por lados: Escaleno\n");
}
/* Encontrar lado mayor para Pitágoras */
if (a >= b && a >= c) {
mayor = a;
suma_cuadrados = b*b + c*c;
} else if (b >= a && b >= c) {
mayor = b;
suma_cuadrados = a*a + c*c;
} else {
mayor = c;
suma_cuadrados = a*a + b*b;
}
cuadrado_mayor = mayor * mayor;
/* Clasificación por ángulos */
if (cuadrado_mayor == suma_cuadrados) {
printf("Tipo por ángulos: Rectángulo\n");
} else if (cuadrado_mayor > suma_cuadrados) {
printf("Tipo por ángulos: Obtusángulo\n");
} else {
printf("Tipo por ángulos: Acutángulo\n");
}
return 0;
}
Solución Ejercicio 3:
#include <stdio.h>
int main() {
char inicial;
int contrasena;
int acceso;
printf("=== SISTEMA DE LOGIN ===\n");
printf("Inicial del usuario (s=sergio): ");
scanf(" %c", &inicial);
printf("Contraseña: ");
scanf("%d", &contrasena);
acceso = (inicial == 's') && (contrasena == 1234 ||
contrasena == 5678 || contrasena == 9999);
if (inicial != 's') {
printf("\n✗ Usuario incorrecto.\n");
printf("Acceso denegado.\n");
return 1;
}
if (contrasena == 1234 || contrasena == 5678 || contrasena == 9999) {
printf("\n✓ Acceso concedido. Bienvenido, sergio.\n");
printf("Nivel de acceso: ");
switch (contrasena) {
case 1234:
printf("Administrador\n");
break;
case 5678:
printf("Usuario\n");
break;
case 9999:
printf("Invitado\n");
break;
}
} else {
printf("\n✗ Contraseña incorrecta.\n");
printf("Acceso denegado.\n");
}
return 0;
}
Solución Ejercicio 4:
#include <stdio.h>
int main() {
int edad, zonas, hora, tarjeta_joven;
float precio_base, descuento, subtotal, recargo, total;
printf("=== CALCULADORA DE TARIFAS ===\n");
printf("Edad: "); scanf("%d", &edad);
printf("¿Tienes tarjeta joven? (1=sí, 0=no): ");
scanf("%d", &tarjeta_joven);
printf("Número de zonas: "); scanf("%d", &zonas);
printf("Hora actual (0-23): "); scanf("%d", &hora);
/* Precio base por zonas */
if (zonas <= 3) {
precio_base = 1.50;
} else if (zonas <= 6) {
precio_base = 2.50;
} else {
precio_base = 3.50;
}
/* Descuento por edad */
if (edad < 4) {
descuento = precio_base; /* gratis */
} else if (edad <= 12) {
descuento = precio_base * 0.50;
} else if (edad <= 25 && tarjeta_joven) {
descuento = precio_base * 0.30;
} else if (edad >= 65) {
descuento = precio_base * 0.40;
} else {
descuento = 0;
}
subtotal = precio_base - descuento;
/* Recargo hora punta */
int hora_punta = (hora >= 7 && hora <= 9) || (hora >= 17 && hora <= 19);
recargo = hora_punta ? subtotal * 0.20 : 0;
total = subtotal + recargo;
/* Mostrar desglose */
printf("\n--- Desglose ---\n");
if (zonas <= 3) {
printf("Precio base (1-3 zonas): %.2f€\n", precio_base);
} else if (zonas <= 6) {
printf("Precio base (4-6 zonas): %.2f€\n", precio_base);
} else {
printf("Precio base (7+ zonas): %.2f€\n", precio_base);
}
if (descuento > 0) {
printf("Descuento aplicado: -%.2f€\n", descuento);
}
printf("Subtotal: %.2f€\n", subtotal);
if (hora_punta) {
printf("Recargo hora punta: +%.2f€ (20%%)\n", recargo);
}
printf("TOTAL: %.2f€\n", total);
return 0;
}
Chuletario — Condicionales en C
/* ============================================
CHULETARIO — Condicionales en C
Sergio Learns · sergiolearns.com
============================================ */
/* IF / ELSE IF / ELSE */
if (condicion) { /* paréntesis OBLIGATORIOS */
/* instrucciones */
} else if (otra) { /* else if — dos palabras */
/* instrucciones */
} else {
/* instrucciones */
}
/* REGLA DE ORO — llaves siempre */
if (x > 5) { /* aunque sea una sola instrucción */
printf("mayor\n");
}
/* SIN LLAVES — solo la siguiente línea es del if */
if (x > 5)
printf("A\n");
printf("B\n"); /* SIEMPRE se ejecuta — error silencioso */
/* OPERADOR TERNARIO */
resultado = (condicion) ? valor_true : valor_false;
printf("%s\n", (nota >= 5) ? "Aprobado" : "Suspenso");
/* OPERADORES LÓGICOS */
&& /* AND — ambas condiciones verdaderas */
|| /* OR — al menos una verdadera */
! /* NOT — invierte la condición */
/* SWITCH / CASE */
switch (expresion_entera) { /* solo int o char */
case valor1:
/* instrucciones */
break; /* OBLIGATORIO — sin él cae al siguiente */
case valor2:
/* instrucciones */
break;
default:
/* si ningún case coincide */
break;
}
/* FALL-THROUGH — sin break cae al siguiente case */
switch (x) {
case 1:
printf("uno\n"); /* sin break → cae a case 2 */
case 2:
printf("dos\n");
break;
}
/* FALL-THROUGH ÚTIL — agrupar casos */
switch (dia) {
case 1:
case 7:
printf("Fin de semana\n");
break;
default:
printf("Laborable\n");
break;
}
/* SWITCH — LIMITACIONES */
/* Solo enteros (int, char) — no float */
/* Solo igualdad — no rangos (>, <, >=) */
/* Solo constantes en case — no variables */
/* SWITCH VS IF/ELSE */
/* switch → misma variable, valores fijos, 3+ casos */
/* if/else → rangos, flotantes, condiciones complejas */
/* HORA PUNTA — condición compuesta típica */
int punta = (h >= 7 && h <= 9) || (h >= 17 && h <= 19);
/* ERRORES TÍPICOS */
/* 1. Sin llaves → bloque incompleto sin aviso */
/* 2. Sin break en switch → fall-through silencioso */
/* 3. = en vez de == → asignación en vez de comparación */
/* 4. Float en switch → error de compilación */
/* 5. if anidado sin llaves → bug muy difícil de encontrar */
Conditionals in C — exercises to master if, else and switch
Basic Level
Exercise 1 — Grade converter between systems
Ask for a Spanish grade (0-10) and convert to American letter grade and numeric system (0-100). Use if/else if/else for letter conversion and arithmetic for numeric conversion.
Equivalences: 9-10=A, 7-8.9=B, 5-6.9=C, 3-4.9=D, 0-2.9=F
💡 Hint — the braces mistake:
/* WRONG — only first line belongs to else if */
else if (grade >= 7.0)
letter = 'B';
printf("Good\n"); /* always executes */
/* RIGHT */
else if (grade >= 7.0) {
letter = 'B';
printf("Good\n");
}
Exercise 2 — Triangle classifier
Ask for three sides. First validate (sum of any two sides must exceed the third), then classify by sides (equilateral/isosceles/scalene) and by angles using Pythagorean theorem.
💡 Hints: Validate with (a+b>c) && (a+c>b) && (b+c>a). Find the largest side for Pythagoras. Use braces everywhere, nested conditions without braces cause very hard-to-find bugs.
Intermediate Level
Exercise 3 — Login system with limited attempts
Simulate a login using only char initial and int password. Correct user: initial 's', password 1234. Use switch for access level: 1234=Admin, 5678=User, 9999=Guest.
💡 Hint: Condition: initial == 's' && password == 1234. Missing braces here can cause the access denied message to always show even on correct login.
Final Challenge
Exercise 4 — Transport fare calculator
Base price by zones (1-3: €1.50, 4-6: €2.50, 7+: €3.50). Discounts by age (under 4 free, 4-12 50% off, 13-25 with youth card 30% off, 65+ 40% off). Peak hour surcharge (7-9h and 17-19h): +20%.
💡 Hints: Peak hour: (hour >= 7 && hour <= 9) || (hour >= 17 && hour <= 19). Braces are critical here, nested blocks without braces cause discounts to apply always or never.
(Solutions same as Spanish version above)
