【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.rhkb.cn/news/489089.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spire.PDF for .NET【页面设置】演示:向 PDF 文档添加页码

在 PDF 文档中添加页码不仅实用&#xff0c;而且美观&#xff0c;因为它提供了类似于专业出版材料的精美外观。无论您处理的是小说、报告还是任何其他类型的长文档的数字副本&#xff0c;添加页码都可以显著提高其可读性和实用性。在本文中&#xff0c;您将学习如何使用Spire.P…

开疆智能Ethernet/IP转Profinet网关连接纳博特控制器配置案例

该案例是西门子PLC通过开疆智能研发的Ethernet/IP转Profinet网关KJ-PNG-108连接纳博特控制器的配置案例首先下载控制器的EDS文件&#xff0c;解析出其中的ethernet参数. 将EDS文件导入解析软件&#xff0c;透过软件可以看到数据长度默认为32字节&#xff0c;连接点为150/100 打…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的移动台账管理系统

开题报告 个人财务管理系统的意义在于提高个人财务管理的效率&#xff0c;实现财务稳定&#xff0c;增强经济安全感。收支管理是每个个人和个人组织不可缺少的工作&#xff0c;也是个人财务管理中不可或缺的研究对象。通过信息化地收集和处理收支信息&#xff0c;减少手工记录…

车牌识别OCR授权:助力国产化升级,全面提升道路监控效率

政策背景&#xff1a;国产化升级&#xff0c;推动道路监控产业转型 随着国家对信息安全的重视&#xff0c;国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求&#xff0c;公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅…

【算法】【优选算法】哈希表

目录 一、简介二、两数之和三、⾯试题 01.02.判定是否互为字符重排四、217.存在重复元素五、219.存在重复元素 II六、49.字⺟异位词分组 一、简介 哈希表就是一个使用键值对key-value来存储数据的容器。 用于快速查找某个元素O(1)时间复杂度。 应用场景&#xff1a; 频繁查找…

Please activate LaTeX Workshop sidebar item to render the thumbnail of a PDF

Latex代码中使用pdf图片&#xff0c;无法预览&#xff0c;提示&#xff1a; Please activate LaTeX Workshop sidebar item to render the thumbnail of a PDF 解决办法&#xff1a; 点击左边这个刷新下即可

uniapp结合movable-area与movable-view实现拖拽功能

前言 因为公司业务开发需要拖拽功能。 ps&#xff1a;该功能只能针对高度一致的&#xff0c;如果高度不一致需要另外二开 演示 开始 <template><view style"height: 100%;"><movable-area :style"{width: 100%, height: allHeight px}"…

访问者模式的理解和实践

在软件开发过程中&#xff0c;设计模式为我们提供了解决常见问题的最佳实践。访问者模式&#xff08;Visitor Pattern&#xff09;是行为设计模式之一&#xff0c;它将数据操作与数据结构分离&#xff0c;使得在不修改数据结构的前提下&#xff0c;能够定义作用于这些元素的新的…

MATLAB直流电机模型,直流电机控制

直流电机控制简介 直流电机&#xff08;DC motor&#xff09;广泛应用于各种机械驱动和电力控制系统中&#xff0c;其运行性能的控制至关重要。为了精准地控制直流电机的输出特性&#xff0c;可以通过不同的控制方式进行调节。常见的控制方式包括电枢电流控制、速度控制、电机位…

【工业机器视觉】基于深度学习的水表盘读数识别(2-数据采集与增强)

【工业机器视觉】基于深度学习的仪表盘识读&#xff08;1&#xff09;-CSDN博客 数据采集与增强 为了训练出适应多种表型和环境条件的模型&#xff0c;确保数据集的质量与多样性对于模型的成功至关重要。高质量的数据不仅需要准确无误、具有代表性&#xff0c;还需要涵盖尽可能…

vscode通过ssh连接远程服务器(实习心得)

一、连接ssh服务器 1.打开Visual Studio Code&#xff0c;进入拓展市场(CtrlShiftX)&#xff0c;下载拓展Remote - SSH 2. 点击远程资源管理器选项卡&#xff0c;并选择远程(隧道/SSH)类别 3. 点击ssh配置&#xff1a;输入你的账号主机ip地址 4.在弹出的选择配置文件中&#xf…

Maven(生命周期、POM、模块化、聚合、依赖管理)详解

Maven构建项目的生命周期 在Maven出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;软件开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试&#xff0c;部署等工作&#xff0c;这个过程就是项目构建的生命周期。虽然大家都在不停的做构建工作&…

webstorm开发uniapp(从安装到项目运行)

1、下载uniapp插件 下载连接&#xff1a;Uniapp Tool - IntelliJ IDEs Plugin | Marketplace &#xff08;结合自己的webstorm版本下载&#xff0c;不然解析不了&#xff09; 将下载到的zip文件防在webstorm安装路径下&#xff0c;本文的地址为&#xff1a; 2、安装uniapp插…

unique_ptr自定义删除器,_Compressed_pair利用偏特化减少存储的一些设计思路

主要是利用偏特化&#xff0c; 如果自定义删除器是空类&#xff08;没有成员变量&#xff0c;可以有成员函数&#xff09;&#xff1a; _Compressed_pair会继承删除器&#xff08;删除器作为基类&#xff09;&#xff0c;但_Compressed_pair里不保存删除器对象&#xff0c;只…

【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现环形队列的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 初始化队列、销毁队列、判断队列是否为空、进队列…

路由器、二层交换机与三层交换机的区别与应用

路由器、二层交换机和三层交换机是常见的网络设备&#xff0c;常常协同工作。它们都可以转发数据&#xff0c;但在功能、工作层级以及应用场景上存在差异。 1. 工作层级 三者在OSI模型中的工作层级不同&#xff1a; 路由器&#xff1a; 工作在 网络层&#xff08;第三层&#…

SQL计算字段:拼接字段

为了说明如何使用计算字段&#xff0c;本文将通过一个简单的示例来展示如何将两列组合成一个标题。假设Vendors表包含供应商的名称和国家信息&#xff0c;我们希望生成一个报表&#xff0c;其中列出每个供应商的名称和所在国家&#xff0c;并且需要格式化名称显示&#xff0c;国…

高级数据结构-树状数组

介绍 树状数组的推导 两个基础操作 模板-acwing795. 前缀和 #include<bits/stdc.h> using namespace std;const int N 1e610; int c[N]; int lowbit(int x){return x & -x; }int query(int x){int ans 0;for(; x; x - lowbit(x)) ans c[x];return ans; }void add…

香港科技大学广州|智能交通学域博士招生宣讲会—湖南大学专场

香港科技大学广州&#xff5c;智能交通学域博士招生宣讲会—湖南大学专场 &#x1f559;时间&#xff1a;2024年12月17日&#xff08;星期二&#xff09;15:00 &#x1f3e0;地点&#xff1a;湖南大学二办公楼三楼学生就业指导中心329 &#x1f517;报名链接&#xff1a;http…

node利用路由搭建web实例

npm init npm i express body-parser cookie-parser 封装web实例 搭建路由 导出web 应用实例注册