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

【C++】简单计算器问题的深度解析与优化对比


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯问题描述
  • 💯实现 1:我的实现
    • 代码
    • 分析
      • 优点
      • 不足
  • 💯实现 2:老师的第一种实现
    • 代码
    • 分析
      • 优点
      • 不足
  • 💯实现 3:老师的第二种实现
    • 代码
    • 分析
      • 优点
      • 不足
  • 💯对比分析
  • 💯综合建议与扩展
    • 最优实现思路
    • 潜在扩展方向
  • 💯小结


在这里插入图片描述


💯前言

  • 在编程领域中,问题的解决远不止于代码的逻辑实现,而在于代码的正确性效率性以及可维护性的综合权衡。本文以一道 “简单计算器” 的经典 C++ 题目为切入点,对其实现进行深入剖析,包括输入处理逻辑判断错误处理等核心环节。同时,通过对三种不同实现方案的比较,揭示各自的优缺点,并进一步探讨可能的优化与扩展方向。本文旨在不仅关注代码的正确性,更注重其效率鲁棒性扩展能力,为解决更复杂的编程问题提供理论与实践基础。
    C++ 参考手册
    在这里插入图片描述

💯问题描述

简单计算器
在这里插入图片描述

该问题旨在实现一个支持整数运算的简单四则运算计算器,具体要求如下:

基本规则

  1. 除零错误处理:若除数为零,应输出 Divided by zero!
  2. 非法操作符处理:若操作符不是 +-*/,则输出 Invalid operator!

输入格式

输入包含三部分:

  • 两个整数(ab)。
  • 一个字符操作符(+-*/)。

输出格式

输出根据输入的运算结果或错误提示。

示例输入与输出

示例 1
输入:

1 2 +

输出:

3

示例 2
输入:

2 4 *

输出:

8

示例 3
输入:

5 0 /

输出:

Divided by zero!

示例 4
输入:

5 0 ?

输出:

Invalid operator!

💯实现 1:我的实现


代码

#include <iostream>
using namespace std;int main() {int a, b;char c;cin >> a >> b >> c;if (c != '+' && c != '-' && c != '*' && c != '/') {cout << "Invalid operator!" << endl;return 0;}if (b == 0) {cout << "Divided by zero!" << endl;return 0;}switch (int(c)) {case 43: // '+'cout << a + b << endl;break;case 45: // '-'cout << a - b << endl;break;case 42: // '*'cout << a * b << endl;break;case 47: // '/'cout << a / b << endl;break;}return 0;
}

在这里插入图片描述

在这里插入图片描述


分析


优点

  1. 逻辑分明:输入处理、非法检查、运算逻辑和输出均有明确分工。
  2. 高效运算switch 语句结合 ASCII 编码实现高效的分支判断。
  3. 错误提示明确:分别针对非法操作符和除零错误提供清晰反馈。

不足

  1. 冗余检查:即使操作符不是 /,仍然检查 b == 0
  2. 依赖 ASCII 编码:可读性降低,需理解字符的 ASCII 值。
  3. 缺少输入验证:未处理非整数或多余输入的场景,鲁棒性不足。

💯实现 2:老师的第一种实现


代码

#include <iostream>
using namespace std;int main() {int n1, n2;char c;cin >> n1 >> n2 >> c;if (n2 == 0)cout << "Divided by zero!" << endl;else {switch (c) {case '+':cout << n1 + n2 << endl;break;case '-':cout << n1 - n2 << endl;break;case '*':cout << n1 * n2 << endl;break;case '/':cout << n1 / n2 << endl;break;default:cout << "Invalid operator!" << endl;break;}}return 0;
}

在这里插入图片描述
在这里插入图片描述


分析


优点

  1. 逻辑简洁:通过 switch 集中处理运算逻辑与错误提示。
  2. 功能清晰:错误检查与运算分离,便于维护。

不足

  1. 除零检查不精准:无论操作符为何,均判断 n2 == 0,可能对非 / 操作符误报。
  2. 重复代码:除零检查和 / 运算逻辑未有效整合。

💯实现 3:老师的第二种实现


代码

#include <iostream>
using namespace std;int main() {int a, b;char c;cin >> a >> b >> c;switch (c) {case '+':cout << a + b << endl;break;case '-':cout << a - b << endl;break;case '*':cout << a * b << endl;break;case '/':if (b == 0)cout << "Divided by zero!" << endl;elsecout << a / b << endl;break;default:cout << "Invalid operator!" << endl;break;}return 0;
}

在这里插入图片描述
在这里插入图片描述


分析


优点

  1. 除零检查更精准:仅在 / 操作符条件下检查 b == 0,避免多余判断。
  2. 逻辑紧凑:将运算和错误处理集中于 switch 中,结构清晰。

不足

  1. 输入验证不足:假设输入严格符合格式要求,缺乏鲁棒性。
  2. 代码复用性较低/ 操作符分支的错误与运算逻辑仍存在冗余。

💯对比分析

特性我的实现老师的第一种实现老师的第二种实现
输入处理简洁,但缺少验证简洁,但缺少验证简洁,但缺少验证
除零检查全局检查,可能冗余全局检查,缺乏针对性嵌套检查,更高效
运算逻辑基于 ASCII 编码实现基于字符直接判断基于字符直接判断
错误处理独立实现嵌入 switch嵌入 switch
代码冗余存在冗余逻辑存在一定冗余相对更简洁
扩展性可扩展至更多操作符可扩展至更多操作符可扩展至更多操作符

💯综合建议与扩展


最优实现思路

  1. 输入验证:在运算前增加对输入合法性的检查,确保操作符和操作数均符合预期。
  2. 逻辑优化:将除零检查限定在 / 条件下,并合并错误处理逻辑,减少冗余。
  3. 模块化设计:通过函数封装各功能,例如错误提示和具体运算逻辑,提升代码复用性。
  4. 扩展能力增强:采用数据驱动设计(如映射表或函数指针)管理操作符逻辑,便于扩展更多功能。

潜在扩展方向

  1. 支持浮点运算:引入 double 类型支持浮点数,同时优化结果的输出精度。
  2. 扩展操作符:增加模运算 %、幂运算 ^ 等操作符的支持。
  3. 异常处理机制:通过 try-catch 捕获非法输入或其他运行时异常,提升程序鲁棒性。
  4. 用户交互增强:设计更加友好的输入提示和错误反馈机制,例如动态检测输入是否合法。

💯小结

  • 在这里插入图片描述
    在综合对比三种实现后可以发现,优化后的代码不仅在性能上显著提升,更重要的是在复杂性扩展性上具备更高的适应性。作为基础算法题目,计算器问题涵盖了输入校验分支逻辑优化错误处理等关键编程技能,能够为后续复杂问题的解决提供有力支持。无论是新手程序员还是有经验的开发者,这类题目的深入分析和改进都具有重要的实践与理论价值

在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述


http://www.mrgr.cn/news/80103.html

相关文章:

  • gz中生成模型
  • vue canvas 绘制选定区域 矩形框
  • TPM 2.0:安全固件的新标准
  • http 和 https 的区别?
  • 图像分割数据集海洋水体船只分割数据集labelme格式6123张3类别
  • C#—BitArray点阵列
  • 【Qt】信号、槽
  • ESP32-S3模组上跑通ES8388(30)
  • C++3--内联函数、auto
  • virtualbox 搭建ubuntu
  • ---mysql server: Ubuntu Linux下最最基本的操作
  • 关于睡懒觉
  • Elasticsearch 集群部署
  • Stable Diffusion Controlnet常用控制类型解析与实战课程 4
  • RabbitMQ中的Work Queues模式
  • 使用Nexus3搭建npm私有仓库
  • 八大排序算法C语言版
  • 112.【C语言】数据结构之排序(详解插入排序)
  • 在 Ubuntu 24.04.1 LTS (WSL) 中使用 openssl 生成 keybox.xml
  • 进程保活机制
  • 深度学习中的多通道卷积与偏置过程详解
  • 零知识证明:区块链隐私保护的变革力量
  • 基于wifipumpkin3的AP伪造
  • Visual Studio 2022+CMake配置PCL1.14.1
  • vite打包失败 - out of memory
  • Vue.js 中,前端如何处理从后端返回的 Excel 文件流