Ejercicio 05 — Lee dos numeros reales y un operador

Dificultad: amarillo · Módulo 02 (Condicionales)

Enunciado

Lee dos numeros reales y un operador (+,-,*,/) e imprime el resultado; avisa si se intenta dividir por cero.

Diagrama de flujo

Diagrama de flujo del ejercicio 05

Cómo se resuelve

El programa es una mini-calculadora: lee dos números reales y un operador (+, -, *, /) y muestra el resultado. Es el ejercicio para practicar switch, que elige entre varios casos discretos de forma más limpia que una cadena de if-else.

  1. scanf("%lf %c %lf", &a, &op, &b) lee los tres datos de golpe: %lf lee un double y %c lee un único carácter (el operador). Al usar double guardamos decimales, y por eso imprimimos con %.2f (dos decimales).
  2. switch (op) compara el carácter leído contra cada case. Cada rama calcula su operación, imprime el resultado y termina con break. El default recoge cualquier operador que no reconozcamos.
  3. El caso '/' lleva un if extra: antes de dividir, comprueba que b no sea cero, porque dividir entre cero es una operación inválida. Es un buen ejemplo de anidar un condicional dentro de un case.

Trampa habitual: olvidar el break al final de cada case. Sin él, la ejecución “cae” al siguiente caso (fall-through): si escribieras + sin break, además de la suma se ejecutaría también el código de la resta. El compilador no siempre avisa, así que pon break en cada rama salvo que el encadenamiento sea deliberado.

Para practicar — cópialo en Dev-C++

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

/*
  Curso de C — Modulo 02: Condicionales
  Ejercicio 05 — PRACTICA (rellena los TODO)
  Enunciado: Lee dos numeros reales y un operador (+,-,*,/) e imprime el
             resultado; avisa si se intenta dividir por cero.
  Dificultad: amarillo
  Compilar: gcc -std=c11 -Wall ej05_practica.c -o ej05 && ./ej05
*/
 
#include <stdio.h>
 
int main(void) {
    double a, b;
    char op;
 
    // TODO: muestra un mensaje como "Introduce: num1 op num2 (ej: 10 / 2): "
    // TODO: lee a, op y b con una sola llamada a scanf
    //       formato sugerido: "%lf %c %lf"
    //       (usa &a, &op, &b)
 
    // TODO: escribe un switch sobre 'op' con cuatro cases: '+' '-' '*' '/'
    //   - Para cada operacion aritmetica, calcula e imprime "Resultado: %.2f"
    //   - Para '/', antes de dividir comprueba con un if que b != 0.0
    //     Si b es 0, imprime "Error: division por cero"
    //   - En el case default, imprime "Operador desconocido"
    //   - No olvides el break al final de cada case
 
    return 0;
}

Solución — cópiala y ejecútala

/*
  Curso de C — Modulo 02: Condicionales
  Ejercicio 05 — MODELO (resuelto)
  Enunciado: Lee dos numeros reales y un operador (+,-,*,/) e imprime el
             resultado; avisa si se intenta dividir por cero.
  Dificultad: amarillo
  Compilar: gcc -std=c11 -Wall ej05_modelo.c -o ej05 && ./ej05
*/
 
#include <stdio.h>
 
int main(void) {
    double a, b;
    char op;
 
    printf("Introduce: num1 operador num2 (ej: 10 / 2): ");
    // %lf lee double; %c lee el caracter del operador
    scanf("%lf %c %lf", &a, &op, &b);
 
    // switch sobre el caracter del operador
    switch (op) {
        case '+':
            printf("Resultado: %.2f\n", a + b);
            break;
        case '-':
            printf("Resultado: %.2f\n", a - b);
            break;
        case '*':
            printf("Resultado: %.2f\n", a * b);
            break;
        case '/':
            // Antes de dividir, comprobamos que el divisor no sea cero
            if (b == 0.0) {
                printf("Error: division por cero\n");
            } else {
                printf("Resultado: %.2f\n", a / b);
            }
            break;
        default:
            printf("Operador desconocido: %c\n", op);
            break;
    }
 
    return 0;
}

Cómo usarlo

Dev-C++ (Windows): Archivo → Nuevo → Código fuente, pega el código y pulsa F11 (compilar y ejecutar). Si ves los acentos raros en la consola, escribe chcp 65001 y vuelve a ejecutar.

Conexiones