文本计算器

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 }
原文地址:https://www.cnblogs.com/pshw/p/4752362.html