C++魔法代码学院:第 3 课——神奇的计算器

2026-01-18
130

—— 驯服数学符号与精度魔法

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

    1. 掌握 C++ 的四则运算符号:+ - * /
    2. 核心痛点:理解 int 除法的“去尾”特性(5/2=2)。
    3. 核心升级:掌握 double (双精度浮点型),学会存储小数(如 )。
    4. 难点突破:学会用 1.0 * a 的魔法把整数运算变成小数运算。
  • 所需教具:一个漏水的网兜(代表 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! -> 学生:......没地方住?

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。这样算出来的面积是错的!
  • 新英雄登场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,但我不能把 ab 改成 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分钟)

  • 避坑指南
    1. 想要小数?定义变量用 double
    2. 两个 int 相除想要小数?记得乘 1.0
    3. int pi = 3.14 是大忌!

课后作业:小小数学家

  1. 基础题

    • 定义 double height = 1.75; (身高)
    • 定义 double weight = 65.5; (体重)
    • 输出它们。
  2. 应用题(温度转换)

    • 公式:\(C = (F - 32) \times 5 / 9\)
    • 输入一个华氏度 int F
    • 输出摄氏度 C
    • 陷阱提示:直接乘 5/9 会变成 0(因为 5/9 是整数除法)。请用 5.0 / 9 试试看?
  3. 思考题

    • 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 教学点。