5.表达式求值(1)

5.表达式求值(1)

成绩10开启时间2018年10月10日 星期三 20:00
折扣0.8折扣时间2018年11月1日 星期四 23:55
允许迟交关闭时间2018年11月11日 星期日 23:55

 

背景:

我们的教材中已经介绍了表达式求值的算法,现在我们将该算法的功能进行扩展,要求可以处理的运算符包括:+、-、*、/、%(整数取余)、^(乘方)、(、)。

要求:

采用算符优先算法,计算的中间结果只保留整数。

输入:

第一行为整数N。表示下面有N个表达式

从第二行起的后面N行为N个由整数构成的表达式

输出:

共N行,每行为相应表达式的计算结果。

如果判断出表达式有错误,则输出:error.

如果在计算过程中出现除数为0的情况,则输出:Divide 0.

特殊情况说明:

在表达式中,如果操作数出现负数(例如-8),则要特别注意。例如:
10加-8表示为:10+-8。
10减-8表示为:10--8。

#include "stdio.h"  
#include "string.h"  
#include "math.h"  
#define MAX 9999999  
  
int figure[100];  
char symbol[100];  
int topf = -1, tops = -1;  
char operation[9] = {'+','-','*','/','(',')','#','^','%'};  
char checklist[9][9] = {  
    {'>','>','<','<','<','>','>','<','<'},  
    {'>','>','<','<','<','>','>','<','<'},  
    {'>','>','>','>','<','>','>','<','>'},  
    {'>','>','>','>','<','>','>','<','>'},  
    {'<','<','<','<','<','=',' ','<','<'},  
    {'>','>','>','>',' ','>','>','>','>'},  
    {'<','<','<','<','<',' ','=','<','<'},  
    {'>','>','>','>','<','>','>','<','>'},  
    {'>','>','>','>','<','>','>','<','>'}  
};  
int number(char *q){  
    return (int)(*q - '0');  
}  
  
void push_figure(int q){  
    figure[++topf] = q;  
}  
  
int pop_figure(){  
    return figure[topf--];  
}  
  
char pop_symbol(){  
    return symbol[tops--];  
}  
  
void push_symbol(char ch){  
    symbol[++tops] = ch;  
}  
  
int operate(int x, int y, char symbol){  
    switch(symbol){  
        case '+': return x+y;  
        case '-': return x-y;  
        case '*': return x*y;  
        case '/': if(y) return x/y;  
                  else{  
                      printf("Divide 0.\n");  
                      return MAX;  
                  }  
        case '%': return (int)fmod(x,y);  
        case '^': if(y>=0) return (int) pow(x,y);  
                    else{  
                        printf("error.\n");  
                        return MAX;  
                    }  
        default: printf("error.\n");  
                 return MAX;  
    }  
}  
  
char compare(char x, char y){  
    int a, b;  
    for(int i = 0; i <= 8; i++){  
        if(operation[i] == x){  
            a = i;  
            break;  
        }  
    }  
    for(int i = 0; i <= 8; i++){  
        if(operation[i] == y){  
            b = i;  
            break;  
        }  
    }  
    return checklist[a][b];  
}  
int main(){  
    int n, flag = 0;//0表示数字 1表示( 2表示其他  
    char expression[100], *p;  
      
      
    scanf("%d",&n);  
    while(n--){  
        flag = 2;  
        scanf("%s",expression);  
        strcat(expression, "#");//E代表运算结束标志  
        p = expression;  
        push_symbol('#');  
      k:while(*p != '#' || symbol[tops] != '#'){  
            if(*p >='0' && *p <= '9'){  
                if(flag == 0){  
                    push_figure(pop_figure()*10+number(p++));  
                    flag = 0;  
                }  
                else  
                    push_figure(number(p++));  
                    flag = 0;  
            }  
            else{  
                  
                if(flag == 1){  
                    if(*p == '+' || *p == '-' || *p == '*' || *p == '/' || *p == '%' ||*p == '^'){  
                        printf("error.\n");  
                        goto j;  
                    }  
                }  
                if(*p == '(') flag = 1;  
                else flag = 2;  
  
                if(tops == -1){  
                    printf("error.\n");  
                    goto j;  
                }  
                else{  
                    char ch = pop_symbol(), ans;  
                    ans = compare(ch, *p);  
                    if(ans == ' '){  
                        printf("error.\n");  
                        goto j;  
                    }  
                    else if(ans == '<'){  
                        push_symbol(ch);  
                        push_symbol(*p++);  
                        goto k;  
                    }  
                    else if(ans == '='){  
                          
                        p++;  
                        goto k;  
                    }  
                    else{  
                        //对x,y,ch进行运算,并将数字存进  
  
                        int integer_x, integer_y;  
                        integer_y = pop_figure();  
                        integer_x = pop_figure();  
                        int judge = operate(integer_x, integer_y, ch);  
                        if(judge == MAX)  
                            goto j;  
                        else   
                            push_figure(judge);  
                        continue;  
                    }  
                    p++;  
                }  
                  
            }  
        }  
        if(topf == 0 && tops == 0) printf("%d\n",figure[topf]);  
        else{  
            printf("error.\n");  
        }  
     j:   memset(expression,'\0',100);  
        topf = -1;  
        tops = -1;  
    }  
    return 0;  
}  

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值