Jump to content

hitz

Members
  • Content count

    1
  • Joined

  • Last visited

Community Reputation

0 Comum

About hitz

  • Birthday 07/27/1994

Informações Pessoais

  • Sexo
    Masculino
  • Localização
    São Paulo

Contato

  • Twitter
    @hitzINSIDER
  1. Olá, eu fiz uma calculadora em C usando pilha. O erro é que, quando eu utilizo uma divisão, ele retorna o último valor digitado e não o resultado correto. Ex: 6/6 + 2 . Retorno: 2 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct pilha{ char op; struct pilha * proximo; }Pilha; typedef struct pilhaN{ int op; struct pilhaN * proximo; }PilhaN; Pilha * posFixa=NULL; Pilha * posFixaInv=NULL; Pilha * temp=NULL; PilhaN * calculo=NULL; void calculaExpressao(); void empilhaN(PilhaN **pilha, int op); void empilha(Pilha **pilha, char op); void desempilhaN(PilhaN ** fPilha); void desempilha(Pilha ** fPilha); void transfereTempPos(); void imprime(Pilha *topo); void calcula(char operador); void inverte(); int main(){ char op; printf( "Digite a expressao: " ); scanf( "%c", &op ); while( op != '\n' ) { switch (op){ case '+': case '-': while((temp) && (temp->op != '(')){ transfereTempPos(); } empilha(&temp,op); break; case '*': case '/': while((temp) && (temp->op != '+') && (temp->op != '-') && (temp->op != '(')) { transfereTempPos(); } empilha(&temp,op); break; case ')': while((temp) && (temp->op != '(')){ transfereTempPos(); } if((temp) && (temp-> op == '(')){ Pilha *aux; aux = temp; temp = temp->proximo; free(aux); } break; case '(': empilha(&temp,op); break; default: empilha(&posFixa,op); break; } scanf( "%c", &op ); } while(temp){ transfereTempPos(); } imprime(posFixa); printf( "\n" ); calculaExpressao(); printf( "\n" ); } void empilha(Pilha ** fPilha, char op){ Pilha * aux; aux = ( Pilha *) malloc( sizeof( Pilha ) ); aux -> op = op; aux -> proximo = *fPilha; *fPilha = aux; } void empilhaN(PilhaN ** fPilha, int op){ PilhaN * aux; aux = ( PilhaN *) malloc( sizeof( PilhaN ) ); aux -> op = op; aux -> proximo = *fPilha; *fPilha = aux; } void desempilha(Pilha ** fPilha){ Pilha * aux; aux = *fPilha; *fPilha = (*fPilha)->proximo; free(aux); } void desempilhaN(PilhaN ** fPilha){ PilhaN * aux; aux = *fPilha; *fPilha = (*fPilha)->proximo; free(aux); } void transfereTempPos(){ Pilha *aux; aux = temp->proximo; temp->proximo = posFixa; posFixa = temp; temp = aux; } void imprime(Pilha *topo){ if( topo ) { imprime( topo -> proximo ); printf( "%c", topo -> op ); } } void calcula(char operador){ int a,b,c; a = calculo->op; desempilhaN(&calculo); b = calculo->op; desempilhaN(&calculo); switch (operador){ case '+': c = a + b; break; case '-': c = a - b; break; case '*': c = a * b; break; case '/': c = a / b; break; defalt: break; } empilhaN(&calculo,c); } void calculaExpressao(){ inverte(); while(posFixaInv){ switch (posFixaInv->op){ case '+': case '-': case '*': case '/': calcula(posFixaInv->op); break; default: empilhaN(&calculo,posFixaInv->op-48); break; } desempilha(&posFixaInv); } printf("%i",calculo->op); } void inverte(){ Pilha * aux; while(posFixa){ empilha(&posFixaInv,posFixa->op); desempilha(&posFixa); } }
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.