【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;
            else
                cout << 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. 用户交互增强:设计更加友好的输入提示和错误反馈机制,例如动态检测输入是否合法。

💯小结

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

在这里插入图片描述


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935957.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产自主可控新征程:华为原生鸿蒙系统与鲲鹏认证

华为于今年10月22日在深圳正式发布了其原生鸿蒙系统HarmonyOS NEXT。这是我国首个实现全栈自研的操作系统&#xff0c;标志着中国在操作系统领域取得了突破性进展。HarmonyOS NEXT 5.0的发布&#xff0c;使得鸿蒙操作系统成为继苹果iOS和安卓系统之后的全球第三大移动操作系统&…

【KodExplorer】可道云KodExplorer-个人网盘安装使用

说明&#xff1a;安装kodExplorer &#xff08;不是Kodbox&#xff09;&#xff1b;Kodbox需求服务器至少2核4G内存&#xff0c;要求环境具备php/redis/mysql/。安装kodExplorer 就是比较方便简单部署&#xff0c;个人版免费。 一、安装环境需求 服务器: Windows&#xff0c;…

正则表达式——参考视频B站《奇乐编程学院》

智能指针 一、背景&#x1f388;1.1. 模式匹配&#x1f388;1.2. 文本替换&#x1f388;1.3. 数据验证&#x1f388;1.4. 信息提取&#x1f388;1.5. 拆分字符串&#x1f388;1.6. 高级搜索功能 二、原料2.1 参考视频2.2 验证网址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…

恢复删除的文件:6个免费Windows电脑数据恢复软件

数据恢复软件可帮助您从众多存储设备中恢复损坏或删除的数据。您可以使用这些文件恢复软件来检索文件、文档、视频、图片等。这些应用程序支持多种标准文件格式&#xff0c;如 PNG、RTF、PDF、HTML、JPG、MP3 等。 经过超过 75 小时的研究&#xff0c;我分析了 25 最佳免费数据…

(持续更新)linux网络编程中需要注意的内核参数与网络机制

目录 零、基本说明 一、内核参数 二、相关机制 1、GRO &#xff08;1&#xff09;适用场景 &#xff08;2&#xff09;优缺点 &#xff08;3&#xff09;相关操作 2、Nagle 算法 &#xff08;1&#xff09;基本规则 &#xff08;2&#xff09;优缺点 &#xff08;3&…

多模块应用、发布使用第三方库(持续更新中)

目录: 1、多模块概述&#xff08;HAP、HSP、HAR&#xff09; HAR与HSP两种共享包的主要区别体现在&#xff1a; 2、三类模块&#xff1a; 3、创建项目&#xff1a;项目名&#xff1a;meituan &#xff08;1&#xff09;创建Ability类型的Module&#xff0c;编译后为HAP文件…

爬虫基础之HTTP基本原理

URL和URI 我们先了解一下 URI和 URL。URI的全称为 Uniform Resource ldentifer,即统一资源标志符;URL的全称为 Universal Resource Locator&#xff0c;即统一资源定位符。它们是什么意思呢?举例来说&#xff0c;https:/github.com/favicon.ico 既是一个 URI&#xff0c;也是…

Elasticsearch 集群部署

Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;广泛应用于日志分析、全文搜索、实时数据分析等场景。它以其高性能、高可用性和易用性而著称。本文档将引导您完成一个基本的 Elasticsearch 集群配置&#xff0c;包括节点间的通信、客户端访问、安全设置等关键步骤。我…

【一本通】PowerStrings

【一本通】PowerStrings C 代码C语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 求每个字符串的最短循环子串&#xff0c;输出循环次数。 输入 输入数据为多组数据&#xff0c;读取到"."字符时结束。每组数据仅有一行&…

Unity 沿圆周创建Sphere

思路 取圆上任意一点连接圆心即为半径&#xff0c;以此半径为斜边作直角三角形。当已知圆心位置与半径长度时&#xff0c;即可得该点与圆心在直角三角形两直角边方向上的位置偏移&#xff0c;从而得出该点的位置。 实现 核心代码 offsetX radius * Mathf.Cos(angle * Mathf…

华为无线AC、AP模式与上线解析(Huawei Wireless AC, AP Mode and Online Analysis)

华为无线AC、AP模式与上线解析 为了实现fit 瘦AP的集中式管理&#xff0c;我们需要统一把局域网内的所有AP上线到AC&#xff0c;由AC做集中式管理部署。这里我们需要理解CAPWAP协议&#xff0c;该协议分为两种报文&#xff1a;1、管理报文 2、数据报文。管理报文实际在抓包过程…

软考高级架构 - 10.5 软件架构演化评估方法

10.4 软件架构演化原则总结 本节提出了18条架构演化的核心原则&#xff0c;并为每条原则设计了简单而有效的度量方法&#xff0c;用于从系统整体层面提供实用信息&#xff0c;帮助评估和指导架构演化。 演化成本控制&#xff1a;成本小于重新开发成本&#xff0c;经济高效。进…

鸿蒙NEXT开发案例:颜文字搜索器

【引言】 本文将介绍一个名为“颜文字搜索器”的开发案例&#xff0c;该应用是基于鸿蒙NEXT平台构建的&#xff0c;旨在帮助用户快速查找和使用各种风格的表情符号。通过本案例的学习&#xff0c;读者可以了解如何在鸿蒙平台上进行数据处理、UI设计以及交互逻辑的实现。 【环…

【报错记录】Ubuntu22.04解决开机卡在 /dev/sda5 : clean , *files , *blocks

一个愿意伫立在巨人肩膀上的农民...... 一、错误现象 本人的电脑安装Windows10和Ubuntu22.04双系统&#xff0c;一次训练中电脑死机无法开机&#xff0c;重启之后便出现如下错误&#xff0c;在网上寻找过很多方法均无效&#xff0c;在root下禁用了samba服务&#xff0c;也无济…

关于睡懒觉

我们经常听到一个词&#xff1a;睡懒觉。 我认为&#xff0c;睡懒觉这个词&#xff0c;是错误的。 人&#xff0c;是需要睡眠的&#xff0c;睡不够&#xff0c;就不会醒。睡够了&#xff0c;自然会醒&#xff0c;也不想继续睡。不信你试试&#xff0c;睡够了&#xff0c;你…

数据地图怎么做?推荐这款数据可视化地图生成器

在数字化与信息化高速发展的今天&#xff0c;企业迎来了前所未有的发展机遇&#xff0c;规模迅速扩张&#xff0c;市场版图不断延伸。然而&#xff0c;伴随着这种快速的发展&#xff0c;一个不容忽视的问题逐渐浮出水面——如何精准高效地掌握分布在各地的分公司、业务点乃至整…

访问者模式的理解和实践

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

【Java 学习】面向程序的三大特性:封装、继承、多态

引言 1. 封装1.1 什么是封装呢&#xff1f;1.2 访问限定符1.3 使用封装 2. 继承2.1 为什么要有继承&#xff1f;2.2 继承的概念2.3 继承的语法2.4 访问父类成员2.4.1 子类中访问父类成员的变量2.4.2 访问父类的成员方法 2.5 super关键字2.6 子类的构造方法 3. 多态3.1 多态的概…

Burp与小程序梦中情缘

前言 在日常渗透工作中&#xff0c;有时需要对微信小程序进行抓包渗透&#xff0c;通过抓包&#xff0c;我们可以捕获小程序与服务器之间的通信数据&#xff0c;分析这些数据可以帮助我们发现潜在的安全漏洞&#xff0c;本文通过讲述三个方法在PC端来对小程序抓包渗透 文章目…

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 多图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 多图推理 flyfish 输入 输出 [‘第一张图片是一幅中国山水画&#xff0c;描绘了一座山峰和周围的树木。第二张图片是一张现代照片&#xff0c;展示了一座山峰和周围的自然景观&#xff0c;包括水体和植被。’] fro…