表达式求值
- 描述
-
Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。
假设表达式可以简单定义为:
1. 一个正的十进制数 x 是一个表达式。
2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。
3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。
4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。
例如, 表达式 max(add(1,2),7) 的值为 7。
请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。
- 输入
- 第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。) - 输出
- 输出有N行,每一行对应一个表达式的值。
- 样例输入
-
3 add(1,2) max(1,999) add(min(1,1000),add(100,99))
- 样例输出
-
3 999 200
- 来源
- 第四届河南省程序设计大赛
-
1 #include <iostream> 2 #include <stdio.h> 3 #include <string> 4 5 using namespace std; 6 7 /////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 //这个表达式求值,要先算最小单元的数值,可以采用递归方式 9 10 char str[350]; //使用全局数据保存字符串 11 int first;//字符当前位置 12 13 int min(int x,int y) 14 { 15 return x>y ? y:x; //返回比较小的数 16 } 17 int max(int x,int y) 18 { 19 return x>y ? x:y;//返回比较大的数 20 } 21 22 int fun() //函数,分析字符 23 { 24 int v,n;//保存数字及数字的位数 25 switch(str[first]) //分析字符串的开头字符 26 { 27 case 'm': //有可能是max,min 28 first+=3;//指向括号 29 if(str[first-2]=='i')//对于min 30 return min(fun(),fun()); //如min(3,5),递归时就会分别返回3和5,然后当成min的参数 31 else 32 return max(fun(),fun()); 33 break; 34 35 case 'a': //是add 36 first+=3; 37 return fun()+fun(); //如add(3,5),递归时就会返回3和5 38 break; 39 case ',': //分隔符 40 case '(': 41 case ')': 42 first++;//跳过不处理 43 return fun();//继续递归 44 break; 45 default: //数字 46 sscanf(str+first,"%d%n",&v,&n);//从字符str+first开始将数字读入v,数字位数为n 47 first+=n;//走过数字 48 return v; 49 break; 50 51 } 52 53 } 54 55 int main() 56 { 57 int n; 58 scanf("%d",&n);//n组测试数据 59 while(n--) 60 { 61 scanf("%s",str);//字符数据 62 cout<<fun()<<endl; 63 first=0;//每次测试完要使first归零 64 } 65 66 return 0; 67 }