Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Algoritmo em C para notação Polonesa

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Algoritmo em C para notação Polonesa

    Pessoal estou fazendo faculdade de ciências da computação e estou com problema em pilha em fazer um algoritmo que transforme uma equação em infixa para posfixa, tambem conhecido como Notação Polonesa, fiz o código mais não estou conseguindo arrumar o erro, alguem poderia me ajudar

    Código:
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "static_stack.h"
    #include "TokenReader_arquivo.c"
    void concatenachar(char* string2, char c){
        int i = strlen(string2);
        string2[i]=c;
        string2[i+1]='\0';
    }
    
    char* converte(char *str){
        char *str2;
        char operador = ' ';
        char carac;
        char* resultado = (char*)calloc((strlen(str)*2),sizeof(char));
        resultado[0]='\0';
        Stack* p = createStack();
        TokenReader* token = newTokenReader(str);
        while(hasMoreTokens(token)){
            str2=nextToken(token);
    
            if(str2[0] == '('){
                push(p,str2[0]);
    		} else if(str2[0]=='+' || str2[0] == '-'){
    			push(p,str2[0]);
    		} else if(str2[0] == '*' || str2[0] == '/'){
    			top(p,&operador);
    			while(operador == '+' || operador=='-'){
    				pop(p,&carac);
    				concatenachar(resultado,' ');
    				concatenachar(resultado,carac);
    				if(!top(p,&operador)) break;
    			}
    			push(p,str2[0]);
    		} else if(str2[0] == ')' ){
    			pop(p,&operador);
    			while(operador!= '('){
    				concatenachar(resultado,' ');
    				concatenachar(resultado,operador);
    				pop(p,&operador);
    			}
    		} else {
    			printf("felipe viado 1");
    			concatenachar(resultado,' ');
    			strcat(resultado, str);
    		}
        }
    
        while(!isEmptyStack(p)){
            concatenachar(resultado,' ');
            pop(p,&operador);
            concatenachar(resultado,operador);
        }
    
        free(str2);
    
        return resultado;
    }
    float calcular(char *str){
        char* str2;
        float v1,v2, resultado;
        Stack* p = createStack();
        TokenReader* token = newTokenReader(str);
        while(hasMoreTokens(token)){
            str2=nextToken(token);
    
                switch(str2[0]){
                    case '+': resultado = v2+v1;
                        break;
                    case '-': resultado = v2-v1;
                        break;
                    case '*': resultado = v2*v1;
                        break;
                    case '/': resultado =v2/v1;
                        break;
                    default: printf(" Erro: Operador não Identificado.");
                }
                push(p,resultado);
            free(str2);
        }
        pop(p,&resultado);
        return resultado;
    }
    
    int main(){
        int op=0;
        char str[50];
        char* str2;
        float resultado;
    
        while (op!= 3 ){
            printf("\n\n>-----------------------------------------------------<");
            printf("\n|                       Calculadora                   |");
            printf("\n>-----------------------------------------------------<");
            printf("\n");
            printf("\n 1  - Converter Infixa -> PosFixa");
            printf("\n 2  - Efetuar Operacao PosFixa");
            printf("\n 3  - Sair");
            printf("\n Opcao:");
            scanf("%d",&op);
            fflush(stdin);
    
    
            switch(op){
                case 1: printf("\n Digite um Expressao para conversao:");
                        fflush(stdin);
                        scanf("%s", str);
                        str2=converte(str);
                        printf("\n PosFixa: %s", str2);
                    break;
    
                case 2: printf("\n Digite um Expressao PosFixa:");
                        fflush(stdin);
                        scanf("%s", str);
                        resultado=calcular(str);
                        printf("\n Resultado: %.3f",resultado);
                    break;
    
    			case 3: exit(1);
                    break;
                default: printf("\n Erro: Opção Invalida");
            }
        }
        return 0 ;
    }
    Saiba invadir para não ser invadido. Quem faz o mal não tem idéia de quanto mal faz a si mesmo. Seja do bem. Seja um profissional de segurança e use os conhecimentos para defesa de sistemas de informação.




X
Working...
X