这一题我们可以通过递归求解,首先我们可以把一个表达式分为三部分,分别是:

(1)表达式 :项、加减

(2)项:因子、乘除

(3)因子:数、()表达式

这三项构成了递归的关系,我们可以看到,要求一个表达式的值,我们首先要求一个项的值,要求一个项的值,我们首先要求一个因子的值,要求一个因子的值,我们首先要看它是由什么组成的。

它既可以是由表达式加上括号组成的,也可以是由数组成,当发现它是数时,我们就计算这个数的大小。

浮点数的计算我们分为两部分,首先先算出整数部分的大小,不断地取一位然后看看是否结束,不结束就再取一位,将之前的乘十然后加上这一位,然后我们通过cin.peek()函数可以看到这一位是什么,如果这一位是  .   我们就开始小数部分的计算,和之前的类似,每次减小十倍而已。

如果是表达式的话,我们继续之前的那个过程,表达式 -> 项 -> 因子 ,不断地递归求解。

对于表达式的求值,我们首先求出第一项的值,看看是否有后一项,有的话我们就进行计算,没有就结束。因为当进行之后的递归的时候,我们是要吃掉后面的字符的,我们使用过之后就把它丢掉。

使用完+ - * / ( ) 之后我们要把它吃掉,求项的时候我们也是相同的流程,先求一项,判断是否还有,然后进行下一步的操作,大致就是这样了。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<iomanip>
using namespace std;
double factor();
double term();
double exp(); double exp() //求表达式的值
{
double res=term();
while(true)
{
char op = cin.peek(); //看输入流中的下一个字符,不取走
if(op=='+' || op=='-')
{
cin.get(); //从输入流中取走一个字符
double val = term();
if(op=='+') res+=val;
else res-=val;
}else break;
}
return res;
} double term()
{
double res=factor();
while(true)
{
char op = cin.peek();
if(op=='*' || op=='/')
{
cin.get();
double val = factor();
if(op=='*') res *= val;
else res /=val;
}else break;
}
return res;
} double factor()
{
char c = cin.peek();
double res=0;
if(c=='(')
{
cin.get();
res = exp();
cin.get();
}else{
while(isdigit(c))
{
cin.get();
res = res*10+c-'0';
c=cin.peek();
}
if(c=='.') //有小数部分
{
double val=0;
double base = 0.1;
cin.get();
c=cin.peek();
while(isdigit(c))
{
cin.get();
val += (c-'0')*base;
c=cin.peek();
base = base * 0.1;
}
res += val;
}
}
return res;
} int main()
{
double ans = exp();
cout<<fixed<<setprecision(2)<<ans<<endl;
return 0;
}

最新文章

  1. MWeb 1.5 发布!增加打字机滚动模式、发布到 Evernote、印象笔记、Wordpress.com、Blogger、编辑器内代码块语法高亮
  2. 概率论与数理统计讲课PPT和往年期末试卷
  3. REDIS源码中一些值得学习的技术细节02
  4. TinyFrame升级之七:重构Repository和Unit Of Work
  5. Canvas俄罗斯方块
  6. c++中获取代码运行时间
  7. POJ 1285 确定比赛名次
  8. 类、对象以及jvm运行内存解析
  9. 在LaTeX里插入全页的pdf 分类: LaTex 2015-02-04 17:20 142人阅读 评论(0) 收藏
  10. Lucene.Net 2.3.1开发介绍 —— 简介
  11. EF 打造冲不掉的标签
  12. mysql_SQL_按照日统计微博数
  13. Android 编译错误
  14. nodeJS中的包
  15. nodejs之querystring模块
  16. Java学习笔记22---内部类之成员内部类的继承问题
  17. 2018-2019-2 20165313 Exp2 后门原理与实践
  18. checkbox 选中的id拼接长字符串
  19. Android 异常 android.os.NetworkOnMainThreadException
  20. tensorFlow(三)逻辑回归

热门文章

  1. 洛谷P4867 Gty的二逼妹子序列(莫队+树状数组)
  2. byte的范围-128-127
  3. hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!
  4. HDU 4565 So Easy! 数学 + 矩阵 + 整体思路化简
  5. P2044 随机数生成器
  6. 使用JS移除select的某些选项
  7. [BZOJ2705][SDOI2012]Longge的问题 数学
  8. jQuery选择器之可见性选择器
  9. 编程挑战JavaScript进阶篇(慕课网题目)
  10. vue-cli下配置项目访问ip和服务器ip