Calculadora em C++

Hav0c

Power Member
Comecei a aprender C++ a algum tempo atrás (estou farto do assembly) e então fiz esta calculadora. No entanto, cada vez que divido um numero por zero, aparece um erro.
Como posso arranjar isto?
Código:
/*
    Hav0c's calculator written in C++
    Contact me at [email protected]
    ssgroup.org
    www.rohitab.com/discuss/
    evofx.h4xx0.com/forum/
    vxchaos.cjb.net
    irc: #rohitab and #ss on irc.rohitab.com
*/

#include <iostream>
using namespace std;

int main()
{
    int a;
    int b;
    int result;
    char op;
    char q;
    cout<<"Hav0c's calculator. Press q to exit\n";
    if (q == 'q') goto exit;
    while(cin>>a>>op>>b)
    {
          switch(op)
          {
                   case '+': result = a + b;
                   break;
                   case '-': result = a - b;
                   break;
                   case '*': result = a * b;
                   break;
                   case '/': result = a / b;
                   break;
                   default : cout<<"Error: '"<<op<<"' is not accepted";
                   continue;
          }
          cout<<resault<<endl<<endl;
          }
exit:
    return 0;
}
 
Sabendo eu um pouco de JAVA, e sabendo que Java veio de c++(e não só), isso deve lançar uma excepção(em c++ também se tratam excepções), mete lá um Try catch para tratar da excepção, mas a solução do heckel também faz o mesmo praticamente de outra forma.
 
Tenta a usar a função setprecision, julgo que funcionará. O problema é que reduz a precisão para qualquer número e não apenas para alguns casos.
 
Chamo a atenção a quem disse para usar try-catch que o caso que estamos a ver não se pode tratar com as excepções do C++ directamente. A não ser que:
Código:
 try {
   if (divisor == 0) throw qq_coisa();
 }
 catch (qq_coisa& e) {
   ...
 }

No fundo, quando se utiliza uma linguagem como o Java é isto que é executado sempre que há uma divisão. Numa linguagem como o C++ isso não seria aceitável. O compilador apenas gera o código da divisão, o que acontece neste caso depende do processador, da maneira como está configurado (processor status word) e do sistema operativo. Tipicamente, no UNIX, o processador vai estar configurado para gerar uma interrupção, e essa interrupção indica ao kernel que deve enviar um signal ao processo. No NT, o kernel vai gerar uma excepção mas não das do C++, e sim das do NT (que também funcionam em C), e essa tem de ser apanhada com __try/__catch e não com try/catch.

Quando se utiliza vírgula flutuante, o comportamento pode ser configurado, dependendo das necessidades do programa que estou a fazer. O comportamento típico por defeito do código gerado pelos compiladores é que quando faço uma divisão por 0 dá +Infinito ou -Infinito, e quando faço 0/0 dá NaN. Isto é o que se deseja normalmente, quer em código geométrico, quer em sucessões. Se eu quiser a interrupção/excepção tenho de o configurar.

Em relação ao 2+2 ser escrito como 4.0000, por omissão?? Acharia muito estranho, porque essa operação tem um resultado exacto mesmo em vírgula flutuante. Mais para cima no código alguma coisa deve ter sido configurada para escrever tantas casas decimais.
 
Back
Topo