C++魔法代码学院:第 3 课——神奇的计算器
—— 驯服数学符号与精度魔法
- 课时时长:90 分钟
-
核心目标:
- 掌握 C++ 的四则运算符号:
+-*/。 - 核心痛点:理解
int除法的“去尾”特性(5/2=2)。 - 核心升级:掌握
double(双精度浮点型),学会存储小数(如 )。 - 难点突破:学会用
1.0 * a的魔法把整数运算变成小数运算。
- 掌握 C++ 的四则运算符号:
-
所需教具:一个漏水的网兜(代表 int),一个密封的玻璃杯(代表 double),3 个苹果。
课程时间表
| 环节 | 时间 | 内容 | 教学隐喻/活动 |
|---|---|---|---|
| 复习 | 10 min | 变量与类型回顾 | “给数据找房子”复习 |
| 新知 | 15 min | 运算符号与整数除法坑 | 键盘符号与“去尾刀” |
| 转折 | 20 min | 引入 double 类型 |
圆面积计算战役 |
| 核心 | 25 min | 类型转换 (Int to Double) | “魔法药水 1.0” |
| 挑战 | 10 min | 混合运算应用 | 编写“精确除法器” |
| 总结 | 10 min | 总结与作业 | 整数 vs 小数 |
详细教学流程
1. 复习:给数据找房子 (10分钟)
- 提问:上节课我们学了两种房子,
int住谁?char住谁? - 互动:
- 老师:数字 100! -> 学生:住
int! - 老师:字母 'K'! -> 学生:住
char! - 老师:小数 3.14! -> 学生:......没地方住?
- 老师:数字 100! -> 学生:住
2. 新知:运算符号与整数的固执 (15分钟)
-
符号速通:
+-:老朋友。*:星号(Shift+8)。/:斜杠(切刀)。
-
演示“惨案”:
- 老师:“我想算 5 除以 2。”
- 代码:
cout << 5 / 2; - 结果:2。
-
原理解析:
- 隐喻:
int是个“网兜”。它只能装完整的苹果(整数)。如果你把苹果切碎了(变成小数),果汁(小数点后的部分)就会从网眼里漏掉! - 结论:在整数王国,
5/2不是 2.5,而是 2(直接砍掉尾巴,不四舍五入)。
- 隐喻:
3. 转折:救星降临——Double 类型 (20分钟)
- 引入:如果要计算圆的面积,公式是 \(S = 3.14 \times r \times r\) 。
-
错误示范:
int pi = 3.14; cout << pi; // 输出 3- 讲解:把 3.14 硬塞进
int网兜,.14漏掉了,变成了3。这样算出来的面积是错的!
- 讲解:把 3.14 硬塞进
-
新英雄登场:
double(双精度浮点型)。- 隐喻:
double是一个“密封的高级玻璃杯”。它不仅能装整数,还能完美锁住小数点后的每一滴水。 - 单词记忆:Double = 双倍。它比
int厉害,能装更精确的东西。
- 隐喻:
-
实战:圆面积计算器
double pi = 3.14; // 必须用 double int r = 10; // 半径可以是整数 // 只要算式里有 double,结果就会自动变成 double double area = pi * r * r; cout << "圆的面积是: " << area << endl; // 输出 314
4. 核心:魔法药水 1.0 (25分钟)
-
场景:
- “老师,我有两个整数变量
int a = 5; int b = 2;。” - “我想算出 2.5,但我不能把
a和b改成double(因为题目规定输入是整数)。” - 直接写
a / b还是等于 2,怎么办?
- “老师,我有两个整数变量
-
魔法道具:
1.0- 规则:在 C++ 里,整数和整数打架,结果还是整数。但只要有一个是小数,结果就是小数。
- 策略:我们派一个“卧底”混进去。
- 代码对比:
cout << a / b;-> 2 (两块石头撞击)cout << 1.0 * a / b;-> 2.5 (魔法生效!)
-
原理:
1.0是一个double。当电脑看到1.0 * a时,它会先把a变成小数5.0,然后再除以2,最后得到2.5。 - 备选方案(强制转换):
- 也可以写
(double)a / b。但这像咒语,不如1.0 *好记。建议先教1.0 *。
- 也可以写
5. 挑战:精确除法器 (10分钟)
- 任务:输入两个整数,输出它们的商(保留小数)。
- 代码带练:
int a, b; cout << "请输入两个数字: "; cin >> a >> b; // 坑:不能写 double result = a / b; (因为 a/b 算完已经是整数了) // 必须在计算过程中就变身 double result = 1.0 * a / b; cout << "精确结果是: " << result << endl;
6. 总结与作业 (10分钟)
- 避坑指南:
- 想要小数?定义变量用
double。 - 两个
int相除想要小数?记得乘1.0。 int pi = 3.14是大忌!
- 想要小数?定义变量用
课后作业:小小数学家
-
基础题:
- 定义
double height = 1.75;(身高) - 定义
double weight = 65.5;(体重) - 输出它们。
- 定义
-
应用题(温度转换):
- 公式:\(C = (F - 32) \times 5 / 9\)。
- 输入一个华氏度
int F。 - 输出摄氏度
C。 - 陷阱提示:直接乘
5/9会变成0(因为 5/9 是整数除法)。请用5.0 / 9试试看?
-
思考题:
10 / 3 * 3.0等于多少?(答案是 9.0,因为 10/3 先算成 3)。10.0 / 3 * 3等于多少?(答案是 10.0,因为 10.0/3 是 3.333...)。- 这种顺序差异体现了“运算类型”的重要性。
给教练的教学话术建议
- 关于
float:如果有学生问float,可以告诉他:“float是小杯子,double是大杯子。为了防止水溢出来(精度不够),我们统统用大杯子double。” - 关于
1.0的位置:建议教学生把1.0 *放在最前面。例如1.0 * a / b。如果放在后面a / b * 1.0,电脑会先算a/b(已经截断了),再乘 1.0 就晚了!这是一个非常好的 Debug 教学点。