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

Calculadora Polonesa


Thiago Mendes

Pergunta

Galera, seguinte eu preciso fazer uma calculadora polonesa em C, esse código está basicamente como o do professor só mudei algumas coisas que estavam dando conflito, preciso urgentemente de ajuda por favor, o programa não está funcionando, apesar de parecer estar certo ;/

A idéia do programa é entrar com, por exemplo:

(3*(4+5))

e ele te retornar a resposta correta, sendo que a leitura é feita tipo:

( , enter

3, enter

*, enter...

Obrigado desde já, e se possível gostaria do máximo de explicações possíveis, por que usei pouco char até hoje, e não sei direito a diferença entre

char valor, e char valor[10] e tal...

#include <stdio.h>

struct ptr{
    char valor[10];
    struct ptr *prox;
} *p, *num, *op; // num = números .: op = operadores;

void empilha(struct ptr *p1, char valor[10]){
    struct ptr *aux;
    aux = (struct ptr*) malloc(sizeof(struct ptr));
    strcpy(aux -> valor, valor);
    aux -> prox = p1;
    p1 = aux;
    aux = (struct ptr*) NULL;
}

void desempilha(struct ptr *p1, char *num[10]){
    struct ptr *aux;
    aux = p1;
    p1 = aux -> prox;
    aux -> prox = (struct ptr*) NULL;
    strcpy(*num,aux -> valor);
    free(aux);
    aux = (struct ptr*) NULL;
}

void cria_expressao(){
    struct ptr *aux;
    char valor[10];
    p = (struct ptr*) NULL;
    printf("Entre com a expressao: ( coloque um '.' para indicar o final )");
    scanf("%s", &valor);
    if(strcmp(valor,".")){
        p = (struct ptr*) malloc(sizeof(struct ptr));
        strcpy(p -> valor,valor);
        aux = p;
        printf("Entre com a expressao: ");
        scanf("%s", &valor);
        while(strcmp(valor,".")){
            aux -> prox = (struct ptr*) malloc(sizeof(struct ptr));
            aux = aux -> prox;
            strcpy(aux -> valor,valor);
            printf("Entre com a expressao: ");
            scanf("%s", &valor);
        }
        aux -> prox = (struct ptr*) NULL;
        aux = aux -> prox;
    }
}

void calcula(){
    struct ptr *aux;
    int valor,resposta,a1,b1;
    char cadeia[10],*a[10],*b[10],*operador[1];
    aux = p;
    if(p == (struct ptr*) NULL)
        printf("não há expressao.");
    else{
        while(aux != (struct ptr*) NULL){
            resposta = atoi(aux -> valor);
            if(resposta)
                empilha(num,aux -> valor);
            else{
                if( ! ((strcmp(aux -> valor,"+")) || (strcmp(aux -> valor,"*"))) ){
                    empilha(op,aux -> valor);
                }
                else{
                    if(strcmp(aux -> valor,")")){
                        desempilha(num,a);
                        desempilha(num,b);
                        desempilha(op,operador);
                        a1 = atoi(a);
                        b1 = atoi(b);
                        if(!(strcmp(*operador,"+")))
                            valor = b1 + a1;
                        if(!(strcmp(*operador,"*")))
                            valor = b1 * a1;
                        itoa(valor,cadeia,10);
                        empilha(num,cadeia);
                    }
                }
            }
            aux = aux -> prox;
        }
        desempilha(num,a);
        printf("Resposta = %s", a);
    }
}

void mostra(struct ptr *p1){
    struct ptr *aux;
    aux = p1;
    if( p1 == (struct ptr*) NULL )
        printf("não há expressao.");
    else
        while( aux != (struct ptr*) NULL ){
            printf("%s ", aux -> valor);
            aux = aux -> prox;
        }
    printf("\n");
}

main(){
    cria_expressao();
    mostra(p); // para mostrar que a expressao foi lida corretamente
    num = (struct ptr*) NULL;
    op = num;
    calcula();
    getch();
}

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Encontrei alguns errinhos. Seguem eles:

1) Faltou incluir algumas bibliotes:

#include <stdlib.h>
#include <conio.h>
#include <string.h>
2) A função scanf não precisa do '&' (no seu caso). Corrija para:
scanf("%s", valor);
3) Na função "calcula()", a variável 'a' é um ponteiro pra ponteiro, logo, você precisa corrigir o "printf()":
printf("Resposta = %s", *a);
4) Sugiro corrigir o cabeçalho da função "main()" e adicionar o "return 0" no final dela. Dependendo do compilador, pode ficar dando mensagens de warning.
int main(void)
{
    cria_expressao();
    mostra(p); // para mostrar que a expressao foi lida corretamente
    num = (struct ptr*) NULL;
    op = num;
    calcula();
    getch();

    return 0;
}

Fazendo essas modificações, seu código funcionou corretamente pra mim.

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,1k
×
×
  • Criar Novo...