要致富 先撸树——判断循环语句(六)

引子

什么?万年丕更的作者更新了?

没错!而且我们不当标题党,我决定把《我的世界》串进文章里。

什么?你不玩《我的世界》?

木有关系 本专栏文章主要在讲c++语言的语法点和知识,保证让不玩《我的世界》的人也能听懂!

木哈哈哈哈,又水了四行


目录

引子

目录

1.while循环 加入了群聊

1.1 break语句和continue语句

1.2 死循环

2.要致富,先撸树

2.1 剩余的饥饿值(for循环)

T2.1解题思路

T2.1参考答案

2.2 原木放哪里?(while循环)

 T2.2解题思路

T2.2参考答案

尾声



1.while循环 加入了群聊

前面几期的循环章节我们讲了for循环,相信你在今后的学习中能熟练运用它。

还记得上次我们用scratch里的循环来讲解for循环码?

图1.scratch里的循环结构

今天我们要学习一种新的循环结构,大家请看第三个(上往下)scratch积木块,你可以把今天这个循环理解成条件循环。字面意思,重复执行直到<条件>为真,也就是当条件成立的时候才跳出循环,和for循环还是有一点点相似的o。

好吧,不卖关子了。今天我们将迎来一位新同学——while循环

首先我们来了解一下while的组成:

//#1:内部只有一个语句
while (条件表达式) 语句;while (条件表达式)语句;//#2:内部有多个语句
while (条件表达式)
{语句1;语句2;......语句n;
}                       //大括号的作用先前已讲过,这里就不重复了

while循环的一般执行顺序是:

  1. 判断<条件表达式>是否成立,成立跳到2.,否则跳出循环
  2. 按照先后顺序执行内部语句块(有时会有些特殊情况,具体下面会讲)
  3. 跳回1.

注意:在以后的算法学习中,你可能会看到这样式的while:

TYPE a;
while (cin >> a){语句1;语句2;......语句n;
}

不用太吃惊啦,这只是: 

C++ 语言中用于读取输入数据直到遇到文件结束符(EOF)或输入错误为止的一种方式。

在这个语句中,cin 是 C++ 标准库中的输入流对象,用于从标准输入(通常是键盘)读取数据。a 是需要读取的数据的变量名。

这个循环会一直执行,直到遇到以下情况之一:

  1. 读取到文件结束符(EOF)。这意味着输入已经结束,没有更多的数据可供读取。
  2. 读取过程中发生错误。例如,如果输入的数据类型与期望的类型不匹配,或者输入的数据本身不合法,那么 cin 对象会设置错误标志,循环将终止。

(以上来自百度 文心一言)

前面讲到while循环在执行内部语句的时候可能会遇到特殊情况,那么到底是什么特殊情况呢?

1.1 break语句和continue语句

让我们设想一种情境,你在循环的过程中,已经求得了问题的解,这时候再循环下去就没有意义了。所以这个时候我们就要跳出循环。那么在c++语言里,我们如何才能跳出循环呢?这就要借用两个语句的力量——

我知道标题上写了!再写一遍也不是不可以!

break语句continue语句

什么是break呢?你可以把它当作跳出循环的工具。break的作用就是跳出这一层循环(或switch)然后继续执行循环(或switch)后面的语句。注意,break跳出的是这一层循环

#include <iostream>
using namespace std;
int main(){for (int i = 0;i < 10;i ++){if (i == 5) break;        //当i等于5时,跳出循环cout << i << endl;}//该程序只能输出数字0~4return 0;
} 

什么又是continue呢?你可以把它理解成一个快进按钮。continue可以马上结束这一次循环,直接进入下一次循环。注意:continue是结束这一次循环

#include <iostream>
using namespace std;
int main(){for (int i = 0;i < 10;i ++){if (i == 5) continue;        //当i等于5时,直接进入下一次循环cout << i << endl;}//该程序只能输出数字0~4和数字6~9return 0;
} 

1.2 死循环

上期我们在讲for的时候就已经讲过死循环了。

有一种循环结构则不需要跳出循环,即死循环。因此,死循环中条件表达式的值恒为1。

for循环也可以用于死循环,如下:

  1. for (;;)

  2. {

  3.    //语句

  4. }

言简意赅的说,就是:木有变量!木有条件!木有更改!只要一直循环下去就可以了!

这期我们来深刻的剖析一下死循环和可能的避免方法。

死循环(endless loop)是编程中的一个概念,指的是无法靠自身的控制终止的循环。简单来说,就是在某一时刻,当程序遇到循环判断语句使条件一直成立时,导致此时该程序始终在执行,跳不出循环,程序不能自己正常结束。具体的例子有:

//for死循环实例
for (;;){cout << a;
}//while死循环实例
while (1){cout << a;
}while (true){cout << a;
}

提示:上面的代码在运行过程中若被强制停止,可能对你的宝贝电脑会有损伤!

是不是听起来很危险?

死循环通常是由于程序员疏忽或者错误导致的,例如忘记设置循环终止条件、判断条件错误等。死循环会导致程序无法继续执行其他任务,甚至使系统资源被耗尽,程序崩溃。

为了避免死循环,程序员应该在编写循环语句时确保有一个合适的退出条件,或者在循环体中加入一些判断条件来确保循环会在某个时刻终止。同时,也可以使用一些调试工具来跟踪程序的执行过程,找到导致死循环的原因并修复它。

没错,我们应该在编写程序的时候尽量避免死循环。 这时就要用到上面说到的两个特殊语句中的break了。我们可以设置当程序达到某一个特定条件时跳出循环。如下:

#include <iostream>
using namespace std;
int main(){int a;while (1){cout << a << endl;if (a == 5) break;        //a等于5时跳出循环}return 0;
}

好了,至此,相信你已经可以很好的掌握while语句了


2.要致富,先撸树

俗话说,要致富,先撸树。史蒂夫深谙此道理,但看看自己的仓库中木头存量寥寥无几,于是决定出发去收集一些木头来塞满自己的箱子。

乱砍滥伐是违法行为,小朋友们千万不要模仿哦!

2.1 剩余的饥饿值(for循环)

史蒂夫出发后才发现忘了带食物,此时他还有hunger点饥饿值(即满饥饿值),他不知道砍完所有木头后自己的饥饿值还剩多少(允许负数的情况),已知砍1棵树需要消耗2饥饿值,请你编写程序帮他计算。

输入:

第一行 输入三个整数m、n、hunger,其中m*n是合法砍树区域(即可以砍树的地方),hunger是初始饥饿值

下面m行每行输入n个数(0或1),1代表有树,0代表空地

输出:

处理过后的hunger,剩余饥饿值

输入样例:

4 5 20
0 0 1 0 1
1 0 0 0 0
0 1 1 0 1
0 0 0 0 1

输出样例:

6

提示:请先自行思考,再看答案o 

T2.1解题思路

思考1:如何保存树木生长情况以及判断一个位置上长有树而非空地

分析输入的数据,我们会发现输入的数据只有0、1两种,因此我们完全可以可以使用二维布尔型(或整型,效果同)数组来保存树木生长情况。在判断的时候,由于数据只可能是0或1,我们可以直接对这个位置判断。

思考2:怎么才能遍历到所有位置?

使用一个双重循环,第一重循环遍历每一行,第二重遍历每一列即可。或者使用滚动数组的方法(留给有能力的同学,这里就不写了)

T2.1参考答案

解法1:

#include <iostream>
using namespace std;
int m,n,hunger;
int main(){cin >> m >> n >> hunger;int tree[m][n];for (int i = 0;i < m;i ++)for (int j = 0;j < n;j ++){cin >> tree[i][j];if (tree[i][j]) hunger -= 2;}cout << hunger;return 0;
}

解法2(三目运算符):

#include <iostream>
using namespace std;
int m,n,hunger;
int main(){cin >> m >> n >> hunger;int tree[m][n];for (int i = 0;i < m;i ++)for (int j = 0;j < n;j ++){cin >> tree[i][j];hunger -= tree[i][j] ? 2 : 0;}cout << hunger;return 0;
}

2.2 原木放哪里?(while循环)

史蒂夫的背包快要装满啦!他又砍了一组原木,请你编写一程序,找到这组原木从左到右数第一个可以放置的位置并返回其下标,背包满了则输出"The bag is full!"。(背包是一维的)

输入:

第一行 一个整数n,史蒂夫背包的大小(长度)

第二行 n个数字(0或1),1代表有东西占位(1组原木或其他东西,反正史蒂夫刚刚砍的那一组原木肯定不能放在这了),0则相反

输出:

一个整数,目标位置的下标

输入样例:

9
1 1 1 1 1 0 1 1 0

输出样例:

5
 T2.2解题思路

思考1:如何返回下标?

可以设立一个变量i,循环改变i的值,若数组里下表为i的元素合法时,返回i就可以了。这类似于指针,以后我们讲指针的时候会用到类似的思想

思考2:如何改变i的值?

对数组中下表为i的元素进行判断(由于这个元素只存在0、1两种情况,我们可以沿用T2.1的判断方法),若等于1,则代表不能放在这里,i ++。重复直到元素为0时停止

T2.2参考答案

解法1(for循环解法):

#include <iostream>
using namespace std;
int n;
bool isFull = 1;        //用于检测背包是否装满
int main(){cin >> n;int bag[n];for (int i = 0;i < n;i ++){cin >> bag[i];}//以下for循环for (int i = 0;i < n;i ++){if (!bag[i]){        //检测到空位cout << i;isFull = 0;        //有空位,说明背包未满break;}}if (isFull) cout << "The bag was full!";return 0;
}

解法2(while循环解法)(输入部分都一样):

#include <iostream>
using namespace std;
int n,i;
bool isFull = 1;        //用于检测背包是否装满
int main(){cin >> n;int bag[n];for (int a = 0;a < n;a ++){cin >> bag[a];}//以下while循环while (bag[i] && i <= n - 1)i ++;        //无空位且位置合法,移动下标isFull = i <= n - 1 ? 0 : 1;        //若i“溢出”则背包满if (isFull) cout << "The bag was full!";else cout << i;return 0;
}

尾声

没有尾声

史蒂夫今天收获颇丰,因为他挖到了一大盒木头;

我们今天也收获颇丰,因为认识了一个新的循环——while。相信你在今后的学习之路上一定能熟练地掌握并运用它!

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

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

相关文章

Azure Machine Learning - 在 Azure 门户中创建AI搜索技能组

你将了解 Azure AI 搜索中的技能组如何通过添加光学字符识别 (OCR)、图像分析、语言检测、文本翻译和实体识别&#xff0c;在搜索索引中创建可搜索文本的内容。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff…

Python程序员入门指南:就业前景

文章目录 标题Python程序员入门指南&#xff1a;就业前景Python 就业数据Python的就业前景SWOT分析法Python 就业分析 标题 Python程序员入门指南&#xff1a;就业前景 Python是一种流行的编程语言&#xff0c;它具有简洁、易读和灵活的特点。Python可以用于多种领域&#xff…

ganache部署智能合约报错VM Exception while processing transaction: invalid opcode

这是因为编译的字节码不正确&#xff0c;ganache和remix编译时需要选择相同的evm version 如下图所示&#xff1a; remix: ganache: 确保两者都选择london或者其他evm&#xff0c;只要确保EVM一致就可以正确编译并部署&#xff0c; 不会再出现VM Exception while processing…

分享一个国内可用的免费GPT4-AI提问AI绘画网站工具

一、前言 ChatGPT GPT4.0&#xff0c;Midjourney绘画&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GPT-4对普…

LangChain 18 LangSmith监控评估Agent并创建对应的数据库

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

SSM框架(五):Maven进阶

文章目录 一、分模块开发1.1 分模块开发的意义1.2 步骤 二、依赖管理2.1 依赖传递2.2 可选依赖和排除依赖 三、继承与聚合3.1 聚合3.2 继承3.3 聚合和继承区别 四、属性4.1 pom文件的依赖使用属性4.2 资源文件使用属性 五、多环境开发六、跳过测试七、私服7.1 下载与使用7.2 私…

文件操作-IO

文件操作-IO 1.认识文件1.什么是文件2.文件路径 2.java中操作文件2.1 File类的用法 3.InputStream和OutputStream的用法 1.认识文件 1.什么是文件 文件是计算机系统中用来存储数据的基本单位。它是一种用于持久性存储数据的命名、有序的数据集合.计算机系统通过文件系统来组织…

gitlab高级功能之容器镜像仓库

今天给大家介绍一个gitlab的高级功能 - Container Registry&#xff0c;该功能可以实现docker镜像的仓库功能&#xff0c;将gitlab上的代码仓的代码通过docker构建后并推入到容器仓库中&#xff0c;好处就是无需再额外部署一套docker仓库。 文章目录 1. 参考文档2. Container R…

Linux 进程(三)

Linux进程状态的查看&#xff1a; 这是Linux内核源代码对于进程状态的定义&#xff1a; R运行状态&#xff08;running&#xff09;: 并不意味着进程一定在运行中&#xff0c;它表明进程要么是在运行中要么在运行队列里。 S睡眠状态&#xff08;sleeping): 意味着进程在…

openGauss学习笔记-138 openGauss 数据库运维-例行维护-检查时间一致性

文章目录 openGauss学习笔记-138 openGauss 数据库运维-例行维护-检查时间一致性138.1 操作步骤 openGauss学习笔记-138 openGauss 数据库运维-例行维护-检查时间一致性 数据库事务一致性通过逻辑时钟保证&#xff0c;与操作系统时间无关&#xff0c;但是系统时间不一致会导致…

18487.1 - 2015 电动汽车充电系统标准 第1部分 关键点梳理

一、部分知识介绍 1、连接方式 使用电缆和连接器将电动汽车接入电网&#xff08;电源&#xff09;的方法。 1.1、连接方式A 1.2、连接方式B 1.3、连接方式C 2、电动汽车控电设备 2.1、按照输出电压分类 1&#xff09;交流 单相 220V&#xff0c;三相 380V. 2&#xff09…

【超全】React学习笔记 下:路由与Redux状态管理

React学习笔记 React系列笔记学习 上篇笔记地址&#xff1a;【超全】React学习笔记 上&#xff1a;基础使用与脚手架 中篇笔记地址&#xff1a;【超全】React学习笔记 中&#xff1a;进阶语法与原理机制 React路由概念与理解使用 1. 引入 React路由是构建单页面应用(SPA, Sin…

CSS 选择器优先级,!important 也会被覆盖?

目录 1&#xff0c;重要性2&#xff0c;专用性3&#xff0c;源代码顺序 CSS 属性值的计算过程中。其中第2步层叠冲突只是简单说明了下&#xff0c;这篇文章来详细介绍。 层叠冲突更广泛的被称为 CSS选择器优先级计算。 为什么叫层叠冲突&#xff0c;可以理解为 CSS 是 Cascadi…

基于 Python+flask 构建态势感知系统(附完整源码)

一、开发 一个基于linux的态势感知系统&#xff0c;基于python和flask框架开发&#xff0c;项目文件目录如下&#xff1a; admin -核心算法 charts -图表生成 model -类 app.py -主文件 config.py -配置文件 install.py -安装文件 二、安装 1、配置 数据库密码默认设…

redis单机版本安装

redis单机版本安装 1.redis单机版源码编译安装搭建(4.0示例) redis下载地址 https://redis.io/download redis源码编译 #!/bin/sh yum install -y wget gcc gcc-c make tar openssl openssl-devel cmakecd /usr/local/src wget http://download.redis.io/releases/redis-4…

华为杯研究生数学建模优秀参考论文(优秀论文参考2004-2022年)

一、背景介绍 中国研究生数学建模竞赛是一项面向在校研究生进行数学建模应用研究的学术竞赛活动&#xff0c;是广大在校研究生提高建立数学模型和运用互联网信息技术解决实际问题能力&#xff0c;培养科研创新精神和团队合作意识的大平台&#xff0c;大赛赞助单位为华为技术有限…

什么是Daily Scrum?

Daily Scrum&#xff08;每日站会&#xff09;&#xff0c;Scrum Master要确保这个会在每天都会开。这个会的目的就是检查正在做的东西和方式是否有利于完成Sprint目的&#xff0c;并及时做出必要的调整。 每日站会一般只开15分钟&#xff0c;为了让事情更简单些&#xff0c;这…

无线物理层安全学习

文章目录 3.17到3.203.85到3.88 3.17到3.20 3.85到3.88

论文阅读——Img2LLM(cvpr2023)

arxiv&#xff1a;[2212.10846] From Images to Textual Prompts: Zero-shot VQA with Frozen Large Language Models (arxiv.org) 一、介绍 使用大语言模解决VQA任务的方法大概两种&#xff1a;multi-modal pretraining and language-mediated VQA&#xff0c;即多模态预训练…

进程的创建:fork()

引入 创建进程的方式我们已经学习了一个&#xff01;在我们运行指令(或者运行我们自己写的可执行程序)的时候不就是创建了一个进程嘛&#xff1f;那个创建进程的方式称为指令级别的创建子进程&#xff01; 那如果我们想要在代码中创建进程该怎么办呢&#xff1f; fork() for…