Description
Bob讨厌复杂的数学运算. 看到练习册上的算术题,Bob很是头痛. 为了完成作业,Bob想要你帮忙写一个文本版的四则运算计算器. 这个计算器的功能需求十分简单,只要可以处理加减乘除和括号就可以了. 你能够帮助Bob吗?
Input
每个样例一行,输入一个长度小于1500的包含有'(',')','+','-','*','/',和'1'~'9'组成的四则运算表达式. 对于每个样例,参与运算数字在0~10000之间,表达式运算的结果在double的表示范围内.
Output
对于每一个例子,输出表达式的计算结果,精确到小数点后4位
Sample Input
3928*3180*3229+2137
2477*8638
1535+7452+3780+2061*280/3070/(7828-9348)
Sample Output
40333570297.0000
21396326.0000
12766.8763
一直想写个比较完善计算器的代码,上次做题的时候遇到了一个,想了很久一直没写出来,看了学姐的代码后,似乎基本明白了,照着敲了一遍,加深记忆。
附上代码:
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<math.h> 5 using namespace std; 6 const int N = 1505; 7 8 char fh[N],s[N]; //符号栈,表达式 9 double num[N]; //数字栈 10 int ftop,ntop; //符号栈顶,数字栈顶 11 void calculate() // 四则运算 12 { 13 if(fh[ftop]=='+') 14 num[ntop-1]+=num[ntop],ntop--; 15 else if(fh[ftop]=='-') 16 num[ntop-1]-=num[ntop],ntop--; 17 else if(fh[ftop]=='*') 18 num[ntop-1]*=num[ntop],ntop--; 19 else if(fh[ftop]=='/') 20 num[ntop-1]/=num[ntop],ntop--; 21 ftop--; 22 } 23 int main() 24 { 25 while(scanf("%s",s)>0) 26 { 27 ftop=0; 28 ntop=0; 29 int flagNum=0,flagNode=0,slen=strlen(s); 30 double ans=0,EE; 31 for(int i=0; i<=slen; ++i) //i要一直运算到slen,因为要把最后一个数存入num数组 32 { 33 if(i!=slen&&(s[i]>='0'&&s[i]<='9'||s[i]=='.')) 34 { 35 if(s[i]=='.')flagNode=1,EE=0.1; 36 else 37 { 38 if(flagNode) //出现小数点的情况 39 { 40 ans+=(s[i]-'0')*EE; 41 EE*=0.1; 42 } 43 else ans=ans*10+s[i]-'0'; //将字符串转换成数保存为ans 44 flagNum=1; 45 } 46 } 47 else 48 { 49 if(flagNum)num[++ntop]=ans; //将转换好的数存入num数组 50 flagNum=0; 51 flagNode=0; 52 ans=0; //全部初始化 53 if(i==slen) break; //如果是最后一个数,则后面将不会存在四则运算,直接跳出循环 54 if(s[i]=='+'||s[i]=='-') //加减的情况 55 { 56 while(ftop&&fh[ftop]!='(') calculate(); 57 fh[++ftop]=s[i]; 58 } 59 else if(s[i]==')') //出现括号的情况 60 { 61 while(ftop&&fh[ftop]!='(') calculate(); 62 ftop--; 63 } 64 else if(s[i]=='*'||s[i]=='/') //乘除的情况 65 { 66 while(ftop&&(fh[ftop]=='*'||fh[ftop]=='/')) calculate(); 67 fh[++ftop]=s[i]; 68 } 69 else fh[++ftop]=s[i]; 70 } 71 } 72 while(ftop) calculate(); //计算还存在数组中的符号 73 74 printf("%.4f ",num[1]); //输出保存至小数点后四位 75 } 76 }