C++魔法代码学院:第 5 课——特殊的余数(取模运算)
—— 寻找被除法丢弃的宝藏
- 课时时长:90 分钟
-
核心目标:
- 理解 取模
%就是求余数。 -
掌握
%的两大核心用途:- 周期侦探:判断奇偶(
% 2)、星期计算(% 7)。 - 数字手术刀:提取数字的个位(
% 10)。
- 周期侦探:判断奇偶(
-
难点攻克:综合运用
/和%进行多位数的数位分离(GESP 必考)。
- 理解 取模
-
所需教具:10 个苹果(或糖果),3 个盘子。
课程时间表
| 环节 | 时间 | 内容 | 教学隐喻/活动 |
|---|---|---|---|
| 复习 | 10 min | 整数除法的“去尾” | “除法之刀”的回顾 |
| 概念 | 15 min | 认识取模符号 % |
分苹果游戏(实物演示) |
| 应用 A | 15 min | 周期侦探(奇偶与星期) | 0和1的秘密暗号 |
| 核心 | 25 min | 数位分离术(个十百) | “砍头去尾法” |
| 实战 | 15 min | 编写“倒序输出器” | 输入123,输出3 2 1 |
| 总结 | 10 min | 总结与技巧 | / 和 % 的组合拳 |
详细教学流程
1. 复习:除法之刀 (10 min)
- 提问:
cout << 10 / 3;输出几?(答案:3)。 - 追问:我们在数学课上算出 。上节课我们说 C++ 的除法很无情,把余数
1扔进了垃圾桶。 - 引入:今天我们要去垃圾桶里,把这个被丢掉的
1捡回来!因为它是开启宝箱的钥匙。
2. 概念:分苹果与百分号 (15 min)
-
符号介绍:
- 它的名字叫 “取模” (Mod),符号是
%。 - 注意:虽然它长得像百分号,但在代码里它跟 100% 没有任何关系!它是“求余数”的意思。
- 它的名字叫 “取模” (Mod),符号是
-
实物演示:分苹果
- 拿出 10 个苹果,请 3 位同学上来。
- 规则:必须平均分,不能切开。
- 过程:每人拿 1 个...每人拿 2 个...每人拿 3 个。
- 现状:手里还剩 1 个。分不下去了。
- 结论:
10 / 3的结果是 3 (每人手里的)。10 % 3的结果是 1 (老师手里剩下的)。
-
代码体验:
cout << 10 % 3 << endl; // 输出 1 cout << 5 % 2 << endl; // 输出 1 cout << 4 % 2 << endl; // 输出 0 (没有余数就是 0)
3. 应用 A:周期侦探 (15 min)
-
侦探任务 1:奇数还是偶数?
-
规则:任何整数,只要被 2 除,余数只有两种情况。
- 余数是 0 -> 偶数(双数)。
- 余数是 1 -> 奇数(单数)。
-
代码口诀:
n % 2是判断奇偶的照妖镜。
-
-
侦探任务 2:今天是星期几?
- 提问:如果今天是星期三,过了 7 天是星期几?(还是星期三)。
- 原理:世界是转圈圈的,每 7 天转一圈。
-
计算:
- 过了 10 天是星期几?
- \(10 \div 7 = 1\) 圈 ... 余 3 天。
- 所以是星期三 + 3天 = 星期六。
-
代码:
future_day = (today + days) % 7;(注:此处简单带过逻辑即可,不需深究代码细节)。
4. 核心:数字手术刀——数位分离 (25 min) <-- GESP 必考重难点
- 任务:输入一个三位数
123,我们要把1,2,3分别拆出来存到变量里。 - 难点:电脑不认识“个位”,它只认识数字。
-
工具介绍:
- 工具 A:
% 10(取尾刀) —— 专门切下最后一位。 - 工具 B:
/ 10(砍头刀) —— 专门砍掉最后一位。
- 工具 A:
-
手术步骤(板书演示
123):-
取个位:
- 用
% 10。 123 % 10= 3 (余数就是个位)。- 口诀:模 10 得到小尾巴。
- 用
-
准备取十位(先砍一刀):
- 3 已经被取走了,我们想把 123 变成 12。
- 用
/ 10。 123 / 10= 12 (整数除法,3 被砍掉了)。
-
取十位(也就是现在的个位):
- 对着剩下的
12再用% 10。 12 % 10= 2。
- 对着剩下的
-
取百位:
- 再砍一刀:
12 / 10= 1。 1 % 10= 1 (或者直接用剩下的 1)。
- 再砍一刀:
-
5. 实战:倒序输出器 (15 min)
- 题目:输入一个三位数(如 582),请输出 285。
-
代码带练:
int n; cout << "请输入一个三位数: "; cin >> n; // 假设输入 582 int g = n % 10; // 个位:582 % 10 = 2 int s = (n / 10) % 10; // 十位:582 / 10 = 58; 58 % 10 = 8 int b = n / 100; // 百位:582 / 100 = 5 // 输出 cout << g << " " << s << " " << b << endl; -
注意:中间的
s最难理解,可以拆成两步写:int temp = n / 10; int s = temp % 10;。
6. 总结与技巧 (10 min)
-
知识点回顾:
%是求余数。% 2用来分奇偶。% 10用来拿个位。/ 10用来丢个位。
-
避坑:
- 小数不能取模!
3.5 % 2会报错。%只能用于整数。 - 不要对 0 取模(
n % 0),虽然数学上没意义,代码里会报错。
- 小数不能取模!
课后作业:密码破解员
-
基础题:
- 输入一个整数,输出它除以 5 的余数。
-
核心题(数位求和):
- 输入一个三位数(例如
123)。 - 计算各位数字之和(
1 + 2 + 3 = 6)。 - 输出这个和。
- 输入一个三位数(例如
-
挑战题(倒序数字算术):
- 输入
123。 - 让电脑通过计算生成一个新的数字
321(注意:不是打印三个字符,而是生成一个整数变量)。 - 提示:
个位 * 100 + 十位 * 10 + 百位。
- 输入
给教练的教学话术建议
- 关于
%的读法:建议直接读“模”(mó),或者通俗点读“求余”。不要读“百分号”,以免和格式化输出混淆。 -
关于数位分离:这是 3-5 年级孩子遇到的第一个逻辑门槛。建议用积木或乐高演示:
123是三块积木连在一起。/ 10是把最后一块掰掉扔垃圾桶。% 10是只把最后一块拿在手里看一看,主体还在。
-
互动游戏:报数游戏。全班从 1 开始报数,遇到
7的倍数或者个位是7的数(n % 7 == 0或n % 10 == 7)就拍手。这是 GESP 经典的“逢七过”逻辑,虽然还没学if,但可以先建立这种数学直觉。