当前位置:   article > 正文

11.表达式求值(1)_输入: 第一行为整数n。表示下面有n个表达式 从第二行起的后面n行为n个由整数构成

输入: 第一行为整数n。表示下面有n个表达式 从第二行起的后面n行为n个由整数构成
成绩10开启时间2021年09月24日 星期五 20:00
折扣0.8折扣时间2021年10月10日 星期日 23:55
允许迟交关闭时间2021年10月17日 星期日 23:55

背景:

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

要求:

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

输入:

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

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

输出:

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

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

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

特殊情况说明:

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

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 4↵
  2. 2^3↵
  3. 2^0↵
  4. 2^3^2↵
  5. 2^(3-1)^(10-8)↵
以文本方式显示
  1. 8↵
  2. 1↵
  3. 512↵
  4. 16↵
1秒64M0
测试用例 2以文本方式显示
  1. 11↵
  2. (2+8↵
  3. 2+8)↵
  4. 8/0↵
  5. 8/(8+5-13)↵
  6. 2^(2-5)↵
  7. 10-(80-30(/3*3+4↵
  8. 10-80-30)/3*3+4↵
  9. (2+8)(3+2)↵
  10. (2)3(8)↵
  11. 30(/3+3)+4↵
  12. 10(20-8)+2↵
以文本方式显示
  1. error.↵
  2. error.↵
  3. Divide 0.↵
  4. Divide 0.↵
  5. error.↵
  6. error.↵
  7. error.↵
  8. error.↵
  9. error.↵
  10. error.↵
  11. error.↵
1秒64M0
测试用例 3以文本方式显示
  1. 2↵
  2. 10(10)↵
  3. 14*10-(10)2↵
以文本方式显示
  1. error.↵
  2. error.↵
1秒64M0
测试用例 5以文本方式显示
  1. 14↵
  2. 18-32↵
  3. 18/4↵
  4. 18%3↵
  5. 10+20*4↵
  6. 10-20/4↵
  7. (18-3)*3↵
  8. 10*(10)↵
  9. (10+2)/(8-10)↵
  10. (2*3)/(5*2)↵
  11. 10-(80-30)/3*3+4↵
  12. (((2+8)*2-(2+4)/2)*2-8)*2↵
  13. (((8+2)*(4/2)))↵
  14. 10/0↵
  15. (10-80*2↵
以文本方式显示
  1. -14↵
  2. 4↵
  3. 0↵
  4. 90↵
  5. 5↵
  6. 45↵
  7. 100↵
  8. -6↵
  9. 0↵
  10. -34↵
  11. 52↵
  12. 20↵
  13. Divide 0.↵
  14. error.↵
1秒64M0

代码

最近要忙保研的事,就先把代码贴出来,题解之后会补上(也许补不上了也说不定哈哈哈)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. char pro[9][9]={
  6. {'>','>','<','<','<','>','>','<','<'},
  7. {'>','>','<','<','<','>','>','<','<'},
  8. {'>','>','>','>','<','>','>','<','>'},
  9. {'>','>','>','>','<','>','>','<','>'},
  10. {'<','<','<','<','<','=',' ','<','<'},
  11. {'>','>','>','>',' ','>','>','>','>'},
  12. {'<','<','<','<','<',' ','=','<','<'},
  13. {'>','>','>','>','<','>','>','<','>'},
  14. {'>','>','>','>','<','>','>','<','>'}
  15. };
  16. int op(int a, int b, char opt)
  17. {
  18. if(opt=='+')
  19. {
  20. return a+b;
  21. }
  22. else if(opt=='-')
  23. {
  24. return a-b;
  25. }
  26. else if(opt=='*')
  27. {
  28. return a*b;
  29. }
  30. else if(opt=='/')
  31. {
  32. if(b==0)
  33. {
  34. printf("Divide 0.\n");
  35. return 0x3f3f3f3f;
  36. }
  37. else
  38. {
  39. return a/b;
  40. }
  41. }
  42. else if(opt=='%')
  43. {
  44. return a%b;
  45. }
  46. else if(opt=='^')
  47. {
  48. if(b>=0)
  49. {
  50. return pow(a,b);
  51. }
  52. else
  53. {
  54. printf("error.\n");
  55. return 0x3f3f3f3f;
  56. }
  57. }
  58. else
  59. {
  60. printf("error.\n");
  61. return 0x3f3f3f3f;
  62. }
  63. }
  64. int shu[100010];
  65. char opt[100010];
  66. char ex[100010];
  67. int main()
  68. {
  69. int N;
  70. int i,j,k,m,n,a,b;
  71. int flag=0;
  72. int flag1=0;
  73. int flag2=0;
  74. int flag3=0;
  75. int flag4=0;
  76. int flag5=0;
  77. char Opt[9]={'+','-','*','/','(',')','#','^','%'};
  78. memset(ex,'\0',sizeof(ex));
  79. int exp=0,shup=-1,optp=-1;
  80. scanf("%d",&N);
  81. while(N--)
  82. {
  83. char c;
  84. flag=2;
  85. flag1=0;
  86. flag2=0;
  87. flag3=0;
  88. flag4=0;
  89. flag5=0;
  90. k=0;
  91. int fuhaoyou=0;
  92. scanf("%s",ex);
  93. strcat(ex,"#");
  94. opt[++optp]='#';
  95. for(a=0;a<=strlen(ex)-3;a++)
  96. {
  97. flag5=0;
  98. int fuhao=a;
  99. if(ex[fuhao]=='+'||ex[fuhao]=='-'||ex[fuhao]=='*'||ex[fuhao]=='/'||ex[fuhao]=='%'||ex[fuhao]=='^')
  100. {
  101. flag5++;
  102. fuhao++;
  103. }
  104. if(ex[fuhao]=='+'||ex[fuhao]=='-'||ex[fuhao]=='*'||ex[fuhao]=='/'||ex[fuhao]=='%'||ex[fuhao]=='^')
  105. {
  106. flag5++;
  107. fuhao++;
  108. }
  109. if(ex[fuhao]=='+'||ex[fuhao]=='-'||ex[fuhao]=='*'||ex[fuhao]=='/'||ex[fuhao]=='%'||ex[fuhao]=='^')
  110. {
  111. flag5++;
  112. fuhao++;
  113. }
  114. if(flag5>=3)
  115. {
  116. printf("error.\n");
  117. memset(ex,'\0',sizeof(ex));
  118. memset(shu,0,sizeof(shu));
  119. memset(opt,'\0',sizeof(opt));
  120. shup=-1;
  121. flag1++;
  122. exp=0;
  123. flag5=0;
  124. optp=-1;
  125. fuhaoyou++;
  126. break;
  127. }
  128. }
  129. while(ex[exp]!='#'||opt[optp]!='#')
  130. {
  131. if(fuhaoyou!=0)
  132. {
  133. break;
  134. }
  135. if(ex[exp]>='0'&&ex[exp]<='9')
  136. {
  137. if(flag==0)
  138. {
  139. int aaa=0;
  140. aaa=shu[shup--]*10+(ex[exp++]-'0');
  141. shu[++shup]=aaa;
  142. flag=0;
  143. }
  144. else
  145. {
  146. shu[++shup]=ex[exp++]-'0';
  147. flag=0;
  148. }
  149. }
  150. else
  151. {
  152. if(flag4==1)
  153. {
  154. shu[0]*=-1;
  155. flag4=0;
  156. }
  157. if(flag==1)
  158. {
  159. if(ex[exp]=='+'||ex[exp]=='-'||ex[exp]=='*'||ex[exp]=='/'||ex[exp]=='^'||ex[exp]=='%')
  160. {
  161. printf("error.\n");
  162. flag1++;
  163. memset(ex,'\0',sizeof(ex));
  164. memset(shu,0,sizeof(shu));
  165. memset(opt,'\0',sizeof(opt));
  166. shup=-1;
  167. optp=-1;
  168. exp=0;
  169. break;
  170. }
  171. }
  172. if(ex[exp]=='(')
  173. {
  174. flag=1;
  175. int s=exp+1;
  176. int d=s+1;
  177. if(ex[s]=='-'&&ex[d]>='0'&&ex[d]<='9')
  178. {
  179. flag=2;
  180. flag4=1;
  181. exp=s+1;
  182. opt[++optp]='(';
  183. continue;
  184. }
  185. }
  186. else
  187. {
  188. flag=2;
  189. }
  190. if(optp==-1)
  191. {
  192. printf("error.\n");
  193. memset(ex,'\0',sizeof(ex));
  194. memset(shu,0,sizeof(shu));
  195. memset(opt,'\0',sizeof(opt));
  196. flag1++;
  197. shup=-1;
  198. optp=-1;
  199. exp=0;
  200. break;
  201. }
  202. else
  203. {
  204. char com=opt[optp--];
  205. char Ex;
  206. for(i=0;i<9;i++)
  207. {
  208. if(Opt[i]==com)
  209. {
  210. m=i;
  211. }
  212. if(Opt[i]==ex[exp])
  213. {
  214. n=i;
  215. }
  216. }
  217. Ex=pro[m][n];
  218. if(Ex=='<')
  219. {
  220. if(exp==0&&ex[exp]=='-')
  221. {
  222. flag4=1;
  223. exp++;
  224. optp++;
  225. continue;
  226. }
  227. opt[++optp]=com;
  228. opt[++optp]=ex[exp++];
  229. continue;
  230. }
  231. else if(Ex=='=')
  232. {
  233. exp++;
  234. continue;
  235. }
  236. else if(Ex==' ')
  237. {
  238. printf("error.\n");
  239. memset(ex,'\0',sizeof(ex));
  240. memset(shu,0,sizeof(shu));
  241. memset(opt,'\0',sizeof(opt));
  242. shup=-1;
  243. flag1++;
  244. exp=0;
  245. optp=-1;
  246. break;
  247. }
  248. else
  249. {
  250. int q=exp-1;
  251. if(ex[exp]=='-')
  252. {
  253. if(ex[q]=='('||ex[q]=='*'||ex[q]=='/'||ex[q]=='%'||ex[q]=='+'||ex[q]=='-')
  254. {
  255. opt[++optp]=com;
  256. exp++;
  257. flag2=1;
  258. continue;
  259. }
  260. }
  261. if(flag2==1)
  262. {
  263. shu[shup]*=-1;
  264. flag2=0;
  265. }
  266. if(flag3==1)
  267. {
  268. shu[--shup]*=-1;
  269. shup++;
  270. flag3=0;
  271. }
  272. b=shu[shup--];
  273. a=shu[shup--];
  274. k=op(a,b,com);
  275. if(k==0x3f3f3f3f)
  276. {
  277. memset(ex,'\0',sizeof(ex));
  278. shup=-1;
  279. optp=-1;
  280. exp=0;
  281. memset(shu,0,sizeof(shu));
  282. memset(opt,'\0',sizeof(opt));
  283. break;
  284. }
  285. else
  286. {
  287. shu[++shup]=k;
  288. }
  289. continue;
  290. }
  291. exp++;
  292. }
  293. }
  294. }
  295. if(shup==0&&optp==0)
  296. {
  297. if(flag4==1)
  298. {
  299. printf("%d\n",-shu[shup]);
  300. flag4=0;
  301. }
  302. else
  303. {
  304. printf("%d\n",shu[shup]);
  305. }
  306. }
  307. else
  308. {
  309. if(k!=0x3f3f3f3f&&flag1==0)
  310. {
  311. printf("error.\n");
  312. }
  313. }
  314. memset(ex,'\0',sizeof(ex));
  315. memset(shu,0,sizeof(shu));
  316. memset(opt,'\0',sizeof(opt));
  317. exp=0;
  318. fuhaoyou=0;
  319. shup=-1;
  320. flag1=0;
  321. optp=-1;
  322. }
  323. return 0;
  324. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/858330
推荐阅读
相关标签
  

闽ICP备14008679号