C Day 15

先让菜单出现,
再由输入决定下一轮

今天学习 do ... while,把输入、switch 与循环组合成可以重复运行的菜单,并通过多组输入验证继续、无效选项与退出路线。

while 先检查,do ... while 先执行

两个循环都让变量从 10 开始,并使用不大于 5 的条件。while 第一次检查就失败,所以循环体执行 0 次;do ... while 会先执行一次,再检查条件。

day15.c
int while_number = 10;

while (while_number <= 5)
{
    printf("while_number = %d\n", while_number);
    while_number++;
}

int do_number = 10;

do
{
    printf("do_number = %d\n", do_number);
    do_number++;
} while (do_number <= 5);

实际没有输出 while_number = 10,但输出了一次 do_number = 10。即使初始值换成 18 或其他不满足条件的数,do 循环体仍会先执行一次。

末尾条件之后必须写分号

do ... while 的条件位于循环体之后,完整结尾是 } while (条件);。这里的分号属于这条循环语句,不能遗漏。

让用户输入控制菜单是否重复

菜单先显示选项,再用 scanf_s() 把输入保存到 choiceswitch 负责选择功能,末尾的 while (choice != 0) 决定是否重新显示菜单。

day15.c
int choice = 0;

do
{
    printf("1. 打招呼\n");
    printf("2. 显示学习状态\n");
    printf("3. 显示明日安排\n");
    printf("0. 退出\n");
    scanf_s("%d", &choice);

    switch (choice)
    {
    case 1:
        printf("你好,欢迎继续学习 C 语言!\n");
        break;
    case 2:
        printf("正在学习 do while 循环\n");
        break;
    case 3:
        printf("明天进行第二次 C 语言阶段检测\n");
        break;
    case 0:
        printf("正在退出菜单\n");
        break;
    default:
        printf("无效选项\n");
        break;
    }
} while (choice != 0);

分清 switch 与循环的两层控制

每个 case 中的 break 只结束当前 switch,不会直接结束外面的 do ... while。例如输入 1 后,打招呼分支结束,但 1 != 0 成立,所以菜单继续。

输入 0 时,程序先进入 case 0 输出退出提示;离开 switch 后,0 != 0 不成立,循环才真正结束。

独立扩展选项并修正 case 穿透

菜单原本只有选项 1、2 和 0,后来独立增加选项 3“显示明日安排”。第一次在 case 3 后漏写 break,会继续执行 case 0 的退出提示;补上 break 后,输入 3 只显示阶段检测安排,菜单仍会继续。

实际完成三组测试:输入 1、2、0 验证正常功能与退出;输入 8、0 验证 default 后菜单继续;输入 3、0 验证新增分支不再穿透。所有测试均正常退出,代码为 0。

今天真正掌握的内容

  • 会比较 whiledo ... while 的条件检查顺序
  • 理解 do ... while 至少执行一次
  • 记住末尾 while (条件); 的分号
  • 会用用户输入控制菜单是否重复
  • 能区分 switchbreak 与外层循环条件
  • 会测试正常选项、无效选项、退出选项与 case 穿透

下一步是 C 语言第 16 天第二次阶段复习与检测,范围为 C Day 9—15,不引入新语法。