Desafio C

Calculadora simples com menu e validação

Enunciado

Escreva um programa que exiba um menu com operações (1-Soma, 2-Subtração, 3-Multiplicação, 4-Divisão, 0-Sair). O programa deve ler a opção com scanf, ler dois números com scanf, realizar a operação e exibir o resultado. Após cada operação, o menu deve ser exibido novamente até que o usuário digite 0. Trate divisão por zero e opções inválidas.

Requisitos

  • Usar scanf para ler a opção e os números.
  • Usar printf para exibir o menu e os resultados.
  • Tratar divisão por zero com mensagem de erro.
  • Repetir o menu até a opção 0.

Código inicial

#include <stdio.h>

int main(void) {
    int opcao;
    double a, b;
    // Seu código aqui
    return 0;
}

Saída esperada

=== Calculadora ===
1 - Soma
2 - Subtracao
3 - Multiplicacao
4 - Divisao
0 - Sair
Escolha uma opcao: 1
Digite dois numeros: 3 4
Resultado: 7.00

=== Calculadora ===
1 - Soma
2 - Subtracao
3 - Multiplicacao
4 - Divisao
0 - Sair
Escolha uma opcao: 4
Digite dois numeros: 5 0
Erro: divisao por zero!

=== Calculadora ===
1 - Soma
2 - Subtracao
3 - Multiplicacao
4 - Divisao
0 - Sair
Escolha uma opcao: 0
Saindo...
Ver dica

Use um laço do-while para o menu. Após ler a opção com scanf, use getchar() para consumir o \n antes de ler os números.

Mostrar solução
#include <stdio.h>

int main(void) {
    int opcao;
    double a, b, resultado;

    do {
        // Exibe o menu
        printf("\n=== Calculadora ===\n");
        printf("1 - Soma\n");
        printf("2 - Subtracao\n");
        printf("3 - Multiplicacao\n");
        printf("4 - Divisao\n");
        printf("0 - Sair\n");
        printf("Escolha uma opcao: ");
        scanf("%d", &opcao);

        if (opcao == 0) {
            printf("Saindo...\n");
            break;
        }

        if (opcao < 1 || opcao > 4) {
            printf("Opcao invalida!\n");
            continue;
        }

        printf("Digite dois numeros: ");
        scanf("%lf %lf", &a, &b);

        switch (opcao) {
            case 1:
                resultado = a + b;
                printf("Resultado: %.2f\n", resultado);
                break;
            case 2:
                resultado = a - b;
                printf("Resultado: %.2f\n", resultado);
                break;
            case 3:
                resultado = a * b;
                printf("Resultado: %.2f\n", resultado);
                break;
            case 4:
                if (b == 0.0) {
                    printf("Erro: divisao por zero!\n");
                } else {
                    resultado = a / b;
                    printf("Resultado: %.2f\n", resultado);
                }
                break;
        }
    } while (opcao != 0);

    return 0;
}

Passo a passo

  1. Declaramos as variáveis: opcao (int), a, b e resultado (double).
  2. Usamos um laço do-while para repetir o menu pelo menos uma vez.
  3. Dentro do laço, exibimos o menu com printf e lemos a opção com scanf("%d", &opcao).
  4. Se a opção for 0, exibimos "Saindo..." e usamos break para sair do laço.
  5. Se a opção for inválida (fora de 1 a 4), exibimos erro e continue volta ao início do laço.
  6. Para opções válidas, lemos dois números com scanf("%lf %lf", &a, &b) e usamos switch para realizar a operação.
  7. No caso da divisão, verificamos se b é zero antes de dividir.

Por que funciona

O laço do-while garante que o menu seja exibido pelo menos uma vez e continue até a opção 0. scanf lê os valores formatados, e printf exibe os resultados. A verificação de divisão por zero evita erro em tempo de execução. O switch organiza as operações de forma clara.

Erros comuns

  • Não consumir o \n após scanf antes de ler caracteres: pode causar leituras indesejadas. Neste código não há leitura de caractere, então não é problema.
  • Usar %f em vez de %lf para double no scanf: causa comportamento indefinido.
  • Esquecer o break no switch: executa os casos seguintes indesejadamente.
  • Não tratar divisão por zero: o programa pode travar ou exibir inf.

Outra forma de resolver

Poderia usar fgets e sscanf para ler as entradas, o que evita problemas com buffer, mas scanf é mais direto para este caso.

Saída esperada

=== Calculadora ===
1 - Soma
2 - Subtracao
3 - Multiplicacao
4 - Divisao
0 - Sair
Escolha uma opcao: 1
Digite dois numeros: 3 4
Resultado: 7.00

=== Calculadora ===
1 - Soma
2 - Subtracao
3 - Multiplicacao
4 - Divisao
0 - Sair
Escolha uma opcao: 4
Digite dois numeros: 5 0
Erro: divisao por zero!

=== Calculadora ===
1 - Soma
2 - Subtracao
3 - Multiplicacao
4 - Divisao
0 - Sair
Escolha uma opcao: 0
Saindo...