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\n",num[1]); //输出保存至小数点后四位
75 }
76 }