C++魔法代码学院:第 10 课——累加器的秘密(for 循环应用)

2026-01-20
44

—— 打造自动存钱罐与计数器

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

    1. 理解 累加(Summation):在循环中不断把新数值加到总和变量里。
    2. 理解 计数(Counting):统计满足特定条件的数字个数。
    3. 核心难点:理解 sum = sum + i 的动态过程,以及必须初始化为 0 的重要性。
    4. 实战:复现高斯的数学奇迹(1加到100)和寻找倍数。
  • 所需教具:一个透明的空罐子(存钱罐),一把硬币(或写着数字的纸片),一个手持计数器(或用正字代替)。

课程时间表

环节 时间 内容 教学隐喻/活动
复习 10 min for 循环基础 “倒计时火箭”重演
引入 15 min 高斯的故事 天才少年的速算
新知 25 min 累加器原理 (sum) “透明存钱罐”演示
应用 15 min 累加实战 1 加到 100 的代码实现
进阶 15 min 计数器原理 (count) “挑出 7 的倍数”
总结 10 min 总结与避坑 垃圾值陷阱

详细教学流程

1. 复习:火箭发射 (10分钟)

  • 快速编程:请全班同学写出一个从 10 倒数到 1 的 for 循环。
  • 检查点
    • 循环变量 int i = 10
    • 条件 i >= 1(注意是大于等于)。
    • 步进 i--

2. 引入:高斯的智慧 (15分钟)

  • 故事时间

    • 200多年前,德国有个小学生叫高斯。老师想偷懒,出了一道题:“把 1 到 100 的所有数字加起来,算不出来不许回家!”
    • 别的同学都在辛苦地 算得满头大汗。
    • 高斯用了“首尾相加法”:,瞬间解题。
  • 编程思维

    • 电脑比高斯笨,它不会公式。
    • 但电脑算得快!它用的就是笨办法——硬加。今天我们就来教电脑做这个“笨办法”。

3. 新知:透明存钱罐——累加器 (25分钟)

  • 概念隐喻

    • 我们需要一个变量来存总和,我们叫它 sum (存钱罐)
    • for 循环的 i 就像是每天发给你的零花钱。
    • 第一天 i=1,第二天 i=2... 第100天 i=100
    • 每天的动作:把今天的钱 (i) 扔进存钱罐 (sum) 里。
  • 关键步骤(板书演示)

    1. 买个新罐子(初始化)

      • int sum = 0;
      • 强调:必须设为 0!如果买来罐子里就有假币(垃圾值),最后算出来的钱就不对啦!
    2. 每天存钱(循环体)

      • sum = sum + i;
      • 解读:新的存款 = 旧的存款 + 今天的钱。
      • 简写sum += i; (C++ 常用简写,像把钱“哗啦”倒进去)。
  • 人肉模拟(Trace Table)

    • 画表格,带着学生走前几步:

      圈数 (i) 这一圈加多少 存钱罐现在的钱 (sum)
      开始前 - 0
      i = 1 +1 0 + 1 = 1
      i = 2 +2 1 + 2 = 3
      i = 3 +3 3 + 3 = 6
      ... ... ...

4. 应用:代码复现高斯奇迹 (15分钟)

  • 任务:计算 \(1 + 2 + 3 + ... + 100\)
  • 代码带练

    int main() {
            int sum = 0; // 1. 准备空罐子
    
            for (int i = 1; i <= 100; i++) {
                    sum = sum + i; // 2. 每天往里丢钱
                    // 可以在这里 cout << sum << endl; 看看过程,但不建议,因为会刷屏
            }
    
            cout << "高斯的答案是: " << sum << endl; // 3. 最后砸开罐子看结果
            return 0;
    }
    

  • 易错点cout 必须写在循环的花括号外面

    • 比喻:存完 100 天再去银行查余额,不要存一块钱就查一次,银行柜员会烦死的。

5. 进阶:挑剔的计数器 (15分钟)

  • 场景切换

    • 现在不是要把数字加起来,而是要数数
    • 任务:在 1 到 100 之间,有多少个数字是 7 的倍数?
  • 工具隐喻

    • 这次需要的不是存钱罐,而是一个“计数器”(像体育老师按的那种,或者画“正”字)。
    • 变量名通常叫 count (计数)。
    • 初始值也要是 0:int count = 0;
  • 逻辑构建

    1. 循环从 1 跑到 100。
    2. 每次跑过一个数字 i,先用 if 检查:i % 7 == 0 吗?
    3. 如果是,计数器按一下:count = count + 1; (或 count++)。
    4. 如果不是,什么都不做。
  • 代码实现

    int count = 0; // 计数器归零
    for (int i = 1; i <= 100; i++) {
            if (i % 7 == 0) {
                    count++; // 发现一个,记一笔
            }
    }
    cout << "7的倍数共有: " << count << " 个";
    

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

  • 累加 vs 计数

    • 累加 (sum += i):加的是数字本身(钱的面额)。
    • 计数 (count++):加的是 1(不管钱多大,只算一张纸)。
  • 坑王之王——未初始化

    • 演示错误代码:int sum; (不赋值 0)。
    • 直接运行 sum += i
    • 结果可能是个奇怪的天文数字。
    • 解释:因为没清洗罐子,里面有上次留下的垃圾!

课后作业:小会计师

  1. 基础题:计算 1 到 10 之间所有偶数的和。(答案应该是\(2+4+6+8+10 = 30\) )。
  2. 应用题(阶乘初步)

    • 计算 \(1 \times 2 \times 3 \times ... \times 10\)
    • 提示:这次是“累乘器”。初始值能设为 0 吗?(0 乘任何数都是 0,初始值必须是 1!)。
  3. 挑战题(水仙花数铺垫)

    • 统计 1 到 100 之间,有多少个数字个位是 3
    • 提示:使用 i % 10 == 3 配合计数器。

给教练的教学话术建议

  • 关于 sum 的位置:初学者最容易把 int sum = 0; 写在 for 循环里面。

    • 后果:每次循环开始,sum 都被清零了,最后结果只能是 100。
    • 纠正:告诉学生,“存钱罐要放在跑道外面,不能抱着存钱罐跑步,跑一圈摔碎一个!”
  • 关于 Trace Table(人肉模拟):这节课强烈建议要在黑板上画表,带着学生一步步算。这是培养逻辑思维最扎实的方法,虽然慢,但对理解算法至关重要。