3.2 while 语句
1. 概念介绍
while 语句是一种前置判断循环结构。它在每次循环开始前检查一个条件,只要条件为真,就重复执行循环体内的代码。它非常适用于循环次数不确定,但循环能否继续执行依赖于某个动态变化的条件的场景。
其基本结构为:while (condition) { // loop body }
2. 算法步骤
- 判断 condition 表达式的真假。
- 如果 condition 为
false,循环结束,程序跳转到while循环之后的代码。 - 如果 condition 为
true,则执行循环体内的代码。 - 返回第 1 步,重新判断 condition。
3. 算法可视化SVG图示 3. 算法可视化 SVG 图示
4. 核心特性
- 先判断后执行: 循环体可能一次都不执行(如果初始条件就为假)。
- 条件驱动: 循环的持续由一个布尔条件控制。
- 手动更新: 必须在循环体内手动更新与条件相关的变量,否则容易导致无限循环。
5. C++代码基础实现
#include <iostream>
int main() {
// 任务:求一个正整数的各位数字之和
int n;
std::cout << "请输入一个正整数: ";
std::cin >> n;
int sum_of_digits = 0;
while (n > 0) {
sum_of_digits += n % 10; // 取出个位数并加到和中
n /= 10; // 移除个位数
}
std::cout << "各位数字之和是: " << sum_of_digits << std::endl;
return 0;
}
6. 优化策略
- 优化策略与
for循环类似,主要集中在减少循环体内的计算量。 - 确保循环终止条件最终能被满足,避免死循环。
7. 优缺点
- 优点:
-
- 逻辑非常清晰地表达了“当……时,重复做……”的意图。
- 是处理未知迭代次数循环的最佳选择。
- 缺点:
-
- 循环控制变量的初始化和更新分散在代码的不同位置,可能不如
for循环一目了然。 - 如果忘记在循环体内更新条件变量,极易造成死循环。
- 循环控制变量的初始化和更新分散在代码的不同位置,可能不如
8. 应用场景
- 读取数据直到文件末尾(EOF):
while (cin >> x)或while (scanf("%d", &x) != EOF)。 - 算法中的迭代: 如二分查找、辗转相除法(欧几里得算法)。
- 用户输入驱动的循环: 当程序需要持续等待用户输入,直到用户输入特定命令(如 "quit")时。
- 模拟: 当模拟过程的持续时间取决于某个动态变化的条件时。
9. 扩展
break和continue:-
break;: 立即跳出当前循环。continue;: 立即结束本次迭代,跳到循环的条件判断部分,开始下一次迭代。 这两个关键字在for和do-while循环中也同样适用。
10. 课后配套练习
- 猜数字游戏: 程序随机生成一个1-100的数字,用户不断输入猜测的数字,程序给出“太大”或“太小”的提示,直到猜中为止。
- 辗转相除法: 输入两个正整数,使用
while循环计算它们的最大公约数。 - 逆序输出整数: 输入一个非负整数,逆序输出它。例如输入123,输出321。
- 持续输入求和: 编写一个程序,不断读取用户输入的整数并累加,直到用户输入0为止。
- 判断回文数: 输入一个正整数,判断它是否是回文数(正读和反读都一样,如121)。
点击查看答案
1. 猜数字游戏
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
srand(time(0));
int secret_num = rand() % 100 + 1;
int guess;
std::cout << "猜一个1-100的数字: ";
while (std::cin >> guess) {
if (guess > secret_num) {
std::cout << "太大了!" << std::endl;
} else if (guess < secret_num) {
std::cout << "太小了!" << std::endl;
} else {
std::cout << "猜对了!" << std::endl;
break;
}
}
return 0;
}
2. 辗转相除法 (GCD)
#include <iostream>
int main() {
int a, b;
std::cin >> a >> b;
while (b != 0) {
int temp = a % b;
a = b;
b = temp;
}
std::cout << a << std::endl;
return 0;
}
3. 逆序输出整数
#include <iostream>
int main() {
int n;
std::cin >> n;
if (n == 0) {
std::cout << 0;
}
while (n > 0) {
std::cout << n % 10;
n /= 10;
}
std::cout << std::endl;
return 0;
}
4. 持续输入求和
#include <iostream>
int main() {
int num, sum = 0;
std::cout << "输入整数 (输入0结束):" << std::endl;
while (std::cin >> num && num != 0) {
sum += num;
}
std::cout << "总和是: " << sum << std::endl;
return 0;
}
5. 判断回文数
#include <iostream>
int main() {
int n;
std::cin >> n;
int original_n = n;
int reversed_n = 0;
while (n > 0) {
reversed_n = reversed_n * 10 + n % 10;
n /= 10;
}
if (original_n == reversed_n) {
std::cout << "是回文数" << std::endl;
} else {
std::cout << "不是回文数" << std::endl;
}
return 0;
}
11. 相关网络资源推荐
- cppreference.com - while loop
cppreference.com - while 循环 - GeeksforGeeks - C++ while loop
GeeksforGeeks - C++ while 循环