信奥崔老师:循环语句do-while 语句

246 阅读4分钟

3.3 do-while 语句

图片

1. 概念介绍

do-while 语句是一种后置判断循环结构。它与 while 循环非常相似,但唯一的区别是它先执行一次循环体,然后再进行条件判断。这保证了循环体至少被执行一次

其基本结构为:do { // loop body } while (condition);注意末尾的分号!

2. 算法步骤

  1. 执行循环体内的代码。
  2. 判断 condition 表达式的真假。
  3. 如果 condition 为 true,返回第 1 步,再次执行循环体。
  4. 如果 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;
              defaultstd::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. 课后配套练习

  1. 正数输入器:  编写一个程序,要求用户输入一个正数。如果用户输入的是0或负数,程序应提示错误并要求重新输入,直到用户输入一个正数为止。
  2. 简单密码验证:  程序设置一个简单的密码(如 "123")。使用do-while循环,让用户不断输入密码,直到输入正确为止。
  3. 累加到100:  从1开始累加,使用do-while循环,当累加和首次超过100时停止,并输出这个和以及最后一个加上的数。
  4. 字符菜单:  实现一个简单的字符画菜单,用户输入'a'显示笑脸,输入'b'显示哭脸,输入'q'退出。循环至少执行一次。
  5. 掷骰子:  模拟掷一个六面骰子,使用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