boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

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


avatar
站长 2025年8月14日 4

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

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

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


一、项目目标

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

3 + 5 * 2

的表达式,程序能正确计算并输出结果(注意运算优先级),支持加减乘除四则运算,支持小数和负数。


二、基本设计思路

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

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

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

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


三、核心代码结构

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

  • 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++的好起点。



评论(已关闭)

评论已关闭