【C++】 Flow of Control

《C++程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记
文章目录
- 1、选择结构
- 1.1、if 语句
- 1.2、嵌套的 if 语句
- 1.3、条件运算符 ?:
- 1.4、switch 语句
- 2、循环结构
- 2.1、while 语句
- 2.2、do-while 语句
- 2.3、 for 循环
- 2.4、循环嵌套
- 3、跳转结构
- 3.1、break 语句
- 3.2、continue 语句
- 3.3、goto 语句
- 3.4、return 语句
- 4、应用实例
1、选择结构
if、switch、?:
1.1、if 语句
if 语句是最基本的选择结构,它用于在条件为真时执行特定的代码块。
#include <iostream>
using namespace std;int main()
{int n = 10;if (n > 0){cout << "Number is positive." << endl;}return 0;
}
output
Number is positive.
if-else 语句用于在条件为真时执行一个代码块,否则执行另一个代码块。

#include <iostream>
using namespace std;int main()
{int num = -5;if (num > 0) {cout << "Number is positive." << endl;} else {cout << "Number is not positive." << endl;}return 0;
}
output
Number is not positive.
1.2、嵌套的 if 语句
当需要判断的条件不止一个,可以使用嵌套 if 语句来实现。
所谓嵌套 if 语句,指的是其中一个 if 语句作为另一个 if 语句或者 else 语句的内嵌语句。
C++ 规定,else 语句总是与在同一块离它最近且无 else 语句配对的 if 语句相结合。
#include <iostream>
using namespace std;int main()
{int num = 59;if (num > 0) cout << "Number is positive." << endl;if (num >= 60)cout<< "passed." << endl;else cout << "not passed." << endl;return 0;
}
output
Number is positive.
not passed.
编译器不关心程序的缩进形式
当你对嵌套 if 语句混淆不清时,可以通过添加 {} 来解决
eg
#include <iostream>
using namespace std;int main()
{int score;cin >> score;if (score < 0)cout << "error score!" << endl;else if (score < 60)cout << "Get D!" << endl;else if (score < 70)cout << "Get C!" << endl;else if (score < 80)cout << "Get B!" << endl;elsecout << "Get A!" << endl;return 0;
}
output
75
Get B!
1.3、条件运算符 ?:
表达式1?表达式2:表达式3
条件运算符是 C++ 中唯一的 3 目运算符
如果表达式 1 为 true,执行表达式 2,否则执行表达式 3
#include <iostream>
using namespace std;int main()
{float a = 60.1;bool result = a<60?false:true;cout << result << endl;return 0;
}
output
1
1.4、switch 语句
switch 语句可以一次将测试值与多个值进行判定,而不是只测试一个判定条件
switch(表达式)
{case 整型常量表达式1:语句组1case 整型常量表达式2:语句组2...case 整型常量表达式n:语句组ndefault:语句组 n+1
}
每个 case 语句后必须是与表达式类型兼容的一个常量(必须为常量,不能为变量,且要求为整型或者能够转化为整型),eg 整型、字符型或枚举型表达式
default 语句并非必须
需要注意的是,每个case块的末尾通常有一个break语句,以防止程序继续执行下一个case块的代码(这称为“贯穿”)。
eg:贯穿
#include <iostream>
using namespace std;int main() {char grade;cout<<"请输入成绩:";cin>>grade;switch(grade){case 'A':cout<<"80~100\n";case 'B':cout<<"60~80\n";case 'C':cout<<"0~60\n";default:cout<<"error\n";}return 0;
}
output
请输入成绩:A
80~100
60~80
0~60
error
引入 break 以后
#include <iostream>
using namespace std;int main() {char grade;cout<<"请输入成绩:";cin>>grade;switch(grade){case 'A':cout<<"80~100\n";break;case 'B':cout<<"60~80\n";break;case 'C':cout<<"0~60\n";break;default:cout<<"error\n";break;}return 0;
}
output
请输入成绩:A
80~100
output
请输入成绩:a
error
再来个例子
#include <iostream>
using namespace std;int main() {int day;cout << "请输入星期几 (1-7): ";cin >> day;switch (day){case 1:cout << "星期一" << endl;break;case 2:cout << "星期二" << endl;break;case 3:cout << "星期三" << endl;break;case 4:cout << "星期四" << endl;break;case 5:cout << "星期五" << endl;break;case 6:cout << "星期六" << endl;break;case 7:cout << "星期日" << endl;break;default:cout << "输入无效" << endl;}return 0;
}
output
请输入星期几 (1-7): 7
星期日
2、循环结构
2.1、while 语句
while 循环在循环条件为真时一直执行。
while (循环条件) {// 循环体
}

eg:计算 1 到 100 的和
#include <iostream>
using namespace std;int main()
{int i = 0, sum = 0;while (i<101){sum += i;i++;}cout << sum << endl;return 0;
}
output
5050
2.2、do-while 语句
do-while 循环与 while 循环类似,但不同之处在于它至少执行一次循环体,即使在第一次迭代时循环条件为假。
do {// 循环体
} while (循环条件);

计算 1到100 的和
#include <iostream>
using namespace std;int main()
{int i = 0, sum = 0;do{sum += i;i++;}while(i<101);cout << sum << endl;return 0;
}
output
5050
2.3、 for 循环
for 循环通常用于已知执行次数的循环
for (初始化表达式; 循环条件; 步进表达式) {// 循环体
}
eg,计算 1-100 的和
#include<iostream>
using namespace std;int main(){int sum = 0;for (int i = 0; i <= 100; i++){sum += i;}cout << sum << endl;return 0;
}
output
5050
注意,初始化表达式、循环条件、步进表达式都可以省略,循环体不能省略
#include<iostream>
using namespace std;int main(){int sum = 0, i = 0;for (;;){if (i <= 100)sum += i++;elsebreak;}cout << sum << endl;return 0;
}
output
5050
允许两个或者两个以上的变量控制循环
#include<iostream>
using namespace std;int main(){int i1 = 1, i2 = 10;for (i1, i2; i1<i2; i1++, i2--)cout << i1 << " " << i2 << endl;return 0;
}
output
1 10
2 9
3 8
4 7
5 6
2.4、循环嵌套
循环结构可以嵌套使用,即一个循环内部包含另一个循环。
#include<iostream>
using namespace std;int main()
{for (int i = 1; i <= 10; i++){for (int j = i; j <= 10; j++)cout << "*";cout << endl;}return 0;
}
output
**********
*********
********
*******
******
*****
****
***
**
*
再来个例子
#include<iostream>
using namespace std;int main()
{for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {cout << "i = " << i << ", j = " << j << endl;}}return 0;
}
output
i = 0, j = 0
i = 0, j = 1
i = 0, j = 2
i = 1, j = 0
i = 1, j = 1
i = 1, j = 2
i = 2, j = 0
i = 2, j = 1
i = 2, j = 2
while、do-while、for 循环均可以相互嵌套
3、跳转结构
break、continue、goto、return 4 种
3.1、break 语句
用于立即退出循环或switch语句。
一个 break 只能跳出所在的最内层循环
#include<iostream>
using namespace std;int main()
{int num;for (int i = 0; i < 2; i++){num = 1;while (1){cout << num << endl;num++;if (num > 4)break;}}return 0;
}
output
1
2
3
4
1
2
3
4
3.2、continue 语句
用于跳过循环中剩余的代码,并立即开始下一次迭代。
不能用在 switch 中
#include<iostream>
using namespace std;int main()
{int sum = 0;for (int i = 0; i <= 100; i++){if (i % 10 != 0)continue;sum += i;}cout << sum << endl;return 0;
}
output
550
3.3、goto 语句
用于无条件跳转到同一函数内的标签位置。
适用于从多层循环中直接跳出,如果用 break 的话,需要多个
#include<iostream>
using namespace std;int main()
{int num = 10;if (num > 0) {goto positive; // 跳转到标签 positive}cout << "Number is negative or zero.\n";goto end; // 跳转到标签 endpositive:cout << "Number is positive.\n";
end:return 0;
}
output
Number is positive.
3.4、return 语句
用于从函数返回一个值(如果函数有返回值类型)或无条件退出函数。
4、应用实例
eg 3-10 判断正整数是否为素数
#include <iostream>
#include<math.h>
using namespace std;int main()
{int x,i,b;int num = 5;while(num){cin >> x;b = sqrt(x);num--;if (x <= 1){cout << "False\n";continue;}for (i=2; i<=b; i++){if (x % i == 0)break;} if (i>=b+1)cout << "True\n";elsecout << "False\n";}return 0;
}
output
0
False
1
False
2
True
3
True
9
False
设置了可以输入 5 次,for 循环的判断边界为 sqrt(x)可以提高计算效率,最后判断是否为素数的条件 i>=b+1 也很巧妙,注意算法的边界测试,if (x <= 1) 就是来弥补边界漏洞的
eg 3-11 使用循环语句求解 300 -400 范围内的所有素数
#include <iostream>
#include<math.h>
using namespace std;int main()
{int i,b;for (int x=301; x<401; x+=2){b = sqrt(x);for (i=2; i<=b; i++){if (x % i == 0)break;} if (i>=b+1)cout << x << " ";}return 0;
}
output
307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397
可以看到 for 循环中的自增项采用的是 x+=2,进一步优化了计算速度,因为偶数肯定可以除以2余0,不是素数,我们遍历所有奇数即可
eg 3-12 用公式 π 4 = 1 − 1 3 + 1 5 − 1 7 + . . . \frac{\pi}{4} = 1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+... 4π=1−31+51−71+... 求圆周率 π 的近似值,直到最后一项的绝对值小于 1 0 − 8 10^{-8} 10−8 为止
注意审题,最后一项的绝对值,而不是整个式子的绝对值
#include <iostream>
#include<math.h>
#include<iomanip>
using namespace std;int main()
{double i = 3.0;double x=1.0, result=1.0;int sign = 1;while(fabs(x)>=1e-8){sign *= -1;x = sign / i;i+=2;result += x;cout << x <<endl;}//cout << result * 4;cout << setiosflags(ios::fixed) << setprecision(8) << result * 4; // 输出小数点后八位return 0;
}
output
3.14159267
程序会运行很久
abs 函数通常用于整数类型(如 int、long 等)。
fabs 函数专门用于浮点数类型(如 float、double 等)。
这里正负符号的转变很巧妙 sign *= -1;
相关文章:
【C++】 Flow of Control
《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、选择结构1.1、if 语句1.2、嵌套的 if 语句1.3、条件运算符 ?:1.4、switch 语句 2、循环结构2.1、while 语句2.2、do-while 语句2.3、 for 循环2.4、循环嵌套…...
【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示
异常问题: 这个是在新版的pycharm中出现的,出现的问题,点击view后不全部显示,而是以...折叠显示 在setting中这么设置一下就好了: 解决办法: https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…...
2.19c++练习
1.封装一个mystring类 拥有私有成员: char* p int len 需要让以下代码编译通过,并实现对应功能 mystring str "hello" mystring ptr; ptr.copy(str) ptr.append(str) ptr.show() 输出ptr代表的字符串 ptr.compare(str) 比较ptr和…...
【为什么使用`new DOMParser`可以保持SVG命名空间】
为什么使用new DOMParser可以保持SVG命名空间: 一、命名空间基础概念 1. XML命名空间定义 <svg xmlns"http://www.w3.org/2000/svg"><!-- 此元素及其子元素属于SVG命名空间 --><rect x"10" y"20"/> </svg>…...
【DL】浅谈深度学习中的知识蒸馏 | 输出层知识蒸馏
目录 一 核心概念与背景 二 输出层知识蒸馏 1 教师模型训练 2 软标签生成(Soft Targets) 3 学生模型训练 三 扩展 1 有效性分析 2 关键影响因素 3 变体 一 核心概念与背景 知识蒸馏(Knowledge Distillation, KD)是一种模…...
应急响应(linux 篇,以centos 7为例)
一、基础命令 1.查看已经登录的用户w 2.查看所有用户最近一次登录:lastlog 3.查看历史上登录的用户还有登录失败的用户 历史上所有登录成功的记录 last /var/log/wtmp 历史上所有登录失败的记录 Lastb /var/log/btmp 4.SSH登录日志 查看所有日志:…...
EasyRTC:智能硬件适配,实现多端音视频互动新突破
一、智能硬件全面支持,轻松跨越平台障碍 EasyRTC 采用前沿的智能硬件适配技术,无缝对接 Windows、macOS、Linux、Android、iOS 等主流操作系统,并全面拥抱 WebRTC 标准。这一特性确保了“一次开发,多端运行”的便捷性,…...
堆和栈的区别
堆和栈 不同点: 内存分配方式不同: 栈:栈上的内存是自动分配和释放的,通常用于存储函数调用过程中的局部变量、调用参数和使用的寄存器状态等信息。堆:堆上的内存是动态分配的,程序在运行时可以根据需要分…...
【信息系统项目管理师】专业英语重点词汇大汇总
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、信息和信息系统重要词汇汇总1.Computer(计算机)重要词汇2.Information system(信息系统)重要词汇3.Software Engineering(软件工程)重要词汇4.Network(网络)相关重要词汇5.信息安全重要词汇6.Electronic Co…...
CV -- YOLOv8 图像分割(GPU环境)
目录 参考视频: 标注 JSON转为TXT 训练 验证 参考视频: 使用 Yolov8 自定义数据集进行图像分割_哔哩哔哩_bilibili 标注 数据集: 我使用的是一些苹果数据集,可以在我的csdn资源中下载: https://download.csdn.net/do…...
Cherry-Studio下载安装教程,AI面向开发者的工具或平台(付安装包)
文章目录 一、Cherry Studio是什么?二、功能特点 一、Cherry Studio是什么? Cherry Studio 是一款开源跨平台的多模型服务桌面客户端,集成超 300 个大语言模型,内置 300 多个预配置 AI 助手,支持多格式文件处理、全局…...
【Javascript Day19】BOM
目录 BOM对象的方法 定时器方法 短信验证码案例 计时器元素动画 同步代码和异步代码 location对象 跳转查询页面参数 跳转多查询参数 BOM对象的方法 // window.alert("提示");// window 中提供的方法和属性,可以在省略window对象的情况下直接调用…...
git 操作 已经 commit 但是没有 push 怎么办
前言: 在操作commit后发现提交错了分支,直接切换分支是不行的,只能先取消commit的代码才能切换分支,因此记录一下git的操作 如果你已经执行了 git commit 但还没有进行 git push,可以通过以下几种方式撤回或修改提交…...
在 macOS 的 ARM 架构上按住 Command (⌘) + Shift + .(点)。这将暂时显示隐藏文件和文件夹。
在 macOS 的 ARM 架构(如 M1/M2 系列的 Mac)上,设置 Finder(访达)来显示隐藏文件夹的步骤如下: 使用快捷键临时显示隐藏文件: 在Finder中按住 Command (⌘) Shift .(点ÿ…...
【核心算法篇二十】《DeepSeek符号回归:让AI化身「数学神探」破解数据背后的宇宙公式》
“宇宙最不可理解之处,就是它居然可以被理解。”——爱因斯坦 如果让AI来续写这句话,或许会是:"数据最迷人的地方,在于它总能用数学公式讲出故事。"今天我们要聊的DeepSeek符号回归技术,就是教AI从杂乱数据中自动发现精妙数学规律的「黑魔法」。全程高能预警,建…...
如何在 Visual Studio Code 中使用 DeepSeek R1 和 Cline?
让我们面对现实吧:像 GitHub Copilot 这样的 AI 编码助手非常棒,但它们的订阅费用可能会在你的钱包里烧一个洞。进入 DeepSeek R1 — 一个免费的开源语言模型,在推理和编码任务方面可与 GPT-4 和 Claude 3.5 相媲美。将它与 Cline 配对&#…...
PHP旅游门票预订系统小程序源码
🌍 旅游门票预订系统:一站式畅游新体验,开启您的梦幻旅程 🌟 一款基于ThinkPHPUniapp精心雕琢的旅游门票预订系统,正翘首以待,为您揭开便捷、高效、全面的旅游预订新篇章!它超越了传统预订平台…...
在项目中调用本地Deepseek(接入本地Deepseek)
前言 之前发表的文章已经讲了如何本地部署Deepseek模型,并且如何给Deepseek模型投喂数据、搭建本地知识库,但大部分人不知道怎么应用,让自己的项目接入AI模型。 文末有彩蛋哦!!! 要接入本地部署的deepsee…...
notepad++右键菜单不见了
卸载时没点击完成,又重新安装了一个,最终导致了一些bug,导致右键没有notepad菜单。 解决方式: 新建一个register.reg文件,加入以下代码,然后双击执行即可 代码说明:Open with Notepad 是右…...
如何用ollama快速布署deepseek-r1大模型
deepseek在春节期间因为特朗普的一番发言而在中国已几乎人尽皆知,热度到了连90高寿的老父亲都向我推荐这个中国产的AI大模型,而且它是开源的!我试验了下,用ollama也可以快速度安装布署deepseek-r1大模型。本想写篇文章来介绍下dee…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
