7 while与do-while
正在加载视频播放器…
GESP C++ 一级:while 与 do-while 循环精讲
核心目标:掌握
while和do-while的语法、执行流程、与for的区别,会写累加、数位分离、输入判断、至少执行一次等常见循环。
while先判断后执行,可能一次都不执行;do-while先执行后判断,至少执行一次。
一、循环结构回顾
循环就是让一段代码重复执行。
C++ 一级需要掌握三种循环:
| 循环 | 特点 | 一级重要程度 |
|---|---|---|
for |
适合次数已知的循环 | 重点掌握 |
while |
适合次数未知、条件驱动的循环 | |
do-while |
至少执行一次的循环 | 掌握基本用法 |
循环三要素:
- 初始化:循环变量从哪开始。
- 条件:什么时候继续循环。
- 更新:每次循环后变量怎么变。
int i = 1; // 初始化
while (i <= 5) { // 条件
cout << i; // 循环体
i++; // 更新
}
缺少任何一步,都可能出错或死循环。
二、while 循环
1. 基本语法
while (条件) {
循环体;
}
执行流程:
- 判断条件。
- 条件为真,执行循环体。
- 循环体执行完,回到第 1 步继续判断。
- 条件为假,跳出循环,执行后面的代码。
口诀:
先判断,后执行;
条件真,就循环;
条件假,就结束。
2. 示例:输出 1 到 5
int i = 1;
while (i <= 5) {
cout << i << " ";
i++;
}
输出:
1 2 3 4 5
3. 示例:求 1 到 n 的和
int n;
cin >> n;
int i = 1;
int sum = 0;
while (i <= n) {
sum += i;
i++;
}
cout << sum << endl;
4. 示例:数位分离
int n;
cin >> n;
while (n > 0) {
int d = n % 10; // 取个位
cout << d << " ";
n /= 10; // 去掉个位
}
输入 1234,输出:
4 3 2 1
5. 示例:输入直到满足条件
int x;
cin >> x;
while (x != 0) {
cout << x << " ";
cin >> x;
}
输入:
3 5 0
输出:
3 5
6. 条件为假时一次也不执行
int i = 10;
while (i <= 5) {
cout << i;
i++;
}
因为 10 <= 5 为假,循环体一次也不执行。
三、do-while 循环
1. 基本语法
do {
循环体;
} while (条件);
注意:
do后面先执行循环体。- 再判断
while条件。 - 条件为真,继续循环。
- 条件为假,结束循环。
- 末尾必须有分号
;。
执行流程:
- 先执行一次循环体。
- 判断条件。
- 条件为真,回到第 1 步。
- 条件为假,结束循环。
口诀:
先执行,后判断;
至少执行一次;
末尾别忘分号。
2. 示例:输出 1 到 5
int i = 1;
do {
cout << i << " ";
i++;
} while (i <= 5);
输出:
1 2 3 4 5
3. 示例:至少执行一次
int i = 10;
do {
cout << "执行一次" << endl;
i++;
} while (i <= 5);
输出:
执行一次
因为先执行,后判断,即使条件一开始为假,也会执行一次。
4. 示例:输入直到输入 0
int x;
do {
cin >> x;
if (x != 0) {
cout << x << " ";
}
} while (x != 0);
输入:
3 5 0
输出:
3 5
四、while 与 do-while 的区别
| 项目 | while |
do-while |
|---|---|---|
| 判断时机 | 先判断,后执行 | 先执行,后判断 |
| 最少执行次数 | 0 次 | 1 次 |
| 末尾分号 | 无 | 必须有 ; |
| 适用场景 | 条件可能一开始就不成立 | 至少需要执行一次 |
| 语法 | while (条件) { } |
do { } while (条件); |
示例对比:
int i = 10;
while (i <= 5) {
cout << "while";
i++;
}
// 不输出
int i = 10;
do {
cout << "do-while";
i++;
} while (i <= 5);
// 输出一次 do-while
五、while、do-while 与 for 的对比
| 循环 | 适合场景 | 示例 |
|---|---|---|
for |
次数已知 | for (int i = 1; i <= n; i++) |
while |
次数未知,条件驱动 | while (n > 0) |
do-while |
至少执行一次 | do { ... } while (条件); |
三者可以互相转换,但各有最适合的场景。
for 版求和:
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
while 版求和:
int i = 1, sum = 0;
while (i <= n) {
sum += i;
i++;
}
do-while 版求和:
int i = 1, sum = 0;
do {
sum += i;
i++;
} while (i <= n);
六、break 与 continue
1. break
立即跳出整个循环。
int i = 1;
while (1) { // 死循环
if (i > 5) break;
cout << i << " ";
i++;
}
输出:
1 2 3 4 5
2. continue
跳过本次循环剩余语句,进入下一次循环判断。
int i = 0;
while (i < 5) {
i++;
if (i == 3) continue;
cout << i << " ";
}
输出:
1 2 4 5
注意:continue 在 while 中容易造成死循环,因为可能跳过更新语句。
错误示例:
int i = 0;
while (i < 5) {
if (i == 3) continue; // i 不增加,死循环
cout << i << " ";
i++;
}
正确写法:
int i = 0;
while (i < 5) {
i++;
if (i == 3) continue;
cout << i << " ";
}
七、常见循环模型
1. 累加求和
int i = 1, sum = 0;
while (i <= n) {
sum += i;
i++;
}
2. 累乘求阶乘
int i = 1;
long long fac = 1;
while (i <= n) {
fac *= i;
i++;
}
3. 数位分离
while (n > 0) {
int d = n % 10;
n /= 10;
}
4. 求位数
int cnt = 0;
while (n > 0) {
cnt++;
n /= 10;
}
注意:如果 n = 0,位数是 1,需要特判。
5. 判断质数
bool isPrime = true;
if (n < 2) isPrime = false;
int i = 2;
while (i * i <= n) {
if (n % i == 0) {
isPrime = false;
break;
}
i++;
}
6. 输入若干个数求和
int x, sum = 0;
while (cin >> x) {
sum += x;
}
cout << sum << endl;
按 Ctrl+Z(Windows)或 Ctrl+D(Linux)结束输入。一级了解即可。
7. 至少执行一次
int x;
do {
cin >> x;
// 处理 x
} while (x != 0);
八、易错点
-
while条件后多写分号while (i <= 5); // 错误,循环体为空,可能死循环 -
do-while末尾漏写分号do { // ... } while (i <= 5) // 错误,缺少 ; -
循环变量未初始化
int i; while (i <= 5) { } // 错误,i 值不确定 -
循环变量未更新
int i = 1; while (i <= 5) { cout << i; // 忘记 i++,死循环 } -
continue跳过更新导致死循环while (i < 5) { if (i == 3) continue; i++; } -
混淆
while和do-while的执行次数while:可能 0 次。do-while:至少 1 次。
-
do-while中变量未初始化就使用int x; do { cout << x; // 错误,x 未初始化 } while (x != 0); -
循环边界写错
while (i < n) // 与 i <= n 结果不同 -
break和continue混用break:跳出整个循环。continue:只跳过本次。
-
输入循环忘记处理结束条件
如while (cin >> x)需要手动结束输入。
九、阅读程序写结果
题目 1
int i = 1;
while (i <= 3) {
cout << i << " ";
i++;
}
输出:
1 2 3
题目 2
int i = 5;
while (i <= 3) {
cout << i << " ";
i++;
}
输出:
(无输出)
题目 3
int i = 5;
do {
cout << i << " ";
i++;
} while (i <= 3);
输出:
5
题目 4
int n = 123;
while (n > 0) {
cout << n % 10 << " ";
n /= 10;
}
输出:
3 2 1
题目 5
int i = 0, sum = 0;
while (i < 5) {
i++;
if (i == 3) continue;
sum += i;
}
cout << sum << endl;
输出:
12
解释:加的是 1、2、4、5,和为 12。
题目 6
int i = 1;
while (1) {
if (i > 3) break;
cout << i << " ";
i++;
}
输出:
1 2 3
题目 7
int x = 0;
do {
cout << x << " ";
x++;
} while (x < 3);
输出:
0 1 2
题目 8
int n = 0;
int cnt = 0;
while (n > 0) {
cnt++;
n /= 10;
}
cout << cnt << endl;
输出:
0
解释:n = 0 时循环不执行,cnt 为 0。如果要求位数,需要特判。
十、速查表
| 需求 | 写法 |
|---|---|
while 基本结构 |
while (条件) { ... } |
do-while 基本结构 |
do { ... } while (条件); |
| 先判断后执行 | while |
| 至少执行一次 | do-while |
| 累加求和 | while (i <= n) { sum += i; i++; } |
| 数位分离 | while (n > 0) { d = n % 10; n /= 10; } |
| 死循环 | while (1) { ... break; } |
| 跳出循环 | break |
| 跳过本次 | continue |
| 输入直到结束 | while (cin >> x) { ... } |
| 至少执行一次输入 | do { cin >> x; } while (x != 0); |
十一、总结
while 与 do-while 是一级循环结构的重要内容。
while先判断后执行,可能一次都不执行。do-while先执行后判断,至少执行一次。do-while末尾必须有分号。- 循环三要素:初始化、条件、更新,缺一不可。
- 忘记更新循环变量会导致死循环。
break跳出整个循环,continue跳过本次。while适合次数未知、条件驱动的循环。do-while适合至少执行一次的场景。
复习时多练“阅读程序写结果”和“数位分离、累加求和”两类题,重点注意循环边界、变量初始化、变量更新、continue 位置和 do-while 末尾分号。考试中先判断循环执行次数,再逐轮模拟变量变化,最后检查输出格式。