• 文本计算器


    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 }
  • 相关阅读:
    jquery 获取select框选中的值示例一则
    jsp的三种自定义标签 写法示例
    通过 SQL Server 视图访问另一个数据库服务器表的方法
    [转]SQLServer跨服务器访问数据库(openrowset/opendatasource/openquery)
    JS 禁用和重新启用a标签的点击事件
    JS原生父子页面操作
    为什么我们有时不用配置java环境变量?
    Android -- ViewPager多页面滑动切换以及动画效果
    Android -- 程序启动画面 Splash
    apache 伪静态 .htaccess
  • 原文地址:https://www.cnblogs.com/pshw/p/4752362.html
Copyright © 2020-2023  润新知