C中的反向波兰表示法故障排除

时间:2015-10-14 05:50:40

标签: c rpn

要问的问题是评估RPN表达式并使=是序列的终止字符,以便程序运行RPN并计算给出的表达式。所以我遇到麻烦的是理解我应该如何将我的字符转换为整数,因为指令特别说使用scanf("%c",& ch)将输入作为字符拉入而不是整数。我如何将我的字符转换为int,以便我可以将它们推送到数组并相应地对它们进行操作?

//
// input: 1 2 3 * + =
// output: 7
//

#include <stdio.h>
#include <stdlib.h>
int collection[100];
int top;

void push(double v){
    if (top>99)
    {
        printf ("Stack Overflow\n");
        exit(0);
    }
    collection[++top]=v;
}
double pop(){
    double v;
    if(top < 0)
    {
        printf("stack underflow\n");
        exit(0);
    }
    v=collection[--top];
    return v;

}

int main(void){
    char ch;
    double a,b,c,sum;
    int i;
    top=-1;

    printf("Enter an RPN expression: ");
    while(ch!='='){
        scanf("%c", &ch);
        i=0;
        c=1;
        push(ch);
        if(collection[i]=='+'){
            a=pop();
            b=pop();
            c=b+a;
            push(c);
        }
        else if(collection[i]=='-'){
            a=pop();
            b=pop();
            c=b-a;
            push(c);
        }
        else if(collection[i]=='*'){
            a=pop();
            b=pop();
            c=b*a;
            push(c);
        }
        else if(collection[i]=='/'){
            a=pop();
            b=pop();
            c=b/a;
            push(c);
        }
        else{
            while(collection[i]!=0){
                i++;
            }
            i=i-1;
            sum=0;
            while(i>=0){
                sum=sum+((collection[i]-48)*c);
                c=c*10;
                i--;
            }
            push(sum);
        }
    }
    printf("%lf\n",c);
}

2 个答案:

答案 0 :(得分:0)

使用double atof(const char *nptr);

atof()函数转换指向的字符串的初始部分 到nptrdouble。虽然你给计算器命令的编程结构很糟糕。在算法中为每个任务使用单独的函数以避免并发症

这是(部分)我的RPN计算器:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "cal.h"
#define MAXOP 100

int main(){

   int type;
   double op2,op3;
   char s[MAXOP];

   while((type = getop(s)) != EOF){
       switch(type){
       case NUMBER:
            push(atof(s));
            break;
       case 'x':
            op2 = pop();
            op3 = pop();
            push(op2);
            push(op3);
            break;
       case 'o':
            clear();
            break;
       case 's':
            push(sin(pop()));
            break;
       case '+':
            push(pop() + pop());
            break;
       case '*':
            push(pop() * pop());
            break;
       case '-':
            op2 = pop();
            push(pop() - op2);
            break;
       case '/':
            op2 = pop();
            push(pop() / op2);
            break;
       case '%':
            op2 = pop();
            push((int)pop() % (int)op2);
            break;
       case '\n':
            printf("\t%.4g\n",showtop());
            break;
       default: 
            printf("What was that?\n");
            break;
       }
   }

   return 0;
}

答案 1 :(得分:0)

如果对unsigned int数字满意:

char ch;
scanf( "%c", &ch );
ch -= '0';

然后,您可以通过乘以10并添加下一个数字来组成数字。