赞
踩
成绩 | 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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。