condicionales en C ejercicios resueltos chuletario

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 */

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)

Publicaciones Similares

Deja una respuesta

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