信息学奥赛(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 题)
-
以下关于 C++ 分支和循环结构的叙述中,正确的是( )。 A.
switch-case语句中,每一个case分支后面必须带有break,否则会引发编译错误 B.do-while循环的循环体至少会被执行一次 C.while循环和for循环完全等价,在任何情况下二者都不能互换 D.break语句的作用是结束当前当次循环,并直接开始下一次循环 -
阅读以下代码片段,当输入
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. 不输出任何字符 -
设有以下程序段,其循环体执行的次数是( )。
cpp int k = 0; while (k < 5) { k++; if (k == 3) continue; cout << k << " "; }A. 3 次 B. 4 次 C. 5 次 D. 6 次 -
有以下程序段,运行后输出的结果是( )。
cpp int s = 0, i = 1; while (i <= 5) { s += i; i++; } cout << s;A. 10 B. 15 C. 21 D. 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; -
设有以下代码,当程序执行到
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. 编译报错 -
下列哪个选项可以用来判断年份
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 -
有以下程序段,若从键盘输入
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 EndB.Three Four EndC.ThreeD.One Two Three Four End -
在 C++ 中,关于
for(表达式1; 表达式2; 表达式3)循环,下列说法错误的是( )。 A. 表达式 1 可以省略,但其后的分号不能省略 B. 表达式 2 通常是循环条件,如果省略,则表示循环条件永远为真(死循环) C. 表达式 3 可以省略,但必须在循环体内有语句修改循环变量,以避免死循环 D. 三个表达式在任何情况下都绝对不能省略 -
设变量
k为int型,则执行下列代码后,输出的k值为( )。cpp int k = 10; while (k > 0) { k--; } cout << k;A. 1 B. 0 C. -1 D. 10
(注:教师答案与详细解析页在下方,建议打印前单独切分)
\newpage
📖 课后练习卷 —— 标准答案与详细解析
- 正确答案:B
-
详细解析:
- 选项 A 错误:
switch-case中break不是强制的,不写会发生“穿透”现象。 - 选项 B 正确:
do-while是先执行后判断,循环体至少执行一次。 - 选项 C 错误:
while和for在逻辑上完全可以相互等价转换。 - 选项 D 错误:
break是直接跳出整个循环,continue才是结束当次循环开始下一次。
- 选项 A 错误:
-
正确答案:B
-
详细解析:
- 考察
if-else的“就近配对”原则。else总是和离它最近的、没有配对的if (x < 5)结合。 - 当 $x = 5$ 时,$x > 3$ 成立,进入外层
if;接着判断 $x < 5$(即 $5 < 5$),不成立,因此走到与该if配对的else分支,输出"B"。故选 B。
- 考察
-
正确答案:C
-
详细解析:
- 模拟循环过程:
- 初始 $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。
-
正确答案:B
-
详细解析:
- 这是一个经典的 1 到 5 累加求和程序:$1 + 2 + 3 + 4 + 5 = 15$。故选 B。
-
正确答案:B
-
详细解析:
- 1到100之间所有偶数:从 2 开始(或从 0 开始),每次递增 2(
i += 2)。选项 B 正确。
- 1到100之间所有偶数:从 2 开始(或从 0 开始),每次递增 2(
-
正确答案:B
-
详细解析:
continue语句具有“就近原则”,它只能影响并控制包含它的那一层最内层的循环(即内层for循环)。
-
正确答案:A
-
详细解析:
- 根据闰年定义:“能被4整除但不能被100整除”写作
(y % 4 == 0 && y % 100 != 0);“或者能被400整除”写作(y % 400 == 0)。两部分用或(||)连接。故选 A。
- 根据闰年定义:“能被4整除但不能被100整除”写作
-
正确答案:A
-
详细解析:
- 当 $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)。
- 当 $n = 3$ 时,进入
-
正确答案:D
-
详细解析:
for循环中的三个表达式(初始化、条件、步长调整)都可以根据需要省略(不过分号不能省),并非在任何情况下都“绝对不能省略”。故选 D。
-
正确答案:B
- 详细解析:
- 初始 $k = 10$,进入
while循环:- $k$ 从 10 减到 0,当 $k = 0$ 时,条件 $0 > 0$ 不成立,循环终止。
- 最终输出 $k$ 的值为
0。故选 B。
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com