#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int expression_value();//计算表达式的值,表现为:值+值
int term_value();//计算项的值,表现为:值*值
int factor_value();//计算因子的值,其中因子可能是括号中的表达式,也可能是数字
int main()
{
cout<<expression_value()<<endl;
return 0;
}
//计算表达式的值
int expression_value(){
//将表达式的值先赋成项第一个项的值,项的值已被取走
int result=term_value();
//再看看有没有其他的项
char c=cin.peek();//只看一个字符,不取走,在这里表示观察下一个字符以判断表达式有没有结束
while(c=='+'||c=='-'){
cin.get();//作用是取走一个字符(在这里是加减符号)
//项之间的运算
if(c=='+'){
result+=term_value();
}
else
result-=term_value();
//再次看一个字符,回到循环判断
c=cin.peek();
}
return result;
}
//计算项的值,计算方法和表达式差不多,读取对象变成了因子
int term_value(){
int result=factor_value();
char c=cin.peek();
while(c=='*'||c=='/'){
cin.get();
if(c=='*'){
result*=factor_value();
}
else
result/=factor_value();
c=cin.peek();
}
return result;
}
//计算因子的值
int factor_value(){
int result=0;
char c=cin.peek();
//看是不是括号括起来的表达式
if(c=='('){
cin.get();
result+=expression_value();
cin.get();//两个get负责吃掉括号
}
//是数字的情况,接下来需要考虑怎么把字符串转化为数字,需要用到一个判断是否是数字的函数
else{
//每当有一个新的数,把原来的那个数向高位移动一位
while(isdigit(c)){
result=result*10+c-'0';
cin.get();//吃掉这一位
c=cin.peek();//读取下一位
}
}
return result;
}
这一题我第一反应是为什么没有输入语句。。。对cin输入流还不够清晰啊。
这道题情况比较复杂,但分解后就会成为比较好理解的几个模块
需要积累的是标准输入函数cin的用法:cin.peek(),cin.get()
还有判断字符是否为数字的函数 bool isdigit(char)
递归例题 整数的四则运算
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1-deque&queue和 stack深度探索deque与vector不同,deque看似连续,却是由多个分段空...