这个题做的人还是比较爽的,挑战了下,没想到自己这个大菜鸟居然搞定了。^_^,而且觉得还是比较简洁明了,跟大家交流分享下.
- 题目描述:
-
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
- 输入:
-
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
- 输出:
-
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
- 样例输入:
-
1 + 2 4 + 2 * 5 - 7 / 11 0
- 样例输出:
-
3.00 13.36
代码:1 #include<stdio.h> 2 int main() 3 { 4 double n[200]; 5 while(1) 6 { 7 int index = 0;//记录数组的长度 8 int j, flag = 1;//j用来当作循环计数器,flag就是为了方便退出输入循环 9 double sum; //记录结果 10 char c; //还是为了方便控制输入 11 while(scanf("%lf",&n[index++])) 12 { 13 c = getchar(); //该c用来读入' ' 同时如果读入的是'\n'就直接退出输入循环 14 if(c != ' ') 15 break; 16 c = getchar(); //用来读入符号 17 if( c == '0') 18 { 19 flag = 0; 20 break; 21 } 22 n[index++] = (int)c - 60; //将符号转化为负数记录,方便判断 23 } 24 if( flag == 0 || (index == 1 && n[0] == 0)) 25 break; 26 27 for(j = 1; j < index; j = j + 2) //遍历数组,先寻找出 '*'(42) '/'(47) 两个符号进行计算 28 { 29 if( n[j] == 42 - 60 ) 30 { 31 n[j+1] = n[j-1] * n[j+1]; 32 n[j] = -1; //用-1 来清空不需进行检索的数据,同时,之后的运算不用再考虑左边的数,只需对右边的数进行计算即可 33 n[j-1] = -1; 34 } 35 else if ( n[j] == 47 - 60) 36 { 37 n[j+1] = n[j-1] / n[j+1]; 38 n[j] = -1; 39 n[j-1] = -1; 40 } 41 } 42 j = 0; 43 while(n[j] == -1) 44 j++; 45 sum = n[j]; //寻找第一个数字对sum进行初始化 46 for(j = 1; j < index; j = j + 2) //遍历进行 + - 运算 47 { 48 if( n[j] == 43 - 60) 49 { 50 while(n[j+1] == -1) 51 j++; 52 sum += n[j+1]; 53 } 54 else if( n[j] == 45 - 60) 55 { 56 while(n[j+1] == -1) 57 j++; 58 sum -= n[j+1]; 59 } 60 } 61 printf("%.2f\n",sum); 62 63 } 64 return 0; 65 66 }