当前位置:   article > 正文

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。

  1. #include "stdio.h"
  2. #include "string.h"
  3. #include "math.h"
  4. #define MAX 9999999
  5. int figure[100];
  6. char symbol[100];
  7. int topf = -1, tops = -1;
  8. char operation[9] = {'+','-','*','/','(',')','#','^','%'};
  9. char checklist[9][9] = {
  10. {'>','>','<','<','<','>','>','<','<'},
  11. {'>','>','<','<','<','>','>','<','<'},
  12. {'>','>','>','>','<','>','>','<','>'},
  13. {'>','>','>','>','<','>','>','<','>'},
  14. {'<','<','<','<','<','=',' ','<','<'},
  15. {'>','>','>','>',' ','>','>','>','>'},
  16. {'<','<','<','<','<',' ','=','<','<'},
  17. {'>','>','>','>','<','>','>','<','>'},
  18. {'>','>','>','>','<','>','>','<','>'}
  19. };
  20. int number(char *q){
  21. return (int)(*q - '0');
  22. }
  23. void push_figure(int q){
  24. figure[++topf] = q;
  25. }
  26. int pop_figure(){
  27. return figure[topf--];
  28. }
  29. char pop_symbol(){
  30. return symbol[tops--];
  31. }
  32. void push_symbol(char ch){
  33. symbol[++tops] = ch;
  34. }
  35. int operate(int x, int y, char symbol){
  36. switch(symbol){
  37. case '+': return x+y;
  38. case '-': return x-y;
  39. case '*': return x*y;
  40. case '/': if(y) return x/y;
  41. else{
  42. printf("Divide 0.\n");
  43. return MAX;
  44. }
  45. case '%': return (int)fmod(x,y);
  46. case '^': if(y>=0) return (int) pow(x,y);
  47. else{
  48. printf("error.\n");
  49. return MAX;
  50. }
  51. default: printf("error.\n");
  52. return MAX;
  53. }
  54. }
  55. char compare(char x, char y){
  56. int a, b;
  57. for(int i = 0; i <= 8; i++){
  58. if(operation[i] == x){
  59. a = i;
  60. break;
  61. }
  62. }
  63. for(int i = 0; i <= 8; i++){
  64. if(operation[i] == y){
  65. b = i;
  66. break;
  67. }
  68. }
  69. return checklist[a][b];
  70. }
  71. int main(){
  72. int n, flag = 0;//0表示数字 1表示( 2表示其他
  73. char expression[100], *p;
  74. scanf("%d",&n);
  75. while(n--){
  76. flag = 2;
  77. scanf("%s",expression);
  78. strcat(expression, "#");//E代表运算结束标志
  79. p = expression;
  80. push_symbol('#');
  81. k:while(*p != '#' || symbol[tops] != '#'){
  82. if(*p >='0' && *p <= '9'){
  83. if(flag == 0){
  84. push_figure(pop_figure()*10+number(p++));
  85. flag = 0;
  86. }
  87. else
  88. push_figure(number(p++));
  89. flag = 0;
  90. }
  91. else{
  92. if(flag == 1){
  93. if(*p == '+' || *p == '-' || *p == '*' || *p == '/' || *p == '%' ||*p == '^'){
  94. printf("error.\n");
  95. goto j;
  96. }
  97. }
  98. if(*p == '(') flag = 1;
  99. else flag = 2;
  100. if(tops == -1){
  101. printf("error.\n");
  102. goto j;
  103. }
  104. else{
  105. char ch = pop_symbol(), ans;
  106. ans = compare(ch, *p);
  107. if(ans == ' '){
  108. printf("error.\n");
  109. goto j;
  110. }
  111. else if(ans == '<'){
  112. push_symbol(ch);
  113. push_symbol(*p++);
  114. goto k;
  115. }
  116. else if(ans == '='){
  117. p++;
  118. goto k;
  119. }
  120. else{
  121. //对x,y,ch进行运算,并将数字存进
  122. int integer_x, integer_y;
  123. integer_y = pop_figure();
  124. integer_x = pop_figure();
  125. int judge = operate(integer_x, integer_y, ch);
  126. if(judge == MAX)
  127. goto j;
  128. else
  129. push_figure(judge);
  130. continue;
  131. }
  132. p++;
  133. }
  134. }
  135. }
  136. if(topf == 0 && tops == 0) printf("%d\n",figure[topf]);
  137. else{
  138. printf("error.\n");
  139. }
  140. j: memset(expression,'\0',100);
  141. topf = -1;
  142. tops = -1;
  143. }
  144. return 0;
  145. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/858347
推荐阅读
相关标签
  

闽ICP备14008679号