循环结构(二)
do-while:至少执行一次

从至少测量一次到逐位处理整数,理解“先做再判断”的循环

上节课留下的问题

while

先判断条件,再决定是否执行循环体。

适用情境

进入循环前,继续条件已经明确。

新问题

如果必须先执行一次,才能知道是否继续呢?

第2课时学习目标

知识目标

  • 理解 do-while 的语法和执行顺序
  • 掌握整数位数统计和逆序输出的循环模式
  • 比较 while 与 do-while

能力目标

  • 能识别“至少执行一次”的问题
  • 能用 %10 与 /10 处理整数各位
  • 能使用边界数据检验循环结构
4.2 / do-while语句
有些任务必须先做一次,
再判断是否继续
一次脉搏测量完成后,用户才决定是否继续测量。
dowhile至少一次

脉搏测量:为什么不是先问条件?

情境:门诊程序要求至少录入一次脉搏值,然后询问是否继续录入下一条记录。
录入一次脉搏
→
处理当前记录
→
询问是否继续
→
根据选择决定下一轮

先执行,再判断。

do-while 语句

do {
    循环体语句;
} while (表达式);

执行顺序

  1. 先执行循环体
  2. 再判断表达式
  3. 真:继续下一轮
  4. 假:结束循环
注意:do-while 结尾有分号。

while 与 do-while 的核心差别

结构 判断位置 循环体最少执行次数 适合问题
while 循环前 0次 条件进入前已明确
do-while 循环后 1次 必须先执行一次才能判断

🤖 AI 协作互动:场景对比辨析

请设计 2 个简单的 C 语言实际教学场景:说明为什么场景 A 必须使用 do-while(确保循环体至少执行一次),而场景 B 使用 while 更加安全?

💡 课堂互动:比较 AI 给出的案例与老师讲解的菜单输入/数据校验案例有何异同。

while 与 do-while 执行顺序比较

while与do-while执行顺序比较
教材例4-3
统计整数位数:
每次去掉一位
把一个整数不断除以10,直到变成0。
%10/10count

教材例4-3 题面描述

📋 题目要求

从键盘读入一个整数,统计该数的位数。

以 495 为例:从低位向高位处理

495→49→4→0
当前number number % 10 number / 10 位数
495 5 49 1
49 9 4 2
4 4 0 3

逐位处理的循环模式

取出当前个位

digit = number % 10;

用于得到当前最右边一位。

去掉当前个位

number = number / 10;

整数除法会舍去小数部分。

每循环一次,处理一位数字,同时让 number 更接近0。

用 do-while 统计整数位数

count = 0;

do {
    number = number / 10;
    count++;
} while (number != 0);

即使输入为 0,循环体也会执行一次,因此结果为1位。

为什么输入 0 时更适合 do-while?

while版本

count = 0;
while (number != 0) {
    number = number / 10;
    count++;
}

当 number=0 时,循环一次也不执行。

do-while版本

count = 0;
do {
    number = number / 10;
    count++;
} while (number != 0);

当 number=0 时,也能得到1位。

🤖 AI 协作互动:边界条件推演

我用 do-while 统计整数位数(number = number / 10; count++; while(number!=0);)。当输入 number = 0 或负数时,程序表现如何?请帮我分析 C 语言整数除法的截断规则。

💡 课堂互动:向 AI 提问负数取模/整除表现,并在黑板或终端上验证 -495 / 10 的结果。

统计整数位数:完整程序框架

#include <stdio.h>

int main(void)
{
    int count, number, t_number;

    printf("Enter a number: ");
    scanf("%d", &number);
    t_number = number;

    if (t_number < 0)
        t_number = -t_number;

    count = 0;
    do {
        t_number = t_number / 10;
        count++;
    } while (t_number != 0);

    printf("It contains %d digits.\n", count);
    return 0;
}
教材例4-4
逆序输出整数:
处理模式可以迁移
统计位数与逆序输出使用同一组基本操作。
迁移digit状态更新

教材例4-4 题面描述

📋 题目要求

从键盘读入一个整数,将该整数逆序输出。

任务:将整数逆序输出

输入 12345,输出 5 4 3 2 1

当前number 输出 更新number
12345 12345 % 10 = 5 12345 / 10 = 1234
1234 4 123
123 3 12
12 2 1
1 1 0

整数逆序输出:代码框架

do {
    printf("%d ", number % 10);
    number = number / 10;
} while (number != 0);

循环体

输出当前个位,并去掉当前个位。

循环条件

只要还有剩余数字,就继续处理。

统计位数与逆序输出:共同结构

任务 每轮处理 每轮更新 结束条件
统计位数 count++ number = number / 10 number == 0
逆序输出 printf(number % 10) number = number / 10 number == 0
同一循环骨架可以服务不同任务,关键在于循环体中“处理当前状态”的方式。

🤖 AI 协作互动:解题模式迁移

我已经掌握了用 %10 和 /10 逐位剥离整数的 do-while 模式。请引导我如何把这个逻辑迁移到『判断一个整数是否为水仙花数』或『判断回文数』中?请提供设计思路而非直接给出代码。

💡 课堂互动:利用 AI 提示的“累加立方和/反转拼接”思路,尝试自己口头构思伪代码。

课堂练习:判断循环执行过程

输入

number = 805

问题

  1. 逆序输出是什么?
  2. 循环体执行几次?
  3. 每次 number 的值如何变化?

答案:5 0 8,执行3次,805 → 80 → 8 → 0

交互演示:整数逐位处理可视化

🔢 D04-01B · 整数逐位处理可视化

本演示工具用于直观动态演练 C 语言中整数剥离个位与位数统计的执行过程:

  • 取余与整除动态拆解:输入任意整数,单步展示当前 number、number % 10 与 number / 10 的数值变化。
  • 数字卡片逐位划去:可视化动态划去已处理的个位,直观理解“每次去除一位”的机制。
  • 双模式对比演练:支持“统计位数(计数器累加)”与“逆序输出(个位拼接打印)”两种典型循环模式的交互切换。

本课总结:何时选择 do-while?

至少一次

循环体无论如何都要先执行一次。

先做再问

执行后才知道是否继续。

边界友好

如输入0时统计位数仍应得到1。

循环结构的选择,取决于问题中“判断条件”出现的位置。