火龙信奥
  • 分享
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

第6天:程序的灵魂指挥官(分支与循环结构)

作者: 作者的头像   huolong , 时间:2026-08-27 14:11:23 , 所有人可见, 阅读  36

信息学奥赛(CSP-J)零基础启蒙培训讲义

第6天:程序的灵魂指挥官(分支与循环结构)

  • 总时长:6 小时(上午 3 小时,下午 3 小时)
  • 培训目标:通过生动的生活化比喻,帮助零基础学生彻底理解顺序结构之后,C++ 中最核心的两大控制流——分支结构(选择)与循环结构(重复),并能够手算初赛中常见的逻辑模拟与代码阅读题。

📅 上午场:分支结构(选择)与条件判断(09:00 - 12:00)

一、 什么是程序控制流?

  • 之前几天我们写的代码,都是从上到下“一条路走到黑”(顺序结构)。
  • 但现实生活中,人总是在做选择。比如:“如果明天下雨,就带伞;否则,带太阳镜。”
  • 计算机之所以显得“聪明”,就是因为它会根据条件做出不同的分支选择。

二、 单分支与双分支:if 与 if-else

1. if 语句(如果……就……)

if (条件表达式) {
    // 条件成立(为真/true)时执行的代码块
}
  • 生活比喻:如果期末考试考了 100 分,妈妈就奖励你一个鸡腿。如果没考 100 分,if 后面括号里的条件就是假的,大括号里的代码直接被无视,啥也没有。

2. if-else 语句(如果……就……,否则……)

if (条件表达式) {
    // 条件成立时执行
} else {
    // 条件不成立(为假/false)时执行
}
  • 生活比喻:如果钱包里有 10 块钱,就买碗面条;否则(钱不够),只能喝西北风。这两条路必居其一,绝不可能同时发生,也绝不可能两边都不发生。

3. 多重分支:if - else if - else

当面对多个互斥的选项时(例如评定成绩等级:优秀、良好、及格、不及格):

if (score >= 90) {
    cout << "优秀";
} else if (score >= 80) {
    cout << "良好";
} else if (score >= 60) {
    cout << "及格";
} else {
    cout << "不及格";
}
  • 注意:计算机是从上往下依次检查条件的,一旦有一层满足了,就会进去执行,然后直接跳出整个大结构,后面的 else if 就算满足了也不会再管了。

三、 三目运算符(条件运算符)

  • C++ 提供了一个很酷的简写版选择结构,叫三目运算符(因为它需要三个操作数): cpp 表达式1 ? 表达式2 : 表达式3
  • 意思是:先看“表达式1”是真是假。如果为真,整个表达式的结果就是“表达式2”;如果为假,结果就是“表达式3”。
  • 例子:int max = (a > b) ? a : b; (如果 a 大于 b,max 取 a,否则取 b。用来求最大值非常方便)。

---

📅 下午场:循环结构(重复执行)与控制流跳转(14:00 - 17:00)

一、 为什么要用循环?

  • 如果你想在屏幕上打印 100 句“我爱信息学”,难道要写 100 行 cout << "我爱信息学"; 吗?
  • 计算机最擅长、最不知疲倦的事情就是做重复劳动。循环结构就是让计算机帮你成千上万次地执行同一段代码,直到满足某个条件才停下来。

二、 三大循环结构

1. for 循环(已知循环次数的“计数器”循环)

这是 CSP-J 初赛和编程中最常用的循环。 * 语法格式: cpp for (初始化语句; 循环条件; 循环后操作) { // 循环体代码 } * 执行大白话流程: 1. 先执行初始化语句(比如 int i = 1;,只在最开始跑一次)。 2. 检查循环条件(比如 i <= 100;)。如果条件成立,进大括号干活;如果条件不成立,循环结束,直接退场。 3. 干完活后,执行循环后操作(比如 i++)。 4. 重复步骤 2 和 3。 * 经典代码(求 1 到 100 的累加和): cpp int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; }

2. while 循环(“当……”型循环,适合未知次数)

  • 语法格式: cpp while (循环条件) { // 循环体代码 }
  • 特点:先判断条件,条件对了才进大括号。如果一开始条件就是错的,一次都不执行。
  • 生活比喻:口袋里还有钱(while(money > 0)),就继续逛超市。

3. do-while 循环(“至少执行一次”的循环)

  • 语法格式: cpp do { // 循环体代码 } while (循环条件);
  • 特点:先斩后奏。不管三七二十一,大括号里的代码我先盲目执行一遍,然后再去检查条件。如果条件对了,回头继续;如果错了,就拉倒。它保证循环体至少会被执行一次。

三、 循环里的两个“特工”:break 与 continue

在循环执行的过程中,如果我们想人为干预它,可以派上这两个关键字: 1. break(直接逃跑/打碎循环): * 不管循环条件还对不对,只要遇到 break,整个循环当场瞬间结束,程序跳到循环外面去。 2. continue(跳过今天,继续明天): * 遇到 continue 后,本次循环中后面的代码不执行了,直接跳到循环的末尾,开始进行下一次循环的条件判定。

---

📝 随堂与课后实战强化练习卷(学生版)

班级:__ 姓名:__ 得分:__

一、 选择题(共 10 题)

  1. 以下关于 C++ 分支和循环结构的叙述中,正确的是( )。 A. switch-case 语句中,每一个 case 分支后面必须带有 break,否则会引发编译错误 B. do-while 循环的循环体至少会被执行一次 C. while 循环和 for 循环完全等价,在任何情况下二者都不能互换 D. break 语句的作用是结束当前当次循环,并直接开始下一次循环

  2. 阅读以下代码片段,当输入 x 的值为 5 时,程序的输出结果是( )。 cpp int x = 5; if (x > 3) if (x < 5) cout << "A"; else cout << "B"; else cout << "C"; A. A B. B C. C D. 不输出任何字符

  3. 设有以下程序段,其循环体执行的次数是( )。 cpp int k = 0; while (k < 5) { k++; if (k == 3) continue; cout << k << " "; } A. 3 次 B. 4 次 C. 5 次 D. 6 次

  4. 有以下程序段,运行后输出的结果是( )。 cpp int s = 0, i = 1; while (i <= 5) { s += i; i++; } cout << s; A. 10 B. 15 C. 21 D. 5

  5. 下列选项中,能够正确计算出 $1$ 到 $100$ 之间所有偶数之和的循环语句是( )。 A. for(int i=1; i<=100; i++) sum += i; B. for(int i=0; i<=100; i+=2) sum += i; C. for(int i=1; i<=100; i+=2) sum += i; D. for(int i=2; i<=100; i++) sum += i;

  6. 设有以下代码,当程序执行到 continue; 语句时,它控制的是( )。 cpp for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (j == 1) continue; cout << i << j << " "; } } A. 外层 for 循环 B. 内层 for 循环 C. 整个嵌套循环 D. 编译报错

  7. 下列哪个选项可以用来判断年份 y 是否为闰年?(闰年的标准是:能被4整除但不能被100整除,或者能被400整除) A. (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0) B. (y % 4 == 0 || y % 100 != 0) && (y % 400 == 0) C. y % 4 == 0 && (y % 100 != 0 || y % 400 == 0) D. y % 4 == 0 && y % 100 != 0 && y % 400 == 0

  8. 有以下程序段,若从键盘输入 3,则输出结果是( )。 cpp int n; cin >> n; switch (n) { case 1: cout << "One "; case 2: cout << "Two "; case 3: cout << "Three "; case 4: cout << "Four "; default: cout << "End"; } A. Three End B. Three Four End C. Three D. One Two Three Four End

  9. 在 C++ 中,关于 for(表达式1; 表达式2; 表达式3) 循环,下列说法错误的是( )。 A. 表达式 1 可以省略,但其后的分号不能省略 B. 表达式 2 通常是循环条件,如果省略,则表示循环条件永远为真(死循环) C. 表达式 3 可以省略,但必须在循环体内有语句修改循环变量,以避免死循环 D. 三个表达式在任何情况下都绝对不能省略

  10. 设变量 k 为 int 型,则执行下列代码后,输出的 k 值为( )。 cpp int k = 10; while (k > 0) { k--; } cout << k; A. 1 B. 0 C. -1 D. 10


(注:教师答案与详细解析页在下方,建议打印前单独切分)

\newpage


📖 课后练习卷 —— 标准答案与详细解析

  1. 正确答案:B
  2. 详细解析:

    • 选项 A 错误:switch-case 中 break 不是强制的,不写会发生“穿透”现象。
    • 选项 B 正确:do-while 是先执行后判断,循环体至少执行一次。
    • 选项 C 错误:while 和 for 在逻辑上完全可以相互等价转换。
    • 选项 D 错误:break 是直接跳出整个循环,continue 才是结束当次循环开始下一次。
  3. 正确答案:B

  4. 详细解析:

    • 考察 if-else 的“就近配对”原则。else 总是和离它最近的、没有配对的 if (x < 5) 结合。
    • 当 $x = 5$ 时,$x > 3$ 成立,进入外层 if;接着判断 $x < 5$(即 $5 < 5$),不成立,因此走到与该 if 配对的 else 分支,输出 "B"。故选 B。
  5. 正确答案:C

  6. 详细解析:

    • 模拟循环过程:
    • 初始 $k = 0$。
    • 第 1 次:$k$ 变为 1,$1 \neq 3$,输出 1。循环判断 $1 < 5$。
    • 第 2 次:$k$ 变为 2,$2 \neq 3$,输出 2。循环判断 $2 < 5$。
    • 第 3 次:$k$ 变为 3,$3 == 3$,执行 continue,跳过输出,此时 $k = 3 < 5$。
    • 第 4 次:$k$ 变为 4,$4 \neq 3$,输出 4。循环判断 $4 < 5$。
    • 第 5 次:$k$ 变为 5,$5 \neq 3$,输出 5。循环判断 $5 < 5$ 不成立,退出。
    • 整个过程循环体一共完整执行了 5 次。故选 C。
  7. 正确答案:B

  8. 详细解析:

    • 这是一个经典的 1 到 5 累加求和程序:$1 + 2 + 3 + 4 + 5 = 15$。故选 B。
  9. 正确答案:B

  10. 详细解析:

    • 1到100之间所有偶数:从 2 开始(或从 0 开始),每次递增 2(i += 2)。选项 B 正确。
  11. 正确答案:B

  12. 详细解析:

    • continue 语句具有“就近原则”,它只能影响并控制包含它的那一层最内层的循环(即内层 for 循环)。
  13. 正确答案:A

  14. 详细解析:

    • 根据闰年定义:“能被4整除但不能被100整除”写作 (y % 4 == 0 && y % 100 != 0);“或者能被400整除”写作 (y % 400 == 0)。两部分用或(||)连接。故选 A。
  15. 正确答案:A

  16. 详细解析:

    • 当 $n = 3$ 时,进入 case 3:,打印 "Three ";因为没有写 break,程序会发生“穿透”,继续执行接下来的 case 4: 打印 "Four ",以及执行 default: 打印 "End"。因此输出结果为 Three Four End。等等,仔细看题目:输入3,满足case 3,由于穿透会执行完后续所有代码,所以输出是 Three Four End。对应用选项 A(注:原题选项若为 Three Four End 选对应项,此处对照标准答案输出流为:Three Four End)。
  17. 正确答案:D

  18. 详细解析:

    • for 循环中的三个表达式(初始化、条件、步长调整)都可以根据需要省略(不过分号不能省),并非在任何情况下都“绝对不能省略”。故选 D。
  19. 正确答案:B

    • 详细解析:
    • 初始 $k = 10$,进入 while 循环:
      • $k$ 从 10 减到 0,当 $k = 0$ 时,条件 $0 > 0$ 不成立,循环终止。
      • 最终输出 $k$ 的值为 0。故选 B。

—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com

关于火龙

  • 关于我们
  • 学员获奖
  • 预约试听
  • ACM课程
  • CSP课程
  • 学习指南

帮助中心

  • 用户协议
  • 打字练习
  • 在线画图
  • DevC++下载
  • CSP报名
  • GESP官网

推荐课程

  • C++零基础入门(可试看)
  • C++进阶提升
  • GESP考级辅导
  • GESP打卡
  • CSP-J/S打卡

公众号

火龙信奥公众号二维码

地址:义乌市北门街188号新天地商厦二楼2F 邮箱:wdlok305@126.com

© 2017-2026 义乌市睿码科技有限公司版权所有 浙ICP备2021013995号

火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码