1

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

1 に答える 1

2

int i, linha;は次のようになります。

int i, linha = 0;

編集 :

imprimirコードで使用したことがないため、ステップが表示されませんでした。上記の修正とは別に、コードに若干の変更を加えます。

  • プログラムの先頭近くに追加して、#define DEBUG 1トレース出力を制御します
  • ブロックで保護し#define DEBUG 1#ifndef、コンパイル時に定義できるようにする
  • imprimirの順序を逆にして、 の本体で をempilhar使用できるようにするimprimirempilhar
  • に呼び出しを追加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
于 2014-11-12T09:32:23.173 に答える