首页 > 后端开发 > C++ > 正文

如何用C++实现计算器项目 控制台四则运算开发过程

P粉602998670
发布: 2025-08-13 18:13:01
原创
507人浏览过

是,用c++++实现一个支持四则运算、括号、小数、负数和运算符优先级的控制台计算器是初学者练手的好项目,可通过递归下降解析法实现,核心思路是将表达式分层为expression(处理加减)、term(处理乘除)和factor(处理数字、括号和负数),利用递归函数按优先级解析输入,结合跳过空白字符、字符串转数字、括号匹配和除零检测等机制,最终在main函数中循环读取用户输入并输出计算结果,完整代码包含错误处理和测试用例,可进一步扩展支持更多运算符或图形界面,是一个涵盖词法分析、语法解析和异常处理的综合性基础练习。

如何用C++实现计算器项目 控制台四则运算开发过程

用C++实现一个控制台四则运算计算器,是一个非常适合初学者练手的项目。它能帮助你掌握基础语法、输入处理、字符串解析和简单的错误处理。下面我来一步步介绍开发过程和关键实现思路。


一、项目目标

实现一个简单的控制台程序,用户输入类似

3 + 5 * 2
登录后复制
的表达式,程序能正确计算并输出结果(注意运算优先级),支持加减乘除四则运算,支持小数和负数。


二、基本设计思路

由于要处理运算符优先级(乘除优先于加减),不能简单从左到右计算。我们可以采用以下两种常见方式之一:

立即学习C++免费学习笔记(深入)”;

遨虾
遨虾

1688推出的跨境电商AI智能体

遨虾 69
查看详情 遨虾
  • 中缀表达式转后缀(逆波兰) + 栈计算
  • 递归下降解析器(推荐,更直观)

这里我们采用递归下降法,结构清晰,适合初学者理解。


三、核心代码结构

我们将表达式按优先级分层处理:

  • expression()
    登录后复制
    :处理加减(最低优先级)
  • term()
    登录后复制
    :处理乘除(中等优先级)
  • factor()
    登录后复制
    :处理数字、括号、负数(最高优先级)

四、完整代码实现

#include <iostream>
#include <string>
#include <cctype>
#include <stdexcept>

class Calculator {
private:
    std::string input;
    size_t pos;

    // 跳过空白字符
    void skip_whitespace() {
        while (pos < input.length() && std::isspace(input[pos])) {
            pos++;
        }
    }

    // 解析数字(支持小数和负数)
    double parse_number() {
        size_t start = pos;
        if (input[pos] == '-' || input[pos] == '+') {
            pos++;
        }
        while (pos < input.length() && std::isdigit(input[pos])) {
            pos++;
        }
        if (pos < input.length() && input[pos] == '.') {
            pos++;
            while (pos < input.length() && std::isdigit(input[pos])) {
                pos++;
            }
        }
        return std::stod(input.substr(start, pos - start));
    }

    // factor -> number | ( expression ) | -factor | +factor
    double factor() {
        skip_whitespace();

        if (pos >= input.length()) {
            throw std::runtime_error("Unexpected end of input");
        }

        char c = input[pos];

        if (c == '(') {
            pos++;
            double result = expression();
            skip_whitespace();
            if (pos >= input.length() || input[pos] != ')') {
                throw std::runtime_error("Missing closing parenthesis");
            }
            pos++;
            return result;
        } else if (c == '-') {
            pos++;
            return -factor();
        } else if (c == '+') {
            pos++;
            return factor();
        } else if (std::isdigit(c) || c == '.') {
            return parse_number();
        } else {
            throw std::runtime_error("Invalid character: " + std::string(1, c));
        }
    }

    // term -> factor * term | factor / term | factor
    double term() {
        double left = factor();

        while (true) {
            skip_whitespace();
            if (pos >= input.length()) break;

            char op = input[pos];
            if (op == '*' || op == '/') {
                pos++;
                double right = factor();
                if (op == '*') {
                    left *= right;
                } else {
                    if (std::abs(right) < 1e-10) {
                        throw std::runtime_error("Division by zero");
                    }
                    left /= right;
                }
            } else {
                break;
            }
        }

        return left;
    }

    // expression -> term + expression | term - expression | term
    double expression() {
        double left = term();

        while (true) {
            skip_whitespace();
            if (pos >= input.length()) break;

            char op = input[pos];
            if (op == '+' || op == '-') {
                pos++;
                double right = term();
                if (op == '+') {
                    left += right;
                } else {
                    left -= right;
                }
            } else {
                break;
            }
        }

        return left;
    }

public:
    double evaluate(const std::string& expr) {
        input = expr;
        pos = 0;
        skip_whitespace();
        if (pos >= input.length()) {
            throw std::runtime_error("Empty expression");
        }
        double result = expression();
        skip_whitespace();
        if (pos < input.length()) {
            throw std::runtime_error("Unexpected characters after expression");
        }
        return result;
    }
};
登录后复制

五、主函数调用

int main() {
    Calculator calc;
    std::string line;

    std::cout << "简易计算器(输入 'quit' 退出)\n";
    std::cout << "支持 + - * / () 和负数,例如: 3 + 5 * (2 - 1)\n";

    while (true) {
        std::cout << "> ";
        std::getline(std::cin, line);

        if (line == "quit" || line == "exit") {
            break;
        }

        try {
            double result = calc.evaluate(line);
            std::cout << "= " << result << "\n";
        } catch (const std::exception& e) {
            std::cout << "错误: " << e.what() << "\n";
        }
    }

    return 0;
}
登录后复制

六、关键点说明

  • 递归下降解析:将表达式按优先级拆解,每一层处理对应优先级的运算。
  • 负数处理:在
    factor()
    登录后复制
    中识别
    -
    登录后复制
    作为负号(而非减号),通过递归处理。
  • 括号支持:在
    factor()
    登录后复制
    中处理
    (...)
    登录后复制
    ,递归调用
    expression()
    登录后复制
  • 错误处理:对除零、括号不匹配、非法字符等给出提示。
  • 空格跳过:提升用户体验,允许输入带空格。

七、测试用例

你可以测试以下表达式:

  • 3 + 5 * 2
    登录后复制
    → 13
  • (3 + 5) * 2
    登录后复制
    → 16
  • -3 + 4
    登录后复制
    → 1
  • 10 / -2
    登录后复制
    → -5
  • 3.5 + 2.1 * 2
    登录后复制
    → 7.7

八、扩展建议

  • 支持更多运算符(如幂运算
    ^
    登录后复制
  • 添加变量支持(用
    std::map
    登录后复制
    存储)
  • 支持函数调用(如
    sin(30)
    登录后复制
  • 改造成图形界面(结合 Qt 或其他库)

基本上就这些。这个项目不复杂,但涵盖了词法分析、语法解析、异常处理等核心编程技巧,是学习C++的好起点。

以上就是如何用C++实现计算器项目 控制台四则运算开发过程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号