2、C++项目实战:简易计算器(控制台版)

说实话,每个学C++的人都会经历一个阶段——语法看懂了,但就是不知道能做什么。我记得自己刚学完循环和条件判断那会儿,对着黑乎乎的终端窗口发呆,心想这玩意儿能干啥?

后来我明白了,最好的入门项目就是写一个计算器。它简单到不会让你崩溃,又复杂到能覆盖C++最核心的基础知识。今天我们就一起动手,从零打造一个控制台版的计算器。

本章核心目标:用不到100行代码,实现一个支持加减乘除、能处理连续运算、带错误提示的控制台计算器。

2.1 项目结构设计

写代码之前,我习惯先画个草图。你想想看,一个计算器需要什么?

  • 输入模块:接收用户敲的数字和运算符
  • 运算模块:根据运算符执行对应的计算
  • 输出模块:把结果显示到屏幕上
  • 循环控制:让计算器能一直用,直到用户说退出

下面这张图是我个人习惯用的结构图,把整个流程串起来看,会清晰很多:

简易计算器程序流程图 程序启动 输入第一个数字 输入运算符 (+ - * /) 输入第二个数字

💡 我的经验:写项目前花5分钟画个流程图,能帮你省下半小时的调试时间。别问我怎么知道的——我曾经直接上手写代码,写到一半发现逻辑漏洞,全删了重来。

2.2 核心代码实现

好,思路理清了,咱们直接上代码。我会把每个模块拆开讲,你跟着敲一遍,保证能跑起来。

2.2.1 主循环与用户输入

计算器不能算一次就退出,对吧?所以我们需要一个while循环。我个人习惯用true做死循环,然后在内部判断退出条件。

#include <iostream>
using namespace std;

int main() {
    double num1, num2, result;
    char op;
    char choice;

    cout << "=== 简易计算器 v1.0 ===" << endl;

    while (true) {
        cout << "\n请输入第一个数字: ";
        cin >> num1;

        cout << "请输入运算符 (+, -, *, /): ";
        cin >> op;

        cout << "请输入第二个数字: ";
        cin >> num2;

⚠️ 注意:这里有个坑——如果用户输入的不是数字,cin会进入错误状态,后续所有输入都会失效。我曾经在项目里吃过这个亏,用户随手打了个字母,程序直接崩了。后面我们会加错误处理。

2.2.2 运算逻辑与分支处理

接下来是核心运算部分。用switch还是if-elseswitch,因为运算符就那么几个,结构更清晰。

        switch (op) {
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num1 - num2;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                if (num2 == 0) {
                    cout << "错误:除数不能为零!" << endl;
                    continue;  // 跳过本次循环,重新输入
                }
                result = num1 / num2;
                break;
            default:
                cout << "错误:不支持的运算符!" << endl;
                continue;
        }

        cout << "结果: " << num1 << " " << op << " " << num2 << " = " << result << endl;

看到没?除法那里我特意加了个if (num2 == 0)的判断。为什么?因为除零在C++里会导致程序崩溃,或者返回一个inf(无穷大),这都不是用户想要的。说白了,防御性编程是每个工程师的必修课。

2.2.3 退出机制与完整代码

最后,我们给用户一个选择:继续算还是退出?

        cout << "\n继续计算?(y/n): ";
        cin >> choice;
        if (choice == 'n' || choice == 'N') {
            cout << "感谢使用,再见!" << endl;
            break;
        }
    }

    return 0;
}

把上面三段代码拼在一起,就是一个完整的计算器程序了。总共不到50行,但涵盖了变量、输入输出、循环、分支、错误处理这些核心知识点。

2.3 功能扩展与优化

基础版跑通了,咱们来加点料。我在实际开发中总结了几点优化方向:

优化项 实现方式 难度
连续运算 把上一次的结果作为下一次的输入
输入校验 cin.fail()检测非法输入 ⭐⭐
历史记录 用数组或vector存储每次运算 ⭐⭐⭐
支持括号 引入栈结构处理优先级 ⭐⭐⭐⭐

举个例子,连续运算的实现其实很简单——用户算完3 + 5 = 8后,把8当作下一次的第一个数字就行。代码改动量不超过5行。

💡 一个小技巧:如果你想让计算器看起来更专业,可以用iomanip库里的setprecision控制小数位数。比如cout << fixed << setprecision(2) << result;,这样结果就不会出现一长串小数了。

2.4 常见错误与避坑指南

写这个项目时,新手最容易踩的坑我列一下:

  • 除零问题:上面说过了,必须检查除数
  • 输入缓冲区残留:用cin.ignore()清空缓冲区,否则cin >> choice可能会读到换行符
  • 运算符匹配:用户可能输入%^,记得在default分支处理

我曾经遇到过一个特别隐蔽的bug——用户输入5 + 3(带空格),程序直接跳过运算符读取。后来查资料才知道,cin >>默认以空格分隔,所以+会被当成下一个输入。解决方案是用getline整行读取,再手动解析。

2.5 完整代码示例

最后,我把完整版代码贴出来。这个版本加入了输入校验和连续运算功能,你可以直接复制编译:

#include <iostream>
#include <limits>
using namespace std;

int main() {
    double num1, num2, result;
    char op;
    char choice;
    bool usePrevious = false;

    cout << "=== 简易计算器 v2.0 ===" << endl;
    cout << "支持连续运算,输入 'q' 退出" << endl;

    while (true) {
        if (!usePrevious) {
            cout << "\n请输入第一个数字: ";
            cin >> num1;
        } else {
            cout << "继续使用结果 " << result << " 作为第一个数字" << endl;
            num1 = result;
        }

        // 输入校验
        if (cin.fail()) {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "输入无效,请重新输入数字!" << endl;
            usePrevious = false;
            continue;
        }

        cout << "请输入运算符 (+, -, *, /): ";
        cin >> op;

        cout << "请输入第二个数字: ";
        cin >> num2;

        if (cin.fail()) {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "输入无效,请重新输入!" << endl;
            usePrevious = false;
            continue;
        }

        switch (op) {
            case '+': result = num1 + num2; break;
            case '-': result = num1 - num2; break;
            case '*': result = num1 * num2; break;
            case '/':
                if (num2 == 0) {
                    cout << "错误:除数不能为零!" << endl;
                    usePrevious = false;
                    continue;
                }
                result = num1 / num2;
                break;
            default:
                cout << "错误:不支持的运算符!" << endl;
                usePrevious = false;
                continue;
        }

        cout << "结果: " << num1 << " " << op << " " << num2 << " = " << result << endl;

        cout << "\n继续计算?(y/n, 或输入 'q' 退出): ";
        cin >> choice;
        if (choice == 'n' || choice == 'N' || choice == 'q') {
            cout << "感谢使用,再见!" << endl;
            break;
        }
        usePrevious = true;
    }

    return 0;
}

嗯,到这里,一个完整的控制台计算器就搞定了。你可能会觉得——就这?但我想说的是,所有复杂的软件都是从这样的小项目开始的。把基础打牢,后面学文件操作、面向对象、数据结构时,你才会游刃有余。

去试试吧,把代码敲一遍,改一改,加个新功能。编程这东西,光看是学不会的。


公众号:蓝海资料掘金营,微信deep3321