我做了一个RPN,但是在出现之前没有显示结果和步骤,我不知道发生了什么,编译器也没有抛出任何错误。

我总是这样做:

3.2 1.8-10/2 +。

4个步骤
= 2.14

我真的不知道怎么了...

    #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);
}

最佳答案

int i, linha;行应为:

int i, linha = 0;


编辑:

由于您从未在代码中使用imprimir,因此无法显示步骤。除了上述修复之外,我对您的代码进行了一些小的修改:


在程序开头附近添加#define DEBUG 1以控制跟踪打印
#define DEBUG 1块保护#ifndef以便在编译时对其进行定义
颠倒imprimirempilhar的顺序以允许在imprimir主体中使用empilhar
imprimir中添加对empilhar的呼叫


这是结果代码:

#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);
}


这是一个使用示例:

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

关于c - 带标题的RPN,为什么不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26882900/

10-13 02:50