C++魔法代码学院:第 13 课——数据筛选术(循环与判断的协奏曲)

—— 流水线上的质检员与擂台霸主

  • 课时时长:90 分钟
  • 核心目标

    1. 结构掌握:熟练运用 for 循环内部嵌套 if 语句(流水线结构)。
    2. 算法启蒙:掌握 “打擂台”思想(找最大/最小值)。
    3. 数据统计:区分 累加 (sum)计数 (cnt)
    4. 格式魔法:学会用 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; (计数器,存数量)—— *注:竞赛常习惯用 cntans*
    • 强调:如果不清零,箱子里原本就有灰尘(垃圾值),结果就不对了!
  • 代码实现

    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 个人同时排成一排(电脑内存有限,一次只能看一个)。
    • 打擂台规则
      1. 先假设第一个人是“擂主”(当前最高)。
      2. 第二个人上来,和擂主比。如果比擂主高,把擂主踢下去,自己当擂主
      3. 如果比擂主矮,擂主不变,下一个人继续。
      4. 比完所有人,最后站在台上的就是最高的。
  • 代码带练

    • 输入 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分钟)

  • 题目:输入一个整数 ,输入 个同学的身高。

    1. 输出最高的身高。
    2. 输出平均身高(保留 2 位小数)。
  • 思路串联

    • 变量:n, height, max_h, sum
    • 循环:forn 次。
    • 内部:cin >> height -> 打擂台更新 max_h -> 累加 sum
    • 结束:计算 sum / n (记得 1.0*) -> printf 输出。

6. 总结与避坑 (5分钟)

  • 初始化sum=0, cnt=0, max=-1
  • 擂台法:记住“谁赢谁留下”。
  • 小数陷阱:整数除法要乘 1.0,保留小数用 printf("%.2f")

课后作业:数据分析师

  1. 找最小值:输入 10 个数字,找出最小的那个数。(提示:初始擂主 min_val 要设大一点,比如 10000)。
  2. 及格率统计

    • 输入 5 个分数。
    • 统计 >= 60 分的人数。
    • 输出及格的人数。
  3. 工资计算器

    • 输入 3 个工人的工资(可能有小数)。
    • 计算总工资,保留 1 位小数输出(%.1f)。

给教练的建议

  • 关于 printf:只需要教 %d%.2f 即可,不要展开讲 %5d 这种对齐格式,除非真题遇到了。对于小学生,printf 是“背诵内容”,告诉他们这叫“格式化咒语”。
  • 关于打擂台初始值
    • 找最大值:初始值设为极小(如 -1 或 0)。
    • 找最小值:初始值设为极大(如 10000)。
    • 或者教一个更通用的方法:第一个人直接当擂主(循环外先 cin 一个,或者循环里特判 i==1)。对于三年级,设 0 或 10000 更容易理解。