gpt4 book ai didi

c - 带 header 的 RPN,为什么不起作用?

转载 作者:行者123 更新时间:2023-11-30 15:27:43 26 4
gpt4 key购买 nike

我做了一个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 block 以允许在编译时定义它
  • 颠倒 imprimir 的顺序和empilhar允许使用imprimirempilhar 的体内
  • 添加调用 imprimirempilhar

这是生成的代码:

#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 - 带 header 的 RPN,为什么不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26882900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com