从零开始的C++第三天:让计算器能持续战斗
第二天我们写出了一个能做四则运算的计算器但它有个致命的弱点算完一次就退出了。如果我想连续算十道题就得重新打开十次程序。今天我们就来解决这个问题让计算器学会“循环工作”。 回顾与热身第二天结束时我们的计算器代码大概长这样cpp复制下载#include iostream #include Calculator.h using namespace std; int main() { double x 0.0, y 0.0; char oper ; cout Calculator Console Application endl endl; cout Please enter the operation to perform. Format: ab | a-b | a*b | a/b endl; cin x oper y; Calculator c; double result c.Calculate(x, oper, y); cout x oper y result endl; return 0; }这段代码的问题在于程序从上到下执行一遍就结束了。用户输入一次程序算一次然后退出。今天我们要学会用循环来打破这个限制。 第一部分认识C的三种循环在C中有三种方式可以让一段代码重复执行-6。根据使用场景选择最合适的那一种。1.for循环——“我知道要跑几圈”当你在循环开始前就知道要执行多少次时for循环是最直观的选择-6。cpp复制下载// 打印1到5 for (int i 1; i 5; i) { cout i ; } // 输出1 2 3 4 5它的结构分成三部分-6int i 1初始化在循环开始前执行一次i 5条件判断每次循环前检查为true就继续为false就退出i迭代更新每次循环体执行完后执行2.while循环——“只要条件满足我就一直跑”当你不确定要循环多少次但知道“什么时候该停下来”时用while-6-10。cpp复制下载int i 1; while (i 5) { cout i ; i; } // 输出1 2 3 4 5关键点如果条件一开始就是false循环体一次都不会执行-10。3.do-while循环——“先跑一圈再说然后再看条件”do-while和while的唯一区别是它至少会执行一次循环体然后再判断条件-6-3。cpp复制下载int i 6; do { cout i ; i; } while (i 5); // 输出6 条件为假但循环体已经执行了一次为什么计算器要用do-while因为用户打开计算器至少应该能算一次然后由用户决定是否继续。这正好符合do-while“先执行一次再根据条件决定是否继续”的特性-3。️ 第二部分改造计算器——让它能连续工作基于上面的分析我们用do-while来改造计算器。第一步让计算器“死了都要算”在main函数外面包一层do-while条件暂时写为true永远为真cpp复制下载#include iostream #include Calculator.h using namespace std; int main() { Calculator c; do { double x 0.0, y 0.0; char oper ; cout \n 计算器 endl; cout 请输入算式格式a b endl; cin x oper y; double result c.Calculate(x, oper, y); cout x oper y result endl; } while (true); // ⚠️ 这是个无限循环 return 0; }现在运行程序你会发现算完一次之后程序不会退出它会继续提示你输入下一道算式但问题来了——永远也退不出去除非按CtrlC强制关闭第二步加入退出机制我们需要给用户一个“退出”的选项。常见做法是用户输入某个特殊字符比如q时退出。但这里有个坑我们目前用cin x oper y一次性读取三个值如果要检测q就需要先读取一个字符串来判断。为了让改动最小化我们换一种交互方式先让用户选择操作1.计算 2.退出选择1后再输入算式cpp复制下载#include iostream #include Calculator.h using namespace std; int main() { Calculator c; int choice 0; do { cout \n 计算器 endl; cout 1. 进行计算 endl; cout 2. 退出程序 endl; cout 请选择输入数字; cin choice; if (choice 1) { double x 0.0, y 0.0; char oper ; cout 请输入算式格式a b; cin x oper y; double result c.Calculate(x, oper, y); cout x oper y result endl; } else if (choice 2) { cout 感谢使用再见 endl; break; // break会跳出当前循环 } else { cout 无效输入请重新选择 endl; } } while (true); // 循环条件为true但可以通过break跳出 return 0; } 新知识点break语句break的作用是立即退出当前循环不管循环条件是什么-6。当用户选择退出时我们执行break程序就会跳出do-while循环然后执行return 0结束程序。 第三部分顺手修复一个Bug——除数为0第二天我们埋了一个隐患如果用户输入5 / 0程序会崩溃因为数学上除以0没有意义。在Calculator.cpp的Calculate函数中加入除数为0的判断cpp复制下载#include Calculator.h double Calculator::Calculate(double x, char oper, double y) { switch(oper) { case : return x y; case -: return x - y; case *: return x * y; case /: if (y 0.0) { cout ❌ 错误除数不能为0 endl; return 0.0; } return x / y; default: cout ❌ 错误不支持的运算符 endl; return 0.0; } }⚠️注意这个版本我们在.cpp文件中直接使用了cout所以需要在Calculator.cpp顶部加上#include iostream和using namespace std;。 第三天知识点地图知识点作用关键代码for循环确定次数的循环for (int i0; i10; i) { ... }while循环条件驱动的循环while (条件) { ... }do-while循环至少执行一次的循环do { ... } while (条件);break语句立即退出循环break;错误处理防止程序崩溃除数为0时返回错误信息 今天的完整代码Calculator.hcpp复制下载#pragma once class Calculator { public: double Calculate(double x, char oper, double y); };Calculator.cppcpp复制下载#include Calculator.h #include iostream using namespace std; double Calculator::Calculate(double x, char oper, double y) { switch(oper) { case : return x y; case -: return x - y; case *: return x * y; case /: if (y 0.0) { cout ❌ 错误除数不能为0 endl; return 0.0; } return x / y; default: cout ❌ 错误不支持的运算符 endl; return 0.0; } }CalculatorTutorial.cpp主程序cpp复制下载#include iostream #include Calculator.h using namespace std; int main() { Calculator c; int choice 0; do { cout \n 计算器 endl; cout 1. 进行计算 endl; cout 2. 退出程序 endl; cout 请选择输入数字; cin choice; if (choice 1) { double x 0.0, y 0.0; char oper ; cout 请输入算式格式a b; cin x oper y; double result c.Calculate(x, oper, y); // 只有result不是错误情况时才输出 if (!(oper / y 0.0) oper ! oper ! - oper ! * oper ! /) { // 正常输出交给Calculate内部处理 } // 更优雅的方式让Calculate返回一个状态码但我们选择简单处理 cout x oper y result endl; } else if (choice 2) { cout 感谢使用再见 endl; break; } else { cout 无效输入请重新选择 endl; } } while (true); return 0; } 明天的预告今天我们用do-while让计算器能持续工作用break让用户能主动退出还顺手修复了除数为0的Bug。但现在的计算器还有一个不方便的地方每次都要重新选择“1.计算”。明天我们将学习函数的概念把“输入算式、计算结果、显示输出”这一整套流程封装到一个函数里让代码更整洁、更容易维护。三天时间从“Hello World”到能持续战斗的计算器你已经掌握了C中最核心的几个概念变量、分支switch、循环do-while和类。继续保持这个节奏

相关新闻

x86汇编CALL与RET指令详解及模块化编程实践

x86汇编CALL与RET指令详解及模块化编程实践

1. 汇编语言中的CALL与RET指令解析在x86汇编语言中,CALL和RET这对黄金搭档构成了模块化程序设计的基石。作为有十年嵌入式开发经验的老兵,我见过太多新手在这两个指令上栽跟头——要么堆栈失衡导致程序崩溃,要么返回地址计算错误跳转到未知区…

2026/7/22 5:03:41 阅读更多 →
小狼刹那:事件驱动架构在分布式任务调度中的实践应用

小狼刹那:事件驱动架构在分布式任务调度中的实践应用

最近在技术社区中,一个名为"小狼刹那在此,还不跪下!"的项目引起了广泛关注。这个看似中二的项目名称背后,实际上是一个功能强大的技术工具或框架。很多开发者第一眼看到这个标题可能会感到困惑——这到底是一个游戏模组…

2026/7/26 2:45:18 阅读更多 →
广东楼宇对讲系统

广东楼宇对讲系统

在现代社会,随着科技的不断进步和人们对生活质量要求的提高,楼宇对讲系统已经成为许多住宅小区不可或缺的一部分。特别是在广东这样的经济发达地区,楼宇对讲系统的应用更是广泛。本文将通过具体的数据和案例,探讨楼宇对讲系统的重…

2026/7/22 5:03:41 阅读更多 →

最新新闻

5分钟掌握Iwara下载神器:如何快速批量收藏心仪动画

5分钟掌握Iwara下载神器:如何快速批量收藏心仪动画

5分钟掌握Iwara下载神器:如何快速批量收藏心仪动画 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool 还在为无法离线观看喜爱的动画作品而烦恼吗?当你遇到…

2026/7/26 8:30:10 阅读更多 →
C++手搓HTTP服务器:从Socket到线程池的完整实现指南

C++手搓HTTP服务器:从Socket到线程池的完整实现指南

1. 项目概述:为什么用C手搓HTTP服务器?在Node.js、Python Flask、Go这些现代框架动动手指就能起一个Web服务的今天,你可能会问,为什么还要用C从头搭建一个HTTP服务器?这不是自讨苦吃吗?作为一个在后台开发领…

2026/7/26 8:30:10 阅读更多 →
深入解析Android AVB镜像:手动验证哈希与FEC纠错实战

深入解析Android AVB镜像:手动验证哈希与FEC纠错实战

1. 项目概述:为什么我们需要亲手验证AVB镜像?在Android设备开发与安全维护的日常工作中,我们经常与各种系统镜像打交道。无论是为设备刷入新的ROM,还是进行OTA升级包的校验,亦或是深度排查一些因系统分区损坏导致的“玄…

2026/7/26 8:30:10 阅读更多 →
02-传递函数

02-传递函数

1.拉普拉斯变换(1)引入-时域计算复杂性(2)拉普拉斯变换变换与反变换拉普拉斯变换定理拉普拉斯形式欧姆定律拉普拉斯形式基尔霍夫电压定律拉普拉斯形式基尔霍夫电流定律2.传递函数与拉氏变换(1)传递函数定义…

2026/7/26 8:30:10 阅读更多 →
5分钟集成stb单文件库到UE插件:解放Unreal Engine插件开发

5分钟集成stb单文件库到UE插件:解放Unreal Engine插件开发

1. 项目概述:为什么我们需要“解放”UE插件开发? 如果你在Unreal Engine(UE)里做过插件开发,大概率经历过这样的场景:想给项目加个图片加载功能,比如支持TGA、PNG之外的格式,或者想引…

2026/7/26 8:30:10 阅读更多 →
甲方验收南京话标注数据,发现声调标注完全不一致

甲方验收南京话标注数据,发现声调标注完全不一致

摘要随着智能语音产品向方言区下沉,南京话标注需求快速增长,但声调标注不一致成为验收环节的常见痛点。南京话拥有复杂的声调系统,且不同年龄层发音存在差异,导致标注质量难以统一。信实翻译作为国内多家头部AI数据服务商的源头供…

2026/7/26 8:29:10 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻