【NOI】C++程序结构入门之循环结构一-while


前言

在前面的章节中,我们学习了程序的顺序结构、分支结构。在计算机科学的编程之旅中,掌握各种控制结构是解锁复杂逻辑与高效算法的关键。继顺序结构和分支结构之后,循环结构作为程序设计的又一基石,其重要性不言而喻。循环赋予了程序“重复执行”的能力,使得处理批量数据、执行重复任务变得可能。本章将深入探讨循环结构,尤其是while循环的基础与应用,它是编程中实现条件循环控制的核心工具,让程序在满足特定条件下持续运行,直至达到预定的停止条件。

学习路线:C++从入门到NOI学习路线

学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲


一、循环结构

1.导入

学习循环结构,首先需要知道什么是循环?

在这里插入图片描述

我们周一到周五需要到学校上课,然后周六周日在家休息。然后周一又要…

在这里插入图片描述

所以简单的来说,循环就是重复的做一件事情。

例如:

四季更替:春、夏、秋、冬的顺序重复。

在这里插入图片描述

日夜交替:白昼与黑夜的循环。

在这里插入图片描述

而循环结构是计算机科学中一种基本的编程结构,允许一段代码多次执行,直至满足特定条件。

2.while

2.1 定义

while循环是一种基本的循环结构,属于“当型”循环,其特点是先检查条件,如果条件满足,则执行循环体内的代码。具体来说,while循环的结构如下:

while(条件表达式) {
    // 循环体(需要重复执行的代码)
}
  • 条件表达式:这是一个布尔表达式,用于判断循环是否应该继续执行。如果表达式的值为true,则执行循环体;如果为false,则跳出循环,继续执行循环之后的代码。
  • 循环体:这是需要重复执行的代码块。循环体会一直执行,直到条件表达式的值变为false。

2.2 死循环

死循环,也称为无限循环或endless loop,是一种编程错误,指的是程序中的循环结构因为没有恰当的终止条件或者循环条件一直保持为真,导致循环无法自行结束,程序会无休止地执行循环内的代码。

在这里插入图片描述
为了避免无限循环(也称为“死循环”),在循环体内部通常会有一个或多个语句来改变条件表达式的值,使得循环最终能够停止。

二、例题讲解

问题:1696. 请输出1~n之间所有的整数

类型:循环


题目描述:

从键盘读入一个整数 𝑛n ,请循环输出 1∼n 之间所有的整数,每行输出 1 个。
比如,假设 n=5 ,那么输出结果如下:
1
2
3
4
5

输入:

一个整数 n 。

输出:

输出 1∼n 之间所有的整数。

样例:

输入:

5

输出:

1
2
3
4
5

在这里插入图片描述


1.分析问题

  1. 已知:循环输出1~n之间的每个数

  2. 关系:循环

2.定义变量

定义了两个整型变量:

  • i 初始化为1,作为循环中的计数器。
  • n 用于存储用户输入的上限值,但这里初始化没有给出,稍后通过cin读取。
	//二、数据定义 
	int i=1,n;

3.输入数据

  • 使用cin读取用户输入的一个整数,并将其存储在变量n中。
	//三、数据输入 
	cin>>n; 

4.数据计算

使用while循环,条件是i小于等于n:

  • 在循环内部,先输出当前的i值(即cout<<i<<endl;),然后换行。
  • 每次循环结束后,i自增1(即++i;),直到i大于n,循环结束。
//四、数据计算 
	while(i<=n){
		cout<<i<<endl;
		++i;
	}

完整代码如下:

#include <iostream> // 引入标准输入输出库

using namespace std; // 使用标准命名空间

int main() { // 程序主体开始
    int i = 1, n; // 初始化计数器变量i,声明n存储待确定边界

    cin >> n; // 等待用户输入一个整数到n

    while(i <= n) { // 当i的值不大于n时执行循环
        cout << i << endl; // 输出i的当前值并换行
        ++i; // 让i递增,准备下一次循环
    }

    return 0; // 表示程序成功执行完毕
}

问题: 1697. 请输出n~1之间所有的整数

类型:循环


题目描述:

从键盘读入一个整数 n ,请输出 n∼1 之间所有的整数,每行输出 1 个。
比如,假设读入 n=5 ,输出结果如下:
5
4
3
2
1

输入:

一个整数 n 。

输出:

输出 n~1 之间所有的整数。

样例:

输入:

5

输出:

5
4
3
2
1

在这里插入图片描述


1.分析问题

  1. 已知:需要编写一个程序,它能接收用户输入的一个整数n,然后从n开始,递减输出每一个整数直到1。
  2. 关系:使用while循环来实现这一需求,因为循环的执行条件直接与变量n的值有关。

2.定义变量

  • 定义了一个整型变量n,用于存储用户输入的数值。
	//二、数据定义 
	int n;

3.输入数据

  • 使用cin >> n;语句来从标准输入(通常是键盘)读取一个整数,并将其存储到变量n中。
	//三、数据输入
	cin>>n; 

4.数据计算

  • 循环条件为n非零(即n大于0),确保当n等于0时循环终止。
  • 在循环内部,首先使用cout << n << endl;输出当前的n值,并跟随一个换行符endl以在每个数字之后换行。
  • 然后,利用–n;将n的值递减1,以便下一次循环检查和输出下一个较小的整数。
//四、数据计算 
	while(n){
		cout<<n<<endl;
		--n;
	}

完整代码如下:

while循环:

#include <bits/stdc++.h> // 包含C++的标准库,提供了常用的数据结构和算法
using namespace std; // 使用std命名空间,避免每次调用标准库函数和对象时都需要加std::前缀

int main() { // 程序的主入口点
    // 一、分析问题
    // 目标:接收用户输入的一个整数n,然后从n开始递减至1,每个数输出一行。

    // 二、数据定义
    int n; // 定义一个整型变量n,用来存储待输出的起始数值

    // 三、数据输入
    cin >> n; // 从标准输入读取一个整数赋值给n,等待用户输入

    // 四、数据处理与输出
    while (n) { // 当n非零时进入循环
        cout << n << endl; // 输出当前的n值,并换行
        --n; // 将n减1,以便下一次循环检查下一个数
    }

    // 注意:while(n) 的循环条件巧妙地确保了当n减到0时自然退出循环

    // 五、程序结束
    return 0; // 主函数结束,返回0表示程序执行成功
}


问题:1698. 请输出带有特殊尾数的数

类型:循环基础


题目描述:

请输出1∼n 中所有个位为 1、3、5、7中任意一个数的整数,每行 1 个。( n<1000 )
比如,假设从键盘读入 20,输出结果如下:
1
3
5
7
11
13
15
17

输入:

一个整数 n 。

输出:

输出满足条件的数,每行 1 个。

样例:

输入:

20

输出:

1
3
5
7
11
13
15
17

在这里插入图片描述


1.分析问题

  1. 已知:程序处理的范围是从1到n的整数序列。
  2. 未知:需要找出并输出这个范围内所有个位数为1、3、5、7的整数。
  3. 关系:通过循环遍历序列中的每个数,并对每个数进行个位数的检查来确定是否满足条件。

2.定义变量

定义了两个整型变量:

  • i 初始化为1,作为循环计数器,用于遍历1到n之间的每个数。
  • n 用于存储用户输入的上限值,尚未初始化。
	//二、数据定义 
	int i=1,n; 

3.输入数据

  • 使用cin >> n;读取用户输入的整数n,作为循环的结束条件。
	//三、数据输入 
	cin>>n;

4.数据计算

使用while(i <= n)循环遍历1到n之间的所有整数。

  • 在循环体内,使用if语句检查当前数i的个位数(i % 10)是否等于1、3、5或7。
  • 如果条件满足(即i的个位数是1、3、5、7之一),则使用cout << i << endl;输出这个数并换行。
  • 每次循环迭代结束后,i的值递增1(++i),以便检查下一个数。
	//四、数据计算 
	while(i<=n){
		if(i%10==1||i%10==3||i%10==5||i%10==7){
			cout<<i<<endl;
		}
		++i;
	}

完整代码如下:

#include <bits/stdc++.h> // 包含标准库的大量常用功能,简化编程
using namespace std; // 使用std命名空间,可以直接调用其中的函数和对象

int main() { // 程序的主函数
    // 一、问题分析
    // 目标:找出并打印从1到n之间所有个位数为1、3、5、7的整数。

    // 二、数据定义
    int i = 1, n; // 初始化计数器i为1,n用于存储用户输入的上限值

    // 三、数据输入
    cin >> n; // 从用户处获取上限值n

    // 四、数据处理与输出
    while (i <= n) { // 当i小于等于n时循环
        // 判断当前数i的个位数是否为1、3、5、或7
        if (i % 10 == 1 || i % 10 == 3 || i % 10 == 5 || i % 10 == 7) {
            cout << i << endl; // 如果满足条件,输出该数并换行
        }
        ++i; // 无论是否满足条件,i自增,继续检查下一个数
    }

    // 五、程序结束
    return 0; // 主函数结束,返回0表示程序执行成功
}

问题:1699 - 输出是2的倍数,但非3的倍数的数

类型:循环


题目描述:

请从键盘读入一个整数 n,输出 1∼n 中所有是 2 的倍数,但非 3 的倍数的数,每行 1个。
比如,读入一个整数10 ,输出结果如下:
2
4
8
10

输入:

一个整数 n 。

输出:

按要求输出 1∼n 中满足条件的整数,每行 1 个。

样例:

输入:

10

输出:

2
4
8
10

在这里插入图片描述


1.分析问题

  1. 已知:1~n的数 。
  2. 未知:输出符合条件的数 。
  3. 关系:1到n之间的偶数,但排除那些同时能被3整除的偶数。

2.定义变量

  • 声明了两个整型变量,i初始化为1,用作循环计数器;n未初始化,稍后会从用户那里接收输入。
int i=1,n;

3.输入数据

  • 从标准输入(一般指键盘)读取一个整数,存储在变量n中,作为循环的上限。
	//三、数据输入 
	cin>>n;

4.数据计算
使用while循环遍历从1到n(包含n)的整数。

  • 对于当前数i,使用条件判断检查它是否为偶数(i % 2 == 0)并且不是3的倍数(i % 3 != 0)。%是取模运算符,用来判断一个数除以另一个数的余数。
  • 如果当前数满足条件,就通过标准输出流cout打印这个数,并跟随着一个换行符endl。
  • 循环体结束前,将i的值递增1,以便检查下一个数。
	//四、数据计算 
	while(i<=n){
		if(i%2==0&&i%3!=0){
			cout<<i<<endl;
		}
		++i;
	}

5.输出结果

#include <bits/stdc++.h> // 包含C++标准库的常用部分,为了简化编程,但实际开发中建议具体包含所需头文件
using namespace std; // 允许直接使用标准库中的名称,无需std::前缀

int main() { // 程序的主入口点
    // 一、问题分析
    // 目标:找出1到n之间的偶数,但排除那些同时能被3整除的偶数。

    // 二、数据定义
    int i = 1, n; // 初始化计数器i为1,n用于存储用户输入的上限值

    // 三、数据输入
    cin >> n; // 从标准输入读取一个整数n,作为循环的上限

    // 四、数据处理与输出
    while (i <= n) { // 当i的值在1到n的范围内时执行循环
        // 判断当前数i是否为偶数且不是3的倍数
        if (i % 2 == 0 && i % 3 != 0) { // % 是取余运算符,用于判断整除性
            cout << i << endl; // 如果i满足条件(偶数且非3的倍数),则输出i并换行
        }
        ++i; // 递增i,继续检查下一个数
    }

    // 五、程序结束
    return 0; // 表示程序执行成功结束,返回0给操作系统
}

问题:1700. 请输出所有的2位数中,含有数字2的整数

类型:循环基础


题目描述:

请输出所有的 2 位数中,含有数字 2 的整数有哪些,每行 1 个,按照由小到大输出。
比如:12、20、21、22、23… 都是含有数字 2 的整数。

输入:

无。

输出:

按题意要求由小到大输出符合条件的整数,每行 1 个。

样例:

输入:


输出:


在这里插入图片描述


1.分析问题

  1. 已知:范围限制在所有的两位数(即10到99之间的整数)。
  2. 未知:需要找到并输出所有在这个范围内且包含数字2的整数。
  3. 关系:通过循环遍历这个范围内的每一个数,并检查每个数是否包含数字2。

2.定义变量

  • 初始化变量i为10,确保从最小的两位数开始检查。
  int i = 10; 

3.输入数据

这个问题不需要从用户那里获取任何输入,因为要处理的数据范围是固定的(即两位数)。

4.数据计算

  • 使用循环遍历从10到99的所有整数。
  • 对于每个数i,使用条件语句if(i%10 == 2 || i / 10==2)来检查该数是否包含数字2。这里,i%10得到数的个位,i/10(整除)得到十位。如果个位或十位是2,则条件满足。
	//四、数据计算 
	while(i<=99){
		if(i%10==2||i/10==2){
		//五、输出结果
		cout<<i<<endl;
		}
	}

5.输出结果

当if条件满足,即当前数包含数字2时,使用cout<<i<<endl;输出这个数。

完整代码如下:

while循环:

#include <bits/stdc++.h> 
using namespace std;

int main() {
    // 一、问题分析
    // 目标:找出并打印出所有包含数字2的两位整数。
    // 范围:考虑的数从10到99(包括两端)。

    // 二、数据定义
    int i = 10; // 初始化变量i为10,确保从最小的两位数开始检查。

    // 三、数据输入
    // 本程序无需外部输入,直接处理预定义范围内的数值。

    // 四、数据计算与输出
    while(i <= 99) { // 循环遍历所有两位数
        // 判断当前数i是否包含数字2
        // 方法:检查个位(i % 10)或十位(i / 10取整)是否等于2
        if(i % 10 == 2 || i / 10 == 2) { 
            // 如果当前数i包含数字2,则打印该数
            cout << i << endl;
        }
        
        // 递增i,进入下一个数的检查
        i++;
    }

    // 程序正常结束
    return 0; // 返回0表示程序执行成功
}

问题:1701. 请输出所有的3位对称数

类型:循环基础


题目描述:

请输出所有的 3位对称数,对称数指的是一个整数 n 正过来和倒过来是一样的,比如:101、121、282…
请从小到大输出符合条件的3位对称数,每行 1 个。

输入:

无。

输出:

从小到大按题意输出符合条件的数,每行 1 个。

样例:

输入:


输出:


在这里插入图片描述


1.分析问题

  1. 已知:考虑所有的三位数。
  2. 未知:找出并输出所有的对称数(即从左至右和从右至左读都相同的数)。
  3. 关系:使用循环遍历所有三位数,并通过条件判断识别对称数。

2.定义变量

  • 初始化变量i为100,确保从最小的三位数开始检查。
  int i = 100; 

3.输入数据

无。

4.数据计算

  • 使用循环遍历从100到999的所有整数。
  • 再通过if判断出符合条件的数。
 // 四、数据计算与判断对称性
    while(i <= 999) { 
        
        // 判断是否为对称数:百位等于个位
        if(i % 10 == i / 100) {
            // 五、输出结果
            cout << i << endl;
        }
        
        // 在循环末尾递增i,以便检查下一个数
        i++;
    }

完整代码如下:

while循环:

#include <bits/stdc++.h> 
using namespace std;
int main(){
    // 一、分析问题
    // 已知:考虑所有的三位数。
    // 未知:找出并输出所有的对称数(即从左至右和从右至左读都相同的数)。
    // 关系:使用循环遍历所有三位数,并通过条件判断识别对称数。

    // 二、数据定义及初始化
    int i = 100; // 初始化计数器i为100,即第一位三位数

    // 三、数据输入
    // 四、数据计算与判断对称性
    while(i <= 999) { 
        
        // 判断是否为对称数:百位等于个位
        if(i % 10 == i / 100) {
            // 五、输出结果
            cout << i << endl;
        }
        
        // 在循环末尾递增i,以便检查下一个数
        i++;
    }
    return 0; // 表示程序执行成功
}

三、总结

循环结构,尤其是while循环,是编程语言中构建动态、响应式程序的强有力工具。通过本节的学习,不仅理解了其基本概念与语法,还通过一系列实战演练掌握了如何在不同场景下灵活应用,解决实际问题。循环不仅是重复的代名词,更是逻辑思维与算法效率的体现,是通往编程高手之路的必经之石。继续深入探索,你将发现更多循环的奥秘与高级技巧,让程序设计更上一层楼。

四、感谢

如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。

每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!

在这里插入图片描述

  • 48
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月别枝惊鹊丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值