循环——循环结构的对比
一、课上练习
编程练习
示例代码
求整数的和与均值代码示例
1#include <bits/stdc++.h>using namespace std;
2
3int main() {
4 int n;
5 cin >> n;
6 int sum = 0;
7 for (int i = 1; i <=n; ++i) {
8 int number;
9 cin >> number;
10 sum += number;
11 }
12 double average = 1.0 * sum / n;
13 printf("%d %.5f", sum, average);
14 return 0;
15}整除2的次数代码示例
1#include <bits/stdc++.h>using namespace std;
2
3int main() {
4 int n;
5 cin >> n;
6 int count = 0;
7 while (n % 2 == 0) {
8 ++count;
9 n = n / 2;
10 }
11 cout << count << endl;
12 return 0;
13}求s的值代码示例
1#include <bits/stdc++.h>using namespace std;
2
3int main() {
4 int now = 1;
5 int add = 0;
6 int sum = 0;
7 while (sum <= 5000) {
8 sum += now;
9 ++add;
10 now += add;
11 }
12 cout << sum << endl;
13 return 0;
14}小明的幸运数代码示例
1#include <bits/stdc++.h>using namespace std;
2
3int main() {
4 int k, l, r;
5 cin >> k >> l >> r;
6 int sum = 0;
7 for (int i = l; i <= r; ++i) {
8 if (i % 10 == k || i % k == 0) {
9 sum += i;
10 }
11 }
12 cout << sum << endl;
13 return 0;
14}判断质数代码示例
1#include <bits/stdc++.h>using namespace std;
2
3int main() {
4 int n;
5 cin >> n;
6 bool flag = true;
7 for (int i = 2; i * i <= n; ++i) {
8 if (n % i == 0) {
9 cout << i << endl;
10 flag = false;
11 break;
12 }
13 }
14 if (flag) {
15 cout << "Yes" << endl;
16 }
17 return 0;
18}二、知识总结
✨ 三种循环结构回顾
在之前的课程中,我们学习了三种循环结构。先来回顾一下它们的语法:
for循环
for (初始化; 条件; 更新) {
循环体
}while循环
初始化
while (条件) {
循环体
更新
}do-while循环
初始化
do {
循环体
更新
} while (条件);✨ 三种循环的对比
核心区别
| for循环 | while循环 | do-while循环 | |
|---|---|---|---|
| 判断时机 | 先判断,再执行 | 先判断,再执行 | 先执行,再判断 |
| 最少执行次数 | 0次 | 0次 | 1次 |
| 结构特点 | 初始化、条件、更新写在一行 | 三部分分散在不同位置 | 循环体在条件之前 |
| 适用场景 | 已知循环次数 | 循环次数未知,依赖条件 | 至少执行一次的场景 |
for循环的适用场景
for循环通常用于已知循环次数的场景,三部分集中在一行,结构清晰。
遍历1到n
for (int i = 1; i <= n; ++i) {
cout << i << endl;
}while循环的适用场景
while循环适用于循环次数未知、依赖于某个动态条件的场景。
条件驱动的循环: 当循环次数取决于运行时的条件
条件驱动循环代码示例
// 不断除以2,直到不能整除
while (n % 2 == 0) {
n = n / 2;
++count;
}等待特定事件: 循环直到满足某个条件才停止
等待特定事件代码示例
int n;
while (cin >> n && n != 0) {
cout << n << endl;
}无限循环: 配合break使用,在循环内部决定何时退出
无限循环代码示例
1while (true) {
2 int n;
3 cin >> n;
4 if (n == 0) {
5 break;
6 }
7}do-while循环的适用场景
do-while循环适用于至少需要执行一次的场景,例如用户输入验证——必须先让用户输入,才能判断是否合法。
do-while输入验证代码示例
1int n;
2do {
3 cout << "请输入一个正整数:";
4 cin >> n;
5} while (n <= 0); // 输入不合法则继续要求输入
6cout << "你输入的是:" << n << endl;✨ 如何选择循环结构
在实际编程中,可以按照以下思路选择合适的循环:
- 知道循环几次吗? 知道 → 用for循环
- 不知道循环几次,但至少要执行一次吗? 是 → 用do-while循环
- 不知道循环几次,可能一次都不执行? 是 → 用while循环
实际上三种循环可以互相转换,选择哪种主要看哪种写法最清晰易读。
✨ 综合示例:三种循环实现"求各位数字之和"
用三种循环解决同一个问题:输入一个正整数,求它各位数字之和。例如输入123,输出6(1+2+3=6)。
while实现
正在渲染流程图...
while实现代码
1int n, sum = 0;
2cin >> n;
3while (n > 0) {
4 sum += n % 10;
5 n /= 10;
6}
7cout << sum << endl;for实现
正在渲染流程图...
for实现代码
1int n, sum = 0;
2cin >> n;
3for (; n > 0; n /= 10) {
4 sum += n % 10;
5}
6cout << sum << endl;do-while实现
正在渲染流程图...
do-while实现代码
1int n, sum = 0;
2cin >> n;
3do {
4 sum += n % 10;
5 n /= 10;
6} while (n > 0);
7cout << sum << endl;对比总结
| while | for | do-while | |
|---|---|---|---|
| 流程 | 先判断n>0,再取余 | 先判断n>0,再取余 | 先取余,再判断n>0 |
| 输入n=0时 | 不执行循环,sum=0 | 不执行循环,sum=0 | 执行一次,sum=0 |
| 代码特点 | 最直观 | 更紧凑(更新写在for头部) | 保证至少执行一次 |
这个问题中while和for的流程图几乎相同,因为for循环本质上是while循环的语法简写。do-while的区别在于先执行再判断,不过对于正整数输入,三者结果一致。