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.


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 es c para Pitágoras
  • Para comparar flotantes con == en Pitágoras puede haber imprecisión — usa int si 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 inicial con scanf(" %c", &inicial), espacio antes de %c obligatorio
  • 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 if por zonas, luego aplica el descuento con otro if/else if por edad y tarjeta, luego el recargo con otro if
  • 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 %.2f para 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", &nota);

    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 */
Sigue aprendiendoTodos los artículos de C

¿Te ha servido este artículo? Así puedes apoyar SergioLearns →

Sigue aprendiendo

Un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *