递归例题 整数的四则运算

2017-11-01  本文已影响0人  见习炼丹师
#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)








上一篇 下一篇

猜你喜欢

热点阅读