当前位置: 首页 > news >正文

C++ 第一阶段项目一:实现简易计算器

目录

一、项目目标

二、功能需求

1. 基本功能

2. 扩展功能(选做)

三、实现思路

1. 主程序流程图

2. 关键步骤

四、代码实现

五、代码说明

1. 输入验证

2. 异常处理

3. 模块化设计

六、运行示例

七、扩展建议

八、总结


一、项目目标

实现一个命令行简易计算器,支持以下功能:

  1. 四则运算(加、减、乘、除)
  2. 用户交互(输入操作数和操作符)
  3. 错误处理(除零错误、无效输入)
  4. 循环运行(用户可选择继续或退出)

二、功能需求

1. 基本功能

  • 用户输入两个数字和一个运算符(+-*/
  • 程序计算结果并输出
  • 支持连续计算(用户可选择是否继续)

2. 扩展功能(选做)

  • 输入验证(防止非数字输入)
  • 支持更多运算(如幂运算 ^、取模 %
  • 使用函数封装逻辑

三、实现思路

1. 主程序流程图

开始↓
显示菜单↓
获取用户输入(操作数1、操作符、操作数2)↓
执行计算↓
显示结果↓
询问是否继续↓
结束 or 循环

2. 关键步骤

  • 输入处理:使用 cin 获取用户输入,注意处理输入错误。
  • 错误检查:检查除零错误和无效操作符。
  • 循环控制:使用 do-while 循环保持程序运行。

四、代码实现

#include <iostream>
#include <limits> // 用于输入验证
using namespace std;// 函数声明
void displayMenu();
double getNumber(const string& prompt);
char getOperator();
void calculate(double num1, char op, double num2);
bool confirmContinue();int main() {char choice = 'y';do {displayMenu();double num1 = getNumber("请输入第一个数字: ");char op = getOperator();double num2 = getNumber("请输入第二个数字: ");calculate(num1, op, num2);choice = confirmContinue();} while (choice == 'y' || choice == 'Y');cout << "感谢使用!再见!" << endl;return 0;
}// 显示菜单
void displayMenu() {cout << "简易计算器\n";cout << "支持的运算符: +, -, *, /\n";
}// 获取数字(带输入验证)
double getNumber(const string& prompt) {double num;while (true) {cout << prompt;if (cin >> num) {break;} else {cin.clear(); // 清除错误标志cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略无效输入cout << "输入错误!请输入一个数字。\n";}}return num;
}// 获取操作符
char getOperator() {char op;while (true) {cout << "请输入操作符 (+, -, *, /): ";cin >> op;if (op == '+' || op == '-' || op == '*' || op == '/') {break;} else {cout << "无效的操作符!请重新输入。\n";}}return op;
}// 执行计算
void calculate(double num1, char op, double num2) {try {switch (op) {case '+':cout << "结果: " << num1 + num2 << endl;break;case '-':cout << "结果: " << num1 - num2 << endl;break;case '*':cout << "结果: " << num1 * num2 << endl;break;case '/':if (num2 == 0) {throw runtime_error("除数不能为零!");}cout << "结果: " << num1 / num2 << endl;break;default:cout << "未知错误!" << endl;}} catch (const exception& e) {cerr << "错误: " << e.what() << endl;}
}// 确认是否继续
bool confirmContinue() {char ch;while (true) {cout << "是否继续计算?(y/n): ";cin >> ch;if (ch == 'y' || ch == 'Y' || ch == 'n' || ch == 'N') {return (ch == 'y' || ch == 'Y');} else {cout << "请输入 y 或 n。\n";}}
}

五、代码说明

1. 输入验证

  • 使用 cin.fail() 检测输入错误。
  • 使用 cin.clear() 和 cin.ignore() 清理输入流。

2. 异常处理

  • 使用 try-catch 捕获除零错误。
  • 抛出 runtime_error 提供错误信息。

3. 模块化设计

  • 将功能拆分为独立函数,提高代码可读性和复用性。

六、运行示例

简易计算器
支持的运算符: +, -, *, /
请输入第一个数字: 10
请输入操作符 (+, -, *, /): *
请输入第二个数字: 5
结果: 50
是否继续计算?(y/n): y
请输入第一个数字: 20
请输入操作符 (+, -, *, /): /
请输入第二个数字: 0
错误: 除数不能为零!
是否继续计算?(y/n): n
感谢使用!再见!

七、扩展建议

  1. 添加更多运算

    case '^': // 幂运算cout << "结果: " << pow(num1, num2) << endl;break;
  2. 使用函数指针或 Lambda 表达式

    using Operation = double (*)(double, double);
    map<char, Operation> operations = {{'+', [](double a, double b) { return a + b; }},{'-', [](double a, double b) { return a - b; }}
    };
  3. 面向对象设计

    class Calculator {
    public:void run();
    private:double add(double a, double b);double subtract(double a, double b);
    };

八、总结

通过本项目,你将掌握:

  • 基本输入输出和用户交互
  • 条件判断与循环控制
  • 函数的封装与调用
  • 异常处理和输入验证
  • 模块化编程思想

这是一个非常适合 C++ 初学者的实践项目,建议多调试并尝试扩展功能!

http://www.lryc.cn/news/573478.html

相关文章:

  • MCPServer编程与CLINE配置调用MCP
  • Taro 状态管理全面指南:从本地状态到全局方案
  • 人工智能学习57-TF训练
  • 逆向入门(16)程序逆向篇-Cabeca
  • 成长笔记——多串口发送与接收
  • Python 数据分析与可视化 Day 3 - Pandas 数据筛选与排序操作
  • springboot垃圾分类网站
  • 关于 Kyber:抗量子密码算法 Kyber 详解
  • 【软考高级系统架构论文】论多源数据集成及应用
  • 组件之间的双向绑定:v-model
  • GitHub OAuth 认证示例
  • 闲庭信步使用SV进行图像处理系列教程介绍
  • 2025年- H83-Lc191--139.单词拆分(动态规划)--Java版
  • 吴恩达:从斯坦福到 Coursera,他的深度学习布道之路
  • C++基础练习-二维数组
  • C++ 文件读写
  • GPT-1 与 BERT 架构
  • 开源项目分析:EDoRA | 了解如何基于peft实现EDoRA方法
  • 【软考高级系统架构论文】论无服务器架构及其应用
  • 博图SCL语言GOTO语句深度解析:精准跳转
  • 深入解析ID3算法:信息熵驱动的决策树构建基石
  • GO语言---数组
  • 基于Spring Boot瀚森健身房会员管理系统设计与实现【源码+文档】
  • 作为测试人员,平时用什么大模型?怎么用?
  • 《深入解析:如何通过CSS集成WebGPU实现高级图形效果》
  • 【软考高级系统架构论文】论企业应用系统的数据持久层架构设计
  • 【FineDance】舞蹈多样性的得来
  • RocketMQ--为什么性能不如Kafka?
  • verilog HDLBits刷题“Module cseladd”--模块 cseladd---Carry-select adder 进位选择adder
  • 为车辆提供路径规划解决方案:技术演进、挑战与未来蓝图