【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、选择结构

ifswitch?:

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π=131+5171+... 求圆周率 π 的近似值,直到最后一项的绝对值小于 1 0 − 8 10^{-8} 108 为止

注意审题,最后一项的绝对值,而不是整个式子的绝对值

#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;

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

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

相关文章

开源免费文档翻译工具 可支持pdf、word、excel、ppt

项目介绍 今天给大家推荐一个开源的、超实用的免费文档翻译工具&#xff08;DeeplxFile&#xff09;&#xff0c;相信很多人都有需要翻译文档的时刻&#xff0c;这款工具就能轻松解决你的需求。 它支持多种文档格式翻译&#xff0c;包括 Word、PDF、PPT、Excel &#xff0c;使…

30 款 Windows 和 Mac 下的复制粘贴软件对比

在日常电脑操作中&#xff0c;复制粘贴是极为高频的操作&#xff0c;一款好用的复制粘贴软件能极大提升工作效率。以下为你详细介绍 30 款 Windows 和 Mac 下的复制粘贴软件&#xff0c;并对比它们的优缺点&#xff0c;同时附上官网下载地址&#xff0c;方便大家获取软件。 Pa…

Unity学习笔记-Unity了解,安装,简单配置(一)

Unity 是什么&#xff1f; Unity 是一款广受欢迎的跨平台游戏开发引擎&#xff0c;由 Unity Technologies 公司开发并推出。它以强大的功能和易用性&#xff0c;在游戏开发领域占据着举足轻重的地位&#xff0c;甚至可以说&#xff0c;它改变了游戏开发的格局。凭借其出色的跨…

【JavaWeb学习Day17】

Tlias智能学习系统&#xff08;员工管理&#xff09; 新增员工&#xff1a; 三层架构职责&#xff1a; Controller&#xff1a;1.接收请求参数&#xff08;员工信息&#xff09;&#xff1b;2.调用service方法&#xff1b;3.响应结果。 具体实现&#xff1a; /***新增员工…

基于windows的docker-desktop安装kubenetes以及dashboard

我们需要k8s环境做各种小实验可以本地安装一个&#xff0c;这里介绍win11如何通过docker-desktop安装k8s以及通过helm安装dashboard。 下载docker-desktop地址https://www.docker.com/get-started/打开【控制面板】->打开【启用和关闭windows功能】->分别勾选【hyper-v】…

Vue2是如何利用Object.defineProperty实现数据的双向绑定?

我们之前说道过Object.defineProperty方法有一关键特性&#xff0c;就是数据劫持&#xff0c;通过get/set 拦截属性的读取和修改操作。Vue主要是通过数据劫持结合发布-订阅模式来实现的&#xff0c;利用Object.defineProperty来劫持各个属性的setter和getter&#xff0c;在数据…

【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、初识协议2、UDP、TCP3、Mac、IP地址4、端口号5、网络字节序6、socket 1、初识协议 协议就是一种约定。如何让不同厂商生产的计…

基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,医生,科室信息,就诊信息,医院概况,挂号信息,诊断信息,取消挂号 开题报告内容 基于FlaskVue框架的医院预约挂号系统开题报告 一、研究背景与意义 随着医疗技术的不断进步和人们健康意识的日益增强&#xff0c;医院就诊量逐年增加。传统的现场…

影刀RPA中级证书-Excel进阶-开票清单

1.操作题需求 请参照视频内容&#xff0c;将开票账单表格中的数据整理成开票清单。请下载 开票账单.xlsx 整理规则如下&#xff1a; 1. 金额为0的数据为赠品&#xff0c;无需开票&#xff0c;需删除2. 开票清单需要从开票账单中获取的数据包括有开票名称、数量、金额、税率&…

浅谈模组-相机鬼像

一&#xff0e;前言 在成像中&#xff0c;我们常常会遇到肉眼观测的真实世界中&#xff0c;不存在的异常光影出现在画面中&#xff0c;并伴有各种颜色&#xff0c;我们将这个物体称为鬼像。某些鬼像可能会对图像产生美感的体验&#xff0c;但是大多数的鬼像都会对图像的质量以…

Python爬虫实战:爬取豆瓣电影

目录 引言 1. 爬虫基础 1.1 什么是爬虫&#xff1f; 1.2 Python爬虫常用库 2. 实战&#xff1a;抓取豆瓣电影Top250 2.1 安装依赖库 2.2 发送HTTP请求 ​编辑 2.3 解析HTML ​编辑 2.4 存储数据 2.5 完整代码 3. 进阶&#xff1a;处理分页和动态内容 3.1 抓取多页…

Redis7——基础篇(六)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

Windows 下 Ollama 安装deepseek本地模型

Windows 下 Ollama 安装deepseek本地模型 安装 Ollama 下载 Ollama 下载链接&#xff1a;https://ollama.org.cn/download/windows 下载完成后&#xff0c;按照提示进行安装。 安装过程 安装完成后&#xff0c;安装页面会自动关闭&#xff0c;这是正常现象。 接下来&#…

【鸿蒙开发】第四十三章 Notification Kit(用户通知服务)

目录​​​​​​​ 1 简介 1.1 使用场景 1.2 能力范围 1.3 业务流程 1.4 通知样式 1.5 约束限制 1.6 与相关Kit的关系 2 请求通知授权 2.1 接口说明 2.2 开发步骤 3 管理通知角标 3.1 接口说明 3.2 开发步骤 4 管理通知渠道 4.1 通知渠道类型说明 4.2 接口说明…

bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全

ETL & 流批一体化框架 bboss v7.3.5 发布&#xff0c;多源输出插件增加为特定输出插件设置记录过滤功能&#xff1b;Elasticsearch 客户端新增异地双中心灾备机制&#xff0c;提升框架高可用性&#xff1b;Elasticsearch client 和 http 微服务框架增加对 Kerberos 认证支持…

利用非球面透镜进行激光光束重组

这是高斯分布激光束重塑透镜设计的分步演示。该透镜用于将高斯分布转换为成像平面上的均匀照明。 输入激光光束轮廓&#xff1a; 光学结构&#xff1a; Excel 中坐标的数学计算&#xff1a; 输出照度曲线&#xff1a;

(一)趣学设计模式 之 单例模式!

目录 一、啥是单例模式&#xff1f;二、为什么要用单例模式&#xff1f;三、单例模式怎么实现&#xff1f;1. 饿汉式&#xff1a;先下手为强&#xff01; &#x1f608;2. 懒汉式&#xff1a;用的时候再创建&#xff01; &#x1f634;3. 枚举&#xff1a;最简单最安全的单例&a…

nacos编写瀚高数据库插件

1、下载nacos源码 git clone gitgithub.com:alibaba/nacos.git 2、引入瀚高驱动 <dependency><groupId>com.highgo</groupId><artifactId>jdbc</artifactId><version>${highgo.version}</version></dependency> 3、DataSource…

讯飞唤醒+VOSK语音识别+DEEPSEEK大模型+讯飞离线合成实现纯离线大模型智能语音问答。

在信息爆炸的时代&#xff0c;智能语音问答系统正以前所未有的速度融入我们的日常生活。然而&#xff0c;随着数据泄露事件的频发&#xff0c;用户对于隐私保护的需求日益增强。想象一下&#xff0c;一个无需联网、即可响应你所有问题的智能助手——这就是纯离线大模型智能语音…

后端Java Stream数据流的使用=>代替for循环

API讲解 对比 示例代码对比 for循环遍历 package cn.ryanfan.platformback.service.impl;import cn.ryanfan.platformback.entity.Algorithm; import cn.ryanfan.platformback.entity.AlgorithmCategory; import cn.ryanfan.platformback.entity.DTO.AlgorithmInfoDTO; im…