4常量表达式计算器

简介:  #include <iostream> #include <cstdlib> #include <cctype> //字符串判定   using namespace std; const int MAX = 1024; double operation(char *str); c


#include <iostream>

#include <cstdlib>

#include <cctype> //字符串判定

 

using namespace std;

const int MAX = 1024;

double operation(char *str);

char * extract(char *str, int &index)

{

    char *pstr(nullptr);//处理字符串

    int num(0);//记录一下多少对括号

    int bufindex(index);//记录下标

 

    do

    {

        switch (*(str + index))

        {

        case ')':

            if (0 == num)

            {

                ++index;

                pstr = new char[index - bufindex];

                if (!pstr)

                {

                    throw  "malloc fail";

                }

                //拷贝字符串

                strncpy_s(pstr, index - bufindex, str + bufindex, index - bufindex - 1);

                return pstr;

            }

            else

            {

                num--;

            }

            break;

        case '(':

            num++;

            break;

        }

    } while (*(str + index++) != '\0');

    throw  "errorfail";

}

 

//获得计算表达是中字符串的数字

double getNum(char *str, int &index)

{

    double value(0.0);

 

    if (*(str + index) == '(')

    {

        char *substr(nullptr);

        substr = extract(str, ++index);

 

        value = operation(substr);

        delete[] substr;

 

        return value;

    }

 

    if (!isdigit(*(str + index)))

    {

        char error[30] = "geterror";

        throw error;

    }

 

    //判断数值是否是数值

    while (isdigit(*(str + index)))

    {

        value = 10 * value + (*(str + index++) - '0');

    }

    //带有小数点时不做处理

    if (*(str + index) != '.')

    {

        return value;

    }

    else

    {

        double decimals(1.0); //定义一个小数

        while (isdigit(*(str + (++index))))

        {

            decimals /= 10;

            value = value + (*(str + index) - '0') * decimals;

        }

        return value;

    }

}

 

double term(char *str, int & index)

{

    double value(0.0);

    value = getNum(str, index);//获取数据

    while (1)

    {

        if (*(str+index) == '*')

        {

            //乘除法

            value *= getNum(str, ++index);

        }

        else if (*(str + index) == '/')

        {

            value /= getNum(str, ++index);

        }

        else

        {

            break;

        }

    }

    return value;

}

 

double operation(char *str)

{

    double value(0.0);

    int index(0);

    value += term(str, index);

    for (;;)

    {

        switch (*(str + (index++)))

        {

        case '\0':

            return value;

            break;

        case '+':

            value += term(str,index);

            break;

        case '-':

            value -= term(str, index);

            break;

        default:

            break;

        }

    }

}

 

void removeBlankSpace(char *str)

{

    int i(0);

    int j(0);

    //*(str + i) = *(str + j++) :通过这种方式循环获得字符串中的每个字符

    //下面的意思是获得字符不是'\0',也就是说没有到达字符串末尾

    //下面的方式是把不是空格的字符赋值给*(str+i)

    while ((*(str + i) = *(str + j++))!= '\0')

    {

        if (*(str+i) != ' ')

        {

            i++;

        }

    }

    //两个下标轮替,往前移动,链表的算法一样,循环向前挖

}

 

void main()

{

    char str[MAX] = { 0 };

    cout << "请输入表达式";

    cin.getline(str, MAX);

    cout << "\n" << str << endl;

 

    //去除空格

    removeBlankSpace(str);

 

    cout << str << endl;

 

    cout << operation(str) << endl;

 

    cin.get();

}

运行结果:

目录
相关文章
|
存储 SQL 运维
一步到位,服务器监控就是这么简单
对于运维的日常工作来说,服务器监控是必须且最基础的一项内容。在企业基础设施运维过程中,管理员必须能够掌握所有服务器的运行状况,以便及时发现问题,尽可能减少故障的发生。本期为大家介绍如何使用阿里云SLS来快速构建一套完整的服务器/主机基础指标实时监控方案。
5580 0
 一步到位,服务器监控就是这么简单
浪漫3D圣诞树特效【附源码】Merry Christmas to My Girl !
浪漫3D圣诞树特效【附源码】Merry Christmas to My Girl !
218 1
|
Web App开发 定位技术
|
图形学 Android开发
Unity粒子特效系列-下雨预制体做好了,拿走直接就用!
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
2081 1
|
机器学习/深度学习 算法 Python
机器学习常见异常和解决办法汇总
scikit-learn是一个Python机器学习库,提供了很多基础的模型和算法。
|
芯片
L298N电机驱动模块的接线使用与代码实现
L298N电机驱动模块的接线使用与代码实现
1693 0
L298N电机驱动模块的接线使用与代码实现
|
存储 SQL 消息中间件
基于MaxCompute+Hologres的人群圈选和数据服务实践
基于MaxCompute+Hologres的人群圈选和数据服务实践
1845 1
基于MaxCompute+Hologres的人群圈选和数据服务实践