Ir ao conteúdo

C++ Defeito em um código de calculadora simples


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

Olá, eu estou recentemente me aventurando pela area de programação, e me deparei com o seguinte código e problema:

 

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
 
float calcula (float a, float b, char c)
{
      float resultado;
      switch (c)
      {
             case '+' :
resultado = (a+b);
                             break;
             case '-' :
resultado = (a-b);
                             break;
             case '*' :
resultado = (a*b);
                             break;
             case '/' :
resultado = (a/b);
                             break;
             default :
return (0);
                             break;
      }
      return (resultado);
}
 
int main ()
{
    float op1, op2, resposta;
    char sinal, opcao;
   
    setlocale(LC_ALL, "Portuguese");
    do {
      system("cls");
      printf ("\nDigite o primeiro valor: ");
      scanf ("%f", &op1);
      printf ("\nDigite o segundo valor: ");
      scanf ("%f", &op2);
      printf ("\nDigite a operação (+ - * /): ");
      sinal = getch();
      resposta = calcula (op1, op2, sinal);
      printf ("\nResultado: %.2f", resposta);
      printf ("\n\n Deseja continuar (s/n): ");
      scanf (" %c", &opcao);
    } while (opcao == 'S' || opcao == 's');
}

 

Existe um pequeno defeito no código que gera um problema previsível no momento da execução do mesmo que é a divisão por zero, que por definição matemática, não possui resposta. Dê uma sugestão que possa auxiliar na solução deste problema.

 

Será que alguém pode me ajudar? Muito grato!!

  • Amei 1
  • Solução
Postado

Teste o retorno de scanf(). Sempre. É ingênuo não testar. Veja o manual.

 

Não precisa do loop em main() deste modo. Pode encerrar quando não ler o primeiro valor. Mais simples e menos chato para quem está usando. 

Pode ler os 3 valores de uma vez, assim o cara não precisa necessariamente digitar TODOS esses 4 ENTER.

Consuma o ENTER que termina cada scanf() usando p. ex. fgetc. Ou não use scanf ...

 

Na função retorne o resultado. Não precisa ficar esperando o final do loop. Mais simples e legivel

 

Entenda que 0 e (0) é a mesma coisa. E são int. Evite conversões implícitas. É um hábito ruim. Escreva 0F para float e 0. para double.

 

Esse código é equivalente para calcula()

 

float calcula(float a, float b, char c)
{
    switch (c)
    {
        case '+':
            return a + b;
        case '-':
            return a - b;
        case '*':
            return a * b;
        case '/':
            if (b != 0) return a / b;
            fprintf( stderr,
                "  Erro: Tentativa de dividir %f por 0.\n");
            return 0.F;
        default:
            fprintf( stderr,
                "  Erro: Operador Invalido: '%c' para %f e %f\n",
                c, a, b);
            return 0.F;
    }
    return 0.F;
}

 

E talvez concorde que é mais simples de ler. E resolve o problema da divisão por zero de algum modo.

 

E tem a cortesia de avisar quando o operador é inválido ou 0 para a divisão. E a saída pode ser omitida.

 

E não carrega um float até o fim do código simplesmente para retornar.

 

Não há razão para usar conio.h dos anos 80. E não é padrão. Não vem com os compiladores.

 

Não precisa da variável resposta já que não vai operar com ela.

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!