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

用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
(3 + 5) * 2
-3 + 4
10 / -2
3.5 + 2.1 * 2
^
std::map
sin(30)
基本上就这些。这个项目不复杂,但涵盖了词法分析、语法解析、异常处理等核心编程技巧,是学习C++的好起点。
以上就是如何用C++实现计算器项目 控制台四则运算开发过程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号