Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Calculadora polonesa reversa


icemaster

Pergunta

Pessoal, estou com um probleminha aqui nesse programa. O professor pediu pra fazer uma calculadora polonesa onde você coloca primeiro os valores e por ultimo a operação. exemplo: 5/2, ficaria 5 2 /. Eu consegui fazer com as 4 operações basicas: soma, sub, mult, div. O problema é com o logaritmo(log) e raiz quadrada(sqrt).

pois pra calcular raiz quadrada por exemplo eu não preciso de 3 variaveis como no caso da soma por exemplo.

meu código ta assim:

main()
{
      
      char operador, resp;
      float num1, num2, resultado;
            
      resp='S';
      
      printf("###############################################\n");
      printf("#BEM VINDO A CALCULADORA POLONESA REVERSA(RPN)#\n");
      printf("###############################################\n\n");
      
      /* Inicia a calculadora */
      while (resp=='S' || resp=='s')
      {
            printf("Escvreva uma operacao:\n"); scanf("%f %f %c", &num1, &num2, &operador);                
            
            /* Verifica se os operadores são validos */
            while(! num1 || ! num2 || ! operador)
            {
               printf("Operador invalido\n");
               /* Limpa o buffer do teclado */
               fflush(stdin);
               printf("Escvreva uma operacao:\n"); scanf("%f %f %c", &num1, &num2, &operador);
               }
          
              /* Escolhe a operacao aritmetica */
               switch (operador)
                      {
                                case '+': resultado=num1+num2;
                                     break;
                                case '-': resultado=num1-num2;
                                     break;
                                case '*': resultado=num1*num2;
                                     break;
                                case '/': resultado=num1/num2;
                                     break;
                        }
      /* Escreve na tela o resultado */    
      printf("%d %c %d = %.2f\n", num1, operador, num2, resultado);
      /* Pergunta se deseja continuar */
      printf("Deseja continuar?(S/N)"); scanf(" %c", &resp);
      /* Limpa a tela e limpa o buffer do teclado */
      system("cls"); fflush(stdin);
      }
}

no caso eu poderia primeiro perguntar qual operação a pessoa quer fazer. mas o professor disse q não! quer q a pessoa simplismente digite a operação, seja ela: "5 5 *" ou simplismente "10 log" ou "15 sqrt"

me dá uma luz ae

Editado por icemaster
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Não entendi muito bem o que você disse.. qual seria o propósito do Array? Tipo, minha dúvida é quanto ao tipo de variável.. pois no inicio eu tenho que declarar 3 variáveis sendo 2 do tipo Float para os números e 1 do tipo char pra o operador.

Mas caso o usuário queira fazer uma conta de Log por exemplo ele vai usar um Número e logo depois ele vai digitar LOG, ou seja vai dar erro pois eu já defini a variável como Float(float float char).

Teria que ter uma variável que armazena-se 2 tipos de variáveis ou sei lá.. não consigo pensar em nada.

E o professor não quer que o programa pergunte ao usuário qual tipo de operação ele vai usar antes.

Obrigado desde já!

Link para o comentário
Compartilhar em outros sites

  • 0

Leia uma linha. Tokenize pelo espaço. Leia tudo como string. Veja se é uma função ou não. Se for número, use atof para converter em um float. Se for função, aplique-a ao(s) número(s) já guardados.

"O que é tokenizar?"

Veja a função strtok, da string.h.

A melhor forma de criar RPN seria usando uma pilha: http://pt.wikipedia.org/wiki/Pilha_(inform%C3%A1tica)

Exemplo:

-------------------------------------------------------------------------------------------------------------

sqrt seria raiz quadrada

Input: 2 3 + 25 sqrt /

Leu 2, número, joga na pilha.

Leu 3, número, joga na pilha.

Leu +, opa, operação.

Estado da pilha:

3

2

Como é uma operação binária, retire dois números, aplique a adição, e jogue novamente na pilha.

3 + 2 = 5

Joga na pilha.

Estado da pilha:

5

Leu 25, número, joga na pilha.

Leu sqrt (raiz quadrada), operação unária (pega só um número).

Estado da pilha:

25

5

Tira o 25 da pilha, aplica a raiz quadrada e joga na pilha novamente.

raiz quadrada de 25 = 5, joga na pilha.

Estado da pilha:

5

5

Leu /, operação binária (dois números), retira os dois da pilha:

5 / 5 = 1, joga na pilha novamente.

Estado da pilha:

1

Mais nada pra fazer/ler? Pega o número da pilha e mostra.

Retira o 1 da pilha e o mostra na tela:

Output: 1

-------------------------------------------------------------------------------------------------------------

Espero que não tenha ficado muito confuso de entender, fui escrevendo meio apressadamente.

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Muito obrigado Durub, entendi sim essa parte da pilha. Só que eu axo melhor não usa-la porque nem deu ainda em sala de aula, aí o professor pode axar q eu colei =x

Mas você falou sobre uma função chamada atof.. isso pode resolver meus problemas.

Porque no caso eu nem preciso de uma expressão numérica tão grande, com 1 operação já basta. ex: 5x3

Aí no caso eu axo que dá pra fazer sem a pilha correto?

Só não sei como funciona essa função atof, vou pesquisar aqui.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...