信奥崔老师:while 语句

285 阅读4分钟

3.2 while 语句

图片

1. 概念介绍

while 语句是一种前置判断循环结构。它在每次循环开始前检查一个条件,只要条件为真,就重复执行循环体内的代码。它非常适用于循环次数不确定,但循环能否继续执行依赖于某个动态变化的条件的场景。

其基本结构为:while (condition) { // loop body }

2. 算法步骤

  1. 判断 condition 表达式的真假。
  2. 如果 condition 为 false,循环结束,程序跳转到 while 循环之后的代码。
  3. 如果 condition 为 true,则执行循环体内的代码。
  4. 返回第 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. 猜数字游戏:  程序随机生成一个1-100的数字,用户不断输入猜测的数字,程序给出“太大”或“太小”的提示,直到猜中为止。
  2. 辗转相除法:  输入两个正整数,使用 while 循环计算它们的最大公约数。
  3. 逆序输出整数:  输入一个非负整数,逆序输出它。例如输入123,输出321。
  4. 持续输入求和:  编写一个程序,不断读取用户输入的整数并累加,直到用户输入0为止。
  5. 判断回文数:  输入一个正整数,判断它是否是回文数(正读和反读都一样,如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 循环