【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、循环嵌套…...
图论 之 迪斯科特拉算法求解最短路径
文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题,分为使用BFS和使用迪斯科特拉算法,这两种算法求解的范围是有区别的 BFS适合求解,边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…...
module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法
module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法 pip install opencv-python4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple 测试: python -c"import cv2"...
Spring Boot 中事务的用法详解
引言 在 Spring Boot 中,事务管理是一个非常重要的功能,尤其是在涉及数据库操作的业务场景中。Spring 提供了强大的事务管理支持,能够帮助我们简化事务的管理和控制。本文将详细介绍 Spring Boot 中事务的用法,包括事务的基本概…...
【react18】如何使用useReducer和useContext来实现一个todoList功能
重点知识点就是使用useReducer来攻坚小型的公共状态管理,useImmerReducer来实现数据的不可变 实现效果 实现代码 项目工程结构 App.js文件 import logo from "./logo.svg"; import "./App.css"; import TodoLists from "./comps/TodoLi…...
Android GreenDAO 适配 AGP 8.0+
在 Android 中使用 GreenDao,由于 GreenDao 现在不维护,所以更新到新版本的 Gradle 经常出问题,在这记录一些升级遇到的问题,并且记录解决方案。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 一、‘:app…...
一篇搞懂vue3中如何使用ref、reactive实现响应式数据
ref 可实现 基本类型、对象类型响应式数据 reactive:只能实现 对象类型响应式 ref实现 基本类型 数据响应式: <template><div class"person"><h2>姓名:{{ name }}</h2><h2>年龄:{{ ag…...
【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!
命令模式:封装请求,轻松实现解耦! 大家好!今天我们来聊聊设计模式中的命令模式(Command Pattern)。如果你曾经需要将请求封装成对象,或者希望实现请求的撤销、重做等功能,那么命令模…...
简单封装一个websocket构造函数
问题描述 最近维护一个老项目,发现项目中有大量重复代码,特别是websocket的调用这一块,同样的代码复制了十几个页面,于是自己封装了一个websocket调用的构造函数。 export default class CreateWebSocket {constructor(url) {//…...
Linux-Ansible自动化运维
文章目录 自动化运维Ansible 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2025年02月21日17点38分 自动化运维 自动化运维常用工具 Ansible 和 SaltStack 自动化运维优势: 服…...
uni-app(位置1)
文章目录 一、获取当前的地理位置、速度 uni.getLocation(OBJECT)二、打开地图选择位置 uni.chooseLocation(OBJECT)三、使用应用内置地图查看位置。uni.openLocation(OBJECT) 一、获取当前的地理位置、速度 uni.getLocation(OBJECT) App平台 manifest中配置好自己的地图厂商k…...
RabbitMQ服务异步通信
消息队列在使用过程中,面临着很多实际问题需要思考: 1. 消息可靠性 消息从发送,到消费者接收,会经理多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: 发送时丢失: 生…...
CSS基础(浮动、相对定位、绝对定位、固定定位、粘性定位、版心、重置默认样式)
文章目录 1. 浮动(float)1.1 简介1.2 元素浮动后的特点1.3 脱离文档流示例图1.4 浮动产生的影响1.4.1 积极影响1.4.2 消极影响 1.5 解决浮动产生的影响1.5.1 清除浮动(Clearfix)1.5.2 创建新的块格式化上下文(BFC&…...
Spring Cloud — Hystrix 服务隔离、请求缓存及合并
Hystrix 的核心是提供服务容错保护,防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式,对资源或失败单元进行隔离,避免一个服务的失效导致整个系统垮掉(雪崩效应)。 1 Hystrix监控 Hystrix 提供了对服务…...
RagFlow+Ollama 构建RAG私有化知识库
RagFlowOllama 构建RAG私有化知识库 关于RAG一、什么是RAGFlow一、RAGFlow 安装配置测服已有服务: mysql、redis、elasticsearch 二、RAGFlow 配置 ollama:本地运行大型语言模型的工具软件。用户可以轻松下载、运行和管理各种开源 LLM。降低使用门槛&…...
【Linux】【网络】不同子网下的客户端和服务器通信
【Linux】【网络】不同子网下的客户端和服务器通信 前两天在进行socket()网络编程并进行测试时,发现在不同wifi下两个电脑无法进行连接,大概去查找了如何解决 看到可以使用 frp 这个快速反向代理实现。 frp 可让您将位于 NAT 或防火墙后面的本地服务器…...
SpringBoot教程(十四) SpringBoot之集成Redis
SpringBoot教程(十四) | SpringBoot之集成Redis 一、Redis集成简介二、集成步骤 2.1 添加依赖2.2 添加配置2.3 项目中使用之简单使用 (举例讲解)2.4 项目中使用之工具类封装 (正式用这个)2.5 序列化 &…...
DeepSeek掘金——VSCode 接入DeepSeek V3大模型,附使用说明
VSCode 接入DeepSeek V3大模型,附使用说明 由于近期 DeepSeek 使用人数激增,服务器压力较大,官网已 暂停充值入口 ,且接口响应也开始不稳定,建议使用第三方部署的 DeepSeek,如 硅基流动 或者使用其他模型/插件,如 豆包免费AI插件 MarsCode、阿里免费AI插件 TONGYI Lin…...
OpenHarmony分布式数据管理子系统
OpenHarmony分布式数据管理子系统 简介 目录 组件说明 分布式数据对象数据共享分布式数据服务Key-Value数据库首选项关系型数据库标准数据化通路 相关仓 简介 子系统介绍 分布式数据管理子系统支持单设备的各种结构化数据的持久化,以及跨设备之间数据的同步、…...
如何有效利用MYSQL的连接数
连接数配置2500~3000 依然发现连接不够用? -- 查看当前最大连接数 SHOW VARIABLES LIKE MAX_CONNECTIONS; -- 查看当前总链接数 SHOW STATUS LIKE Threads_connected; -- 查看当前进程明细 SHOW PROCESSLIST; 合理设置以下参数: 1. MySQL 的参数设置 …...
【Java学习】多态
面向对象系列三 一、方法相同 二、方法重写 1.概念 2.条件 三、向上转型 1.概念 2.方式 四、方法绑定 五、多态 一、方法相同 方法相同要求方法名相同、参数列表相同、返回值类型相同(与两方法修饰的访问限定符相不相同、静态非静态状态相不相同无关),而且…...
单片机 Bootloade与二进制文件的生成
单片机的 Bootloader 是一种特殊的程序,负责在单片机上电后初始化硬件、更新用户应用程序(固件),并将控制权移交给用户程序。以下是其运行机制和关键流程的详细说明: 1、单片机 Bootloader 的核心作用 固件更新&…...
MySQL数据库(3)—— 表操作
目录 一,创建表 1.1 创建表的SQL 1.2 演示 二,查看表 三,修改表 四,删除表 常用的表操作会涉及到两种SWL语句 DDL(Data Definition Language)数据定义语言:建表、改表、删表等࿰…...
Springboot + Ollama + IDEA + DeepSeek 搭建本地deepseek简单调用示例
1. 版本说明 springboot 版本 3.3.8 Java 版本 17 spring-ai 版本 1.0.0-M5 deepseek 模型 deepseek-r1:7b 需要注意一下Ollama的使用版本: 2. springboot项目搭建 可以集成在自己的项目里,也可以到 spring.io 生成一个项目 生成的话,如下…...
七星棋牌源码高阶技术指南:6端互通、200+子游戏玩法深度剖析与企业级搭建实战(完全开源)
在棋牌游戏行业高速发展的今天,如何构建一个具备高并发、强稳定性与多功能支持的棋牌游戏系统成为众多开发者和运营团队关注的焦点。七星棋牌全开源修复版源码 凭借其 六端互通、200子游戏玩法、多省区本地化支持,以及 乐豆系统、防沉迷、比赛场、AI智能…...
【深度学习在图像配准中的应用与挑战】
图像配准在深度学习中的解决方案越来越多,尤其是通过卷积神经网络(CNN)和生成对抗网络(GAN)等方法,可以显著提升图像配准的效果,尤其是在处理复杂的非刚性变换和大范围的图像差异时。 1. 基于深…...
HarmonyOS 开发套件 介绍 ——上篇
HarmonyOS 开发套件 介绍 ——上篇 在当今科技飞速发展的时代,操作系统作为智能设备的核心,其重要性不言而喻。而HarmonyOS,作为华为推出的全新操作系统,正以其独特的魅力和强大的功能,吸引着越来越多的开发者和用户的…...
跳跃游戏(力扣55)
题目问是否可以跳到数组最后一个下标,有的同学可能会思考如何模拟跳跃这个操作,但这是比较困难的,很容易把自己绕进去。可以换一种思路,我们不需要知道具体是如何跳到最后一个下标的,而是找到最大的跳跃范围。如果该跳…...
网络空间安全(1)web应用程序的发展历程
前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷,从简单的文档共享系统到如今复杂、交互式、数据驱动的平台,经历了多个重要阶段。 一、起源与初期发展(1989-1995年) Web的诞生: 1989年,欧洲…...
机器学习 - 衡量模型的特性
最近我们陆续学习了机器学习的一些基础知识,本文来理解一下衡量机器学习模型的特性。了解机器学习模型的特性不仅有助于在理论上理解不同算法的工作原理,也能在实践中指导模型选择、参数调优、结果解释和系统部署,最终提高模型的实际应用效果…...
