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();

}

运行结果:

目录
相关文章
|
人工智能 自然语言处理 开发者
ChatGPT4的生图功能你们都用了吗?
ChatGPT4的生图功能你们都用了吗?
620 0
|
7月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》图、查找、排序专题考点(含解析)
408考研——《数据结构》图,查找和排序专题考点选择题汇总(含解析)。
264 29
|
7月前
|
运维 Kubernetes 数据可视化
即时通讯开源项目OpenIM配置可视化-etcd配置中心
即时通讯开源项目OpenIM二次开发
249 6
|
监控 安全 数据挖掘
网络游戏服务器如何有效防护DDoS与CC攻击
随着网络游戏行业的蓬勃发展,其背后的服务器架构日益复杂,同时也面临着前所未有的网络安全威胁。其中,分布式拒绝服务(DDoS)和CC(Challenge Collapsar,一种针对网页的攻击方式)攻击尤为突出,它们通过大量伪造请求或恶意流量,使服务器资源耗尽,导致服务中断或响应缓慢。因此,保障网络游戏服务器的安全,有效防护DDoS与CC攻击,已成为游戏行业亟待解决的问题。
|
9月前
|
数据可视化 搜索推荐 项目管理
一分钟解决Excel多人协作的版本混乱问题
多人协同编辑Excel彻底解决了传统多人编辑时的版本混乱问题。通过云端实时同步,团队成员可以同时更新同一表格,避免了邮件传递和手动合并的繁琐。实时协作不仅提升了效率,还防止了版本冲突。Excel的“更改历史记录”功能支持查看和回滚操作,确保错误可追溯。
|
10月前
|
监控 持续交付 API
深入理解微服务架构及其在现代软件开发中的应用
深入理解微服务架构及其在现代软件开发中的应用
178 5
|
机器学习/深度学习 人工智能 对象存储
人工智能平台PAI产品使用合集之大文件如何下载下来
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
监控 安全 网络协议
|
人工智能 开发者
Kimi Chat:国内AI新星,20万字超长文本处理的突破者
【2月更文挑战第12天】Kimi Chat:国内AI新星,20万字超长文本处理的突破者
3125 2
Kimi Chat:国内AI新星,20万字超长文本处理的突破者