3.3 do-while 语句
1. 概念介绍
do-while 语句是一种后置判断循环结构。它与 while 循环非常相似,但唯一的区别是它先执行一次循环体,然后再进行条件判断。这保证了循环体至少被执行一次。
其基本结构为:do { // loop body } while (condition);注意末尾的分号!
2. 算法步骤
- 执行循环体内的代码。
- 判断 condition 表达式的真假。
- 如果 condition 为
true,返回第 1 步,再次执行循环体。 - 如果 condition 为
false,循环结束。
3. 算法可视化SVG图示
4. 核心特性
- 先执行后判断: 循环体至少执行一次。
- 语法特殊: 结尾必须有一个分号
;。 - 适用性: 适合那些无论如何都需要先执行一次操作,然后根据结果决定是否重复的场景。
5. C++代码基础实现
#include <iostream>
int main() {
// 任务:实现一个简单的菜单,直到用户选择退出
char choice;
do {
std::cout << "\n--- 菜单 ---\n";
std::cout << "1. 开始游戏\n";
std::cout << "2. 加载游戏\n";
std::cout << "3. 退出\n";
std::cout << "请输入你的选择: ";
std::cin >> choice;
switch (choice) {
case '1': std::cout << "游戏开始...\n"; break;
case '2': std::cout << "加载存档...\n"; break;
case '3': std::cout << "感谢使用,再见!\n"; break;
default: std::cout << "无效选择,请重新输入。\n"; break;
}
} while (choice != '3'); // 只要选择不是 '3',就继续循环
return 0;
}
6. 优化策略
do-while循环本身没有太多优化空间,其使用主要是为了逻辑上的清晰。- 确保循环条件最终能为假,避免死循环。
7. 优缺点
- 优点:
-
- 完美适用于“至少执行一次”的逻辑,代码比等价的
while循环(需要while(true)+if-break或在循环前重复一次代码)更简洁。
- 完美适用于“至少执行一次”的逻辑,代码比等价的
- 缺点:
-
- 使用场景相对较少,不如
for和while常见。 - 循环条件在代码块之后,可能会被忽略,可读性有时稍差。
- 容易忘记结尾的分号。
- 使用场景相对较少,不如
8. 应用场景
-
菜单驱动程序: 如上例所示,先显示菜单再让用户选择。
-
输入验证: 要求用户输入一个有效值,如果输入无效则重复要求输入。
int age; do { cout << "请输入您的年龄 (必须为正数): "; cin >> age; } while (age <= 0);
9. 扩展
do-while 循环在逻辑上可以被 while 循环替代,但代码会稍显冗余。例如,上面的输入验证可以写成:
int age;
cout << "请输入您的年龄 (必须为正数): ";
cin >> age;
while (age <= 0) {
cout << "输入无效,请重新输入: ";
cin >> age;
}
可见 do-while 在这种场景下更自然。
10. 课后配套练习
- 正数输入器: 编写一个程序,要求用户输入一个正数。如果用户输入的是0或负数,程序应提示错误并要求重新输入,直到用户输入一个正数为止。
- 简单密码验证: 程序设置一个简单的密码(如 "123")。使用
do-while循环,让用户不断输入密码,直到输入正确为止。 - 累加到100: 从1开始累加,使用
do-while循环,当累加和首次超过100时停止,并输出这个和以及最后一个加上的数。 - 字符菜单: 实现一个简单的字符画菜单,用户输入'a'显示笑脸,输入'b'显示哭脸,输入'q'退出。循环至少执行一次。
- 掷骰子: 模拟掷一个六面骰子,使用
do-while循环,直到掷出6为止,并统计总共掷了多少次。
点击查看答案
1. 正数输入器
#include <iostream>
int main() {
int n;
do {
std::cout << "请输入一个正数: ";
std::cin >> n;
} while (n <= 0);
std::cout << "你输入的正数是: " << n << std::endl;
return 0;
}
2. 简单密码验证
#include <iostream>
#include <string>
int main() {
std::string password = "123";
std::string input;
do {
std::cout << "请输入密码: ";
std::cin >> input;
} while (input != password);
std::cout << "密码正确!" << std::endl;
return 0;
}
3. 累加到100
#include <iostream>
int main() {
int sum = 0, i = 0;
do {
i++;
sum += i;
} while (sum <= 100);
std::cout << "最后一个加的数是: " << i << std::endl;
std::cout << "最终的和是: " << sum << std::endl;
return 0;
}
4. 字符菜单
#include <iostream>
int main() {
char choice;
do {
std::cout << "输入'a'看笑脸, 'b'看哭脸, 'q'退出: ";
std::cin >> choice;
if (choice == 'a') std::cout << ":-)\n";
else if (choice == 'b') std::cout << ":-(\n";
} while (choice != 'q');
return 0;
}
5. 掷骰子
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
srand(time(0));
int roll, count = 0;
do {
roll = rand() % 6 + 1;
count++;
std::cout << "第 " << count << " 次掷出: " << roll << std::endl;
} while (roll != 6);
std::cout << "总共掷了 " << count << " 次才掷出6。" << std::endl;
return 0;
}
11. 相关网络资源推荐
- cppreference.com - do-while loop
- learncpp.com - Do-while statements