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
scanfpara ler a opção e os números. - Usar
printfpara 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
- Declaramos as variáveis:
opcao(int),a,beresultado(double). - Usamos um laço
do-whilepara repetir o menu pelo menos uma vez. - Dentro do laço, exibimos o menu com
printfe lemos a opção comscanf("%d", &opcao). - Se a opção for 0, exibimos "Saindo..." e usamos
breakpara sair do laço. - Se a opção for inválida (fora de 1 a 4), exibimos erro e
continuevolta ao início do laço. - Para opções válidas, lemos dois números com
scanf("%lf %lf", &a, &b)e usamosswitchpara realizar a operação. - 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
\napósscanfantes de ler caracteres: pode causar leituras indesejadas. Neste código não há leitura de caractere, então não é problema. - Usar
%fem vez de%lfparadoublenoscanf: causa comportamento indefinido. - Esquecer o
breaknoswitch: 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...