C++魔法代码学院:第 10 课——累加器的秘密(for 循环应用)
—— 打造自动存钱罐与计数器
- 课时时长:90 分钟
-
核心目标:
- 理解 累加(Summation):在循环中不断把新数值加到总和变量里。
- 理解 计数(Counting):统计满足特定条件的数字个数。
- 核心难点:理解
sum = sum + i的动态过程,以及必须初始化为 0 的重要性。 - 实战:复现高斯的数学奇迹(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) 里。
- 我们需要一个变量来存总和,我们叫它
-
关键步骤(板书演示):
-
买个新罐子(初始化):
int sum = 0;- 强调:必须设为 0!如果买来罐子里就有假币(垃圾值),最后算出来的钱就不对啦!
-
每天存钱(循环体):
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 跑到 100。
- 每次跑过一个数字
i,先用if检查:i % 7 == 0吗? - 如果是,计数器按一下:
count = count + 1;(或count++)。 - 如果不是,什么都不做。
-
代码实现:
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 到 10 之间所有偶数的和。(答案应该是\(2+4+6+8+10 = 30\) )。
-
应用题(阶乘初步):
- 计算 \(1 \times 2 \times 3 \times ... \times 10\) 。
- 提示:这次是“累乘器”。初始值能设为 0 吗?(0 乘任何数都是 0,初始值必须是 1!)。
-
挑战题(水仙花数铺垫):
- 统计 1 到 100 之间,有多少个数字个位是 3?
- 提示:使用
i % 10 == 3配合计数器。
给教练的教学话术建议
-
关于
sum的位置:初学者最容易把int sum = 0;写在for循环里面。- 后果:每次循环开始,
sum都被清零了,最后结果只能是 100。 - 纠正:告诉学生,“存钱罐要放在跑道外面,不能抱着存钱罐跑步,跑一圈摔碎一个!”
- 后果:每次循环开始,
-
关于 Trace Table(人肉模拟):这节课强烈建议要在黑板上画表,带着学生一步步算。这是培养逻辑思维最扎实的方法,虽然慢,但对理解算法至关重要。