1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Calculadora em C++

Discussão em 'Programação' iniciada por Hav0c, 21 de Fevereiro de 2007. (Respostas: 15; Visualizações: 9001)

  1. Hav0c

    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;
    }
    
    
     
  2. HecKel

    HecKel The WORM

    valida dentro do case do / se o divisor é zero, se sim, retorna erro. (isto é apenas uma solução possível)

    abraços, HecKel
     
  3. Romani48

    Romani48 Power Member

    e tb é obvio que te dá um erro nenhum numero é divisivel por 0.... :P
     
  4. Antonio Raimund

    Antonio Raimund Power Member


    Tal como o Heckel diz, se fizeres a validação antes de correres o codigo tens sempre o codigo estruturado.
    Agora o erro que te aparece é normal, pois a divisao por 0 é impossivel.
     
  5. MadOnion

    MadOnion Folding Member

    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.
     
  6. Hav0c

    Hav0c Power Member

    OK, vou tentar arranjar o erro desta maneira.
     
  7. Goncalo Silva

    Goncalo Silva Power Member

    Exactamente. A maneira mais elegante de tratares isso é com Exception Handling. Vê aqui.
     
  8. Kreamer

    Kreamer Power Member

    Alguem sabe tirar os zeros ??

    Por exemplo quando se faz uma conta (2+2) aparece (4.000000) !

    Cumps
     
  9. Baderous

    Baderous Banido

  10. Kreamer

    Kreamer Power Member

  11. MPalhas

    MPalhas Power Member

    se aparecem as casas decimais deve ser por ser um float, por isso em vez de %.0d tenta %.0f
     
  12. Kreamer

    Kreamer Power Member

    Tirou os zeros, mas se meter 2.3 + 2.5 dá 5!
     
    Última edição: 18 de Outubro de 2008
  13. OubeLa

    OubeLa Power Member

    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.
     
  14. Kreamer

    Kreamer Power Member


    Nao encontra essa funçao...:confused:

    Já ando a anha-las com isto!
     
    Última edição: 18 de Outubro de 2008
  15. bsd

    bsd Power Member

    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.
     

Partilhar esta Página