C++魔法代码学院:第 13 课——数据筛选术(循环与判断的协奏曲)
—— 流水线上的质检员与擂台霸主
- 课时时长:90 分钟
-
核心目标:
- 结构掌握:熟练运用
for循环内部嵌套if语句(流水线结构)。 - 算法启蒙:掌握 “打擂台”思想(找最大/最小值)。
- 数据统计:区分 累加 (
sum) 与 计数 (cnt)。 - 格式魔法:学会用
printf保留两位小数(GESP 必杀技)。
- 结构掌握:熟练运用
-
所需教具:一个空盒子(擂台),一堆写着数字的卡片,一个“质检员”袖标。
课程时间表
| 环节 | 时间 | 内容 | 教学隐喻/活动 |
|---|---|---|---|
| 引入 | 10 min | 流水线工作原理 | “传送带与质检员” |
| 核心 | 20 min | 筛选与统计 (Loop+If) | “倍数大搜查” |
| 重点 | 25 min | 最值算法 (Max) | “比武打擂台” |
| 技巧 | 15 min | 格式化输出 (printf) |
“精准的尺子” |
| 实战 | 15 min | GESP 真题演练 | 综合应用 |
| 总结 | 5 min | 避坑指南 | 初始化与输出位置 |
详细教学流程
1. 引入:流水线质检员 (10分钟)
-
场景演示:
- 老师扮演传送带 (
for),不断递过来一张张数字卡片。 - 学生扮演质检员 (
if)。 - 规则:只要偶数。
- 流程:卡片 3 -> 质检员:“不要”,扔掉。 -> 卡片 4 -> 质检员:“合格”,装箱。
- 老师扮演传送带 (
-
代码映射:
for是传送带,负责把数据一个一个送过来。if是机械臂,负责把符合条件的数据抓出来。
2. 核心:倍数大搜查——Sum vs Count (20分钟)
- 任务:输入 ,找出 1 到 之间所有 3 的倍数,计算它们的和以及个数。
-
变量准备:
int sum = 0;(存钱罐,存总金额)int cnt = 0;(计数器,存数量)—— *注:竞赛常习惯用cnt或ans*。- 强调:如果不清零,箱子里原本就有灰尘(垃圾值),结果就不对了!
-
代码实现:
for (int i = 1; i <= n; i++) { if (i % 3 == 0) { // 质检员:是3的倍数吗? cout << i << " "; // 1. 打印出来 sum += i; // 2. 累加(数值加进去) cnt++; // 3. 计数(数量加1) } } -
易错点回顾(话痨鹦鹉):
- 问学生:
cout << "总和是" << sum;应该写在}里面还是外面? - 回答:外面!等质检员下班了再汇报工作。
- 问学生:
3. 重点:谁是擂主?——打擂台算法 (25分钟) <-- 核心算法升级
-
场景隐喻:
- 我们要从 5 个同学里找出最高的。我们不需要把 5 个人同时排成一排(电脑内存有限,一次只能看一个)。
- 打擂台规则:
- 先假设第一个人是“擂主”(当前最高)。
- 第二个人上来,和擂主比。如果比擂主高,把擂主踢下去,自己当擂主。
- 如果比擂主矮,擂主不变,下一个人继续。
- 比完所有人,最后站在台上的就是最高的。
-
代码带练:
- 输入 5 个成绩,输出最高分。
int max_score = -1; // 1. 设一个很小的数当初始擂主(或者 0) int score; for (int i = 1; i <= 5; i++) { cin >> score; // 挑战者上台 if (score > max_score) { // 挑战成功了吗? max_score = score; // 踢馆成功!新擂主诞生 } } cout << max_score; -
思考:如果要找最低分 (
min_score) 怎么办?(初始擂主设为一个很大的数,或者第一个输入的数)。
4. 技巧:精准的尺子——printf (15分钟) <-- 考试提分点
- 痛点:
cout输出两位小数太麻烦了 (cout << fixed << setprecision(2) << x;),小学生根本背不下来。 -
新工具:
printf(Print Format)- 它是 C 语言的老前辈,非常精准。
- 语法:
printf("格式模板", 变量);
-
常用占位符(坑位):
%d:给整数占座。%f:给小数占座。%.2f:保留 2 位小数(重点背诵)。
-
演示:
double avg = 10.0 / 3.0; // cout 输出:3.33333 printf("%.2f", avg); // 输出:3.33 (自动四舍五入)
5. 实战:GESP 模拟题 (15分钟)
-
题目:输入一个整数 ,输入 个同学的身高。
- 输出最高的身高。
- 输出平均身高(保留 2 位小数)。
-
思路串联:
- 变量:
n,height,max_h,sum。 - 循环:
for跑n次。 - 内部:
cin >> height-> 打擂台更新max_h-> 累加sum。 - 结束:计算
sum / n(记得1.0*) ->printf输出。
- 变量:
6. 总结与避坑 (5分钟)
- 初始化:
sum=0,cnt=0,max=-1。 - 擂台法:记住“谁赢谁留下”。
- 小数陷阱:整数除法要乘
1.0,保留小数用printf("%.2f")。
课后作业:数据分析师
- 找最小值:输入 10 个数字,找出最小的那个数。(提示:初始擂主
min_val要设大一点,比如 10000)。 -
及格率统计:
- 输入 5 个分数。
- 统计 >= 60 分的人数。
- 输出及格的人数。
-
工资计算器:
- 输入 3 个工人的工资(可能有小数)。
- 计算总工资,保留 1 位小数输出(
%.1f)。
给教练的建议
- 关于
printf:只需要教%d和%.2f即可,不要展开讲%5d这种对齐格式,除非真题遇到了。对于小学生,printf是“背诵内容”,告诉他们这叫“格式化咒语”。 - 关于打擂台初始值:
- 找最大值:初始值设为极小(如 -1 或 0)。
- 找最小值:初始值设为极大(如 10000)。
- 或者教一个更通用的方法:第一个人直接当擂主(循环外先
cin一个,或者循环里特判i==1)。对于三年级,设 0 或 10000 更容易理解。