Search code examples
cpointersstructrpncodelite

RPN with header, Why doesn't it work?


I did a RPN, but doesn't show the result and the steps, before was appearing, I don't understand what is happening and there are no errors thrown by compiler either.

I do always this example:

3.2 1.8 - 10 / 2 + .

4 steps = 2.14

I really don't know what's wrong ...

    #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>

// quando dá enter ele fecha
// não está imprimindo o resultado O__O

typedef double pilha_t;

#define PILHA_VAZIA INT_MIN

#define N 100
#define TRUE 1
#define FALSE 0


struct Pilha {
pilha_t pilha[N];
int tamanho;
};

void inicializar(struct Pilha *p) {
p->tamanho = 0;
}

int cheia(struct Pilha *p) {
if (p->tamanho == N)
return TRUE;
return FALSE;
}

int vazia(struct Pilha *p) {
if (p->tamanho == 0)
return TRUE;
return FALSE;
}

void empilhar(struct Pilha *p, pilha_t num) {
if (cheia(p))
printf("Atencao: Pilha cheia!\n");
else {
p->pilha[p->tamanho] = num;
p->tamanho++;
}
}

pilha_t desempilhar(struct Pilha *p) {
if (vazia(p)) {
printf("Atencao: Pilha vazia!\n");
return PILHA_VAZIA;
}
else {
p->tamanho--;
return p->pilha[p->tamanho];
}
}

void imprimir(struct Pilha *p) {
int i;
printf("Pilha");
for(i=0; i < p->tamanho; i++)
printf(" %lf", p->pilha[i]);
printf("\n");
}


int main(int argc, char **argv)
{
struct Pilha p;

    char str[30];// nao esta sendo usada,msg amarela

    inicializar (&p);


    char ch1[30];

printf("Digite a expressao: ");
    fgets(ch1, 30, stdin);


    int i, linha;
    char s[30];
    int k;
    for(k=0;k<30;k++)
        s[k]=' ';

    for (i=0; i<30; i++) {

        char C = ch1[i];

        //printf(" %c \n", C);


        if (isdigit(C) || C == '.'){
            s[linha++] = C;
        } else if (s[0] == '.') {
            double total;
            total = desempilhar(&p);


            printf( "Total = %.2lf\n", total);
            break;

         }
        else if (C == ' ') {
            if (atof(s) != 0)
                empilhar(&p, atof(s));
            linha = 0;
            int k;
            for(k=0;k<30;k++)
                s[k]=' ';

        }
        else if ((C == '+') || (C == '-') || (C == '*') || (C == '/')) {

               double n1, n2, total;
               n2 = desempilhar(&p);
               n1 = desempilhar(&p);



               switch (ch1[i]) {
                    case '+': total = n1 + n2; break;
                    case '-': total = n1 - n2; break;
                    case '*': total = n1 * n2; break;
                    case '/': total = n1 / n2; break;
                    default : printf( "erro no operador\n");
                    exit( EXIT_FAILURE);
            }

            empilhar(&p, total);

        }
        else
            break;


    }
    return (0);
}

Solution

  • The line int i, linha; should be :

    int i, linha = 0;
    

    EDIT :

    As you never use imprimir in your code, steps could not appear. I make some slight modifications in your code apart from the fix above :

    • add a #define DEBUG 1 near the beginning of program to control trace prints
    • protect the #define DEBUG 1 with a #ifndef block to allow to define it at compilation time
    • reverse the order of imprimir and empilhar to allow the use of imprimir in the body of empilhar
    • add a call to imprimir in empilhar

    Here is the resulting code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    #include <ctype.h>
    
    // quando dá enter ele fecha
    // não está imprimindo o resultado O__O
    
    typedef double pilha_t;
    
    #define PILHA_VAZIA INT_MIN
    
    #define N 100
    #define TRUE 1
    #define FALSE 0
    
    #ifndef DEBUG
    #define DEBUG 1
    #endif
    
    
    struct Pilha {
    pilha_t pilha[N];
    int tamanho;
    };
    
    void inicializar(struct Pilha *p) {
    p->tamanho = 0;
    }
    
    int cheia(struct Pilha *p) {
    if (p->tamanho == N)
    return TRUE;
    return FALSE;
    }
    
    int vazia(struct Pilha *p) {
    if (p->tamanho == 0)
    return TRUE;
    return FALSE;
    }
    
    
    pilha_t desempilhar(struct Pilha *p) {
    if (vazia(p)) {
    printf("Atencao: Pilha vazia!\n");
    return PILHA_VAZIA;
    }
    else {
    p->tamanho--;
    return p->pilha[p->tamanho];
    }
    }
    
    void imprimir(struct Pilha *p) {
    int i;
    printf("Pilha");
    for(i=0; i < p->tamanho; i++)
    printf(" %lf", p->pilha[i]);
    printf("\n");
    }
    
    void empilhar(struct Pilha *p, pilha_t num) {
    if (cheia(p))
    printf("Atencao: Pilha cheia!\n");
    else {
    p->pilha[p->tamanho] = num;
    p->tamanho++;
    if (DEBUG) {
        imprimir(p);
    }
    }
    }
    
    int main(int argc, char **argv)
    {
    struct Pilha p;
    
        char str[30];// nao esta sendo usada,msg amarela
    
        inicializar (&p);
    
    
        char ch1[30];
    
    printf("Digite a expressao: ");
        fgets(ch1, 30, stdin);
    
    
        int i, linha = 0;
        char s[30];
        int k;
        for(k=0;k<30;k++)
            s[k]=' ';
    
        for (i=0; i<30; i++) {
    
            char C = ch1[i];
    
            //printf(" %c \n", C);
    
    
            if (isdigit(C) || C == '.'){
                s[linha++] = C;
            } else if (s[0] == '.') {
                double total;
                total = desempilhar(&p);
    
    
                printf( "Total = %.2lf\n", total);
                break;
    
             }
            else if (C == ' ') {
                if (atof(s) != 0)
                    empilhar(&p, atof(s));
                linha = 0;
                int k;
                for(k=0;k<30;k++)
                    s[k]=' ';
    
            }
            else if ((C == '+') || (C == '-') || (C == '*') || (C == '/')) {
    
                   double n1, n2, total;
                   n2 = desempilhar(&p);
                   n1 = desempilhar(&p);
    
    
    
                   switch (ch1[i]) {
                        case '+': total = n1 + n2; break;
                        case '-': total = n1 - n2; break;
                        case '*': total = n1 * n2; break;
                        case '/': total = n1 / n2; break;
                        default : printf( "erro no operador\n");
                        exit( EXIT_FAILURE);
                }
    
                empilhar(&p, total);
    
            }
            else
                break;
    
    
        }
        return (0);
    }
    

    Here is an example of use :

    Digite a expressao: 3.2 1.8 - 10 / 2 + .
    Pilha 3.200000
    Pilha 3.200000 1.800000
    Pilha 1.400000
    Pilha 1.400000 10.000000
    Pilha 0.140000
    Pilha 0.140000 2.000000
    Pilha 2.140000
    Total = 2.14