表达式求值
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
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
来源
- 第四届河南省程序设计大赛 上传者
之前写了这道。打算练练手,调了几个小时,醉了。重点是replace函数没记清。replace三个参数时,第二个参数表示长度,不是末位置。还有变换后字符串长度要更新…… 把遇到')'时,对应的'('标记位置为pos1,')'为pos2,找到',',find函数查找。把'('和','之间的字符串赋值为left,','和')'之间的字符串赋值为right,然后再判断s[pos1-1]的字符是'n','x',还是'd',把结果覆盖。从头再循环继续操作,直到表达式里没有'('为止...
#include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<algorithm> using namespace std; int main() { int N,len,i,pos1,pos,pos2,j,k,right1,left1; string s; char sum[100],left[100],right[100]; cin>>N; while(N--) { cin>>s; len=s.size(); for(i=0;i<len;i++) { if(s.find("(")==-1) break; else if(s[i]=='(') pos1=i; else if(s[i]==')') { pos2=i; pos=s.find(',',pos1); k=0; for(j=pos1+1;j<pos;j++) { left[k]=s[j]; k++; } left[k]='\0'; k=0; for(j=pos+1;j<pos2;j++) { right[k++]=s[j]; } right[k]='\0'; sscanf(left,"%d",&left1); sscanf(right,"%d",&right1); if(s[pos1-1]=='d') { sprintf(sum,"%d",right1+left1); s.replace(pos1-3,pos2-pos1+4,sum); } else if(s[pos1-1]=='x') { if(right1>left1) { s.replace(pos1-3,pos2-pos1+4,right); } else { s.replace(pos1-3,pos2-pos1+4,left); } } else if(s[pos1-1]=='n') { if(right1>left1) { s.replace(pos1-3,pos2-pos1+4,left); } else { s.replace(pos1-3,pos2-pos1+4,right); } } i=-1; len=s.size();//勿忘。。哎,忘了写了 } } cout<<s<<endl; } return 0; }
-
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)