🎬 课前导入动画 — 猜数字游戏中的二分法
老师心里想了一个数(1-100),看小航怎么用二分法快速猜中!
点击开始演示 ▶

第12课 神奇的二分法 — 小航猜数字

教师备课端 | 4C1E教学设计 | 知识点体系 | 小学四年级趣味C++ | 课程时长 120分钟

课程概览
教学流程
知识点体系
代码与拓展
反思与评价

📋课程基本信息

项目内容
课程名称第12课 神奇的二分法——小航猜数字
授课对象小学四年级学生(C++入门阶段,有变量、if/else、循环基础)
课程时长120分钟(2课时)
教学方法游戏驱动(师生互动猜数字)+ 算法可视化(区间缩小演示)+ 代码填空(猜数字程序)
核心知识二分法思想、while(true)无限循环、break跳出、边界变量left/right/mid更新

🎯教学目标

知识与技能

  • 理解二分法的核心思想:取中间值,根据反馈缩小区间
  • 掌握while(true)无限循环和break跳出循环的用法
  • 理解边界变量left/right/mid的含义和更新逻辑(left=mid+1, right=mid-1)
  • 能完成代码填空,实现猜数字游戏程序

过程与方法

  • 通过师生互动猜数字游戏,亲身体验二分法的高效性
  • 通过区间可视化演示,理解每次猜测后区间缩小一半的过程
  • 通过代码填空,建立算法思想与代码实现的对应关系

情感态度与价值观

  • 感受算法的力量——好方法能让问题效率成倍提升
  • 培养"分而治之"的问题解决思维
  • 在游戏和互动中激发对算法和编程的兴趣

📊4C1E 整体设计

C1联系
25分钟
C2建构
45分钟
C3反思
20分钟
C4延续
15分钟
E评价
15分钟
环节核心活动学生任务
联系师生互动猜数字游戏 → 对比"逐个猜"和"取中间猜"的效率 → 引出二分法概念 → 生活中的二分法参与游戏,体验二分法高效性
建构while(true)循环复习 → 二分法核心思想(取中值、缩区间)→ 变量设计(left/right/mid/count)→ 代码填空实现猜数字理解算法,完成代码填空
反思二分法效率讨论(1-1000最多10次,因为2^10=1024)→ 边界条件思考(为什么+1/-1)→ 常见错误总结深度思考,理解算法本质
延续分层作业(改范围/统计区间/自动猜数字)→ 拓展任务(密码保护答案)→ 下节课预告课后巩固,拓展提升
评价课堂小测(5选择+3判断)→ 学习反馈 → 知识点回顾检测学习效果

🔗C1 联系 Connection(25分钟)

1. 互动游戏:猜数字大挑战(10分钟)

老师在心里想一个1-100的数字,请学生上台猜。第一轮让学生"随便猜",老师只回答"大了/小了/对了",记录猜了多少次。

第二轮引导学生"聪明地猜"——每次猜当前范围的中间值。例如:先猜50,大了就猜25,小了就猜75……记录次数。

对比效果:随便猜可能需要几十次,而聪明的猜法最多7次就能猜中1-100中的任意数!这种"每次取中间、根据反馈缩小区间"的方法就叫二分法

2. 二分法概念明确(8分钟)

二分法定义:每次取当前搜索区间的中间值,根据反馈判断目标在左半区间还是右半区间,从而将搜索范围缩小一半。重复这个过程直到找到目标。
核心要素:①有序的搜索区间 ②取中间值 ③根据反馈缩小区间 ④重复直到找到

3. 生活中的二分法(7分钟)

  • 查字典:翻到中间,根据页码判断目标字在前面还是后面
  • 找东西:在一排东西中找物品,从中间开始找
  • 快递分拣:根据邮编/地区不断缩小范围
  • 电脑文件搜索:二分查找算法在程序中的应用

🏗️C2 建构 Construction(45分钟)

1. while(true)循环复习(5分钟)

  • while(true)是无限循环,条件永远为真,会一直执行循环体
  • 需要用break语句跳出循环
  • 适合"不知道要循环多少次,直到满足某个条件才停止"的场景
  • 猜数字游戏正好符合:不知道要猜几次,猜对了才停止

2. 二分法核心思想与变量设计(10分钟)

猜数字的算法步骤:

  1. 设定搜索范围:left=1, right=1000
  2. 取中间值:mid = (left + right) / 2
  3. 猜mid,根据反馈更新范围:
    • 猜小了 → 目标在右半区间 → left = mid + 1
    • 猜大了 → 目标在左半区间 → right = mid - 1
    • 猜对了 → 结束游戏
  4. 重复步骤2-3,直到猜对
变量说明:
• left:当前搜索区间的左边界
• right:当前搜索区间的右边界
• mid:当前区间的中间值(猜测值)
• count:猜测次数计数器
• ans:用户输入的反馈(1=猜小了,2=猜大了,3=猜对了)

3. 边界更新的关键点(7分钟)

为什么是 left=mid+1 而不是 left=mid?
因为mid已经猜过了,而且反馈是"猜小了",说明目标一定比mid大,所以左边界可以直接跳到mid+1,不需要再包含mid。
如果写成left=mid,当left和right相邻时(如left=5, right=6),mid=(5+6)/2=5,猜5如果小了,left=mid=5,下一轮mid还是5,就会死循环!+1就是为了避免这种情况。

4. 代码填空:猜数字游戏(23分钟)

场景:小航写了一个猜数字游戏程序,电脑每次猜中间值,玩家告诉电脑"猜小了/猜大了/猜对了",电脑根据反馈调整范围,直到猜对。

#include <iostream> using namespace std; int main() { int left = ___; // ①左边界初始值 int right = ___; // ②右边界初始值 int count = ___; // ③计数器初始值(第1次开始) int mid, ans; while(___) { // ④循环条件(无限循环) mid = (___) / 2; // ⑤中间值计算 cout << "第" << count << "次,猜" << mid << endl; cout << "1 猜小了?" << endl; cout << "2 猜大了?" << endl; cout << "3 猜对了?" << endl; cin >> ans; if(ans == 1) { left = ___; // ⑥猜小了,左边界更新 } else if(ans ___ 2) { // ⑦判断猜大了 right = mid - 1; } else { cout << "猜对了" << endl; ___; // ⑧跳出循环 } count++; } cout << "一共竞猜了" << count << "次" << endl; return 0; }

填空答案:①1 ②1000 ③1 ④true ⑤left+right ⑥mid+1 ⑦== ⑧break

教学提示:给学生12-15分钟完成填空并运行验证。重点关注:①left/right/count初始值 ②while(true)和break的配合 ③mid=(left+right)/2 ④边界更新left=mid+1(最容易错成left=mid)⑤ans==2的判断。完成后请2-3名学生上台演示运行。

🤔C3 反思 Contemplation(20分钟)

1. 二分法效率大讨论(7分钟)

  • 1-100范围内,二分法最多猜几次?(7次,因为2^7=128>100)
  • 1-1000范围内,最多猜几次?(10次,因为2^10=1024>1000)
  • 1-1000000范围内,最多猜几次?(20次,因为2^20≈100万)
  • 如果逐个猜(从1开始逐个试),1-1000000最坏情况要猜多少次?(100万次!)
震撼对比:100万个数,逐个猜最坏要100万次,二分法只要20次!这就是算法的力量——好的方法能让效率提升成千上万倍。

2. 边界条件深度思考(6分钟)

  • 为什么left=mid+1而不是left=mid?(避免死循环,mid已排除)
  • 为什么right=mid-1而不是right=mid?(同理)
  • 如果left>right了说明什么?(说明用户给的反馈有矛盾,或者目标不在范围内)
  • mid=(left+right)/2是整数除法,会自动向下取整,对结果有影响吗?(没有,因为左右区间都能覆盖)

3. 常见错误总结(4分钟)

常见错误:
① while(true)忘记写break,导致死循环
② left=mid(忘记+1),导致left和right相邻时死循环
③ count初始值设为0,导致第一次显示"第0次"
④ mid=(left+right)/2写成mid=left+right/2(运算优先级错误,应该加括号)
⑤ ans==2写成ans=2(赋值号和等号混淆)

4. 代码互评(3分钟)

随机展示2份学生代码,引导全班从正确性、边界处理、注释三个维度点评。

🚀C4 延续 Continuance(15分钟)

1. 分层课后任务

层次任务内容目标
基础题①修改代码,把猜数字范围改为1-10000;②完成课堂代码填空,运行截图提交巩固核心代码
提高题在每次猜测后,额外输出"当前范围:left ~ right",让玩家看到区间缩小的过程理解区间更新
挑战题编写"自动猜数字"程序:程序自己生成一个1-1000的随机数作为答案,然后自己用二分法猜,不需要人输入反馈,最后输出猜了多少次综合运用随机数和二分法

2. 拓展任务(密码保护答案)

拓展任务:在原猜数字程序基础上,增加"智能提示"功能——当剩余范围小于等于10时,程序提示"答案就在这几个数中:X, X+1, ..., Y",并在猜对后输出"理论上最多需要X次,你用了Y次"的效率对比。答案解析通过密码访问(密码课后发给家长)。

3. 二分法趣味拓展

  • 假币问题:81枚硬币中有1枚假币(较轻),用天平最少称几次能找出?(4次,因为3^4=81,每次分3组)
  • 二分查找:在有序数组中查找元素,时间复杂度O(log n)
  • 二分答案:用二分法求解"最大值最小化"类问题

📝E 评价 Evaluation(15分钟)

1. 课堂小测(10分钟)

5道难度递增的选择题 + 3道判断题,限时完成。覆盖:二分法概念、效率计算、边界更新、while(true)循环。

2. 学习反馈(3分钟)

请学生用一句话总结"二分法为什么这么快",或提出一个还没弄懂的问题。

3. 知识点回顾(2分钟)

本课主线:猜数字游戏→二分法概念→while(true)循环→边界变量left/right/mid→代码实现。一句话总结:"二分法就是每次猜中间,大了往左小了往右,范围每次缩一半,再难的数也能快速找到!"

🧠本节课知识点体系总览

本节课共涵盖 3大模块、12个核心知识点,其中 重点 标注的为必须掌握的核心内容。

📦 模块一:二分法基础概念

1. 二分法定义 重点

每次取搜索区间的中间值,根据反馈判断目标在左半还是右半区间,将范围缩小一半,重复直到找到目标。

取中间 → 判方向 → 缩区间 → 重复

2. 二分法核心思想

"分而治之":把大问题不断拆成一半大小的小问题,每次排除一半的可能性,效率极高。

每次排除50%的可能性

3. 生活中的二分法

查字典、找东西、快递分拣、电脑文件搜索等,都是二分法思想的实际应用。

翻字典→看页码→往左/往右翻

4. 二分法的效率 重点

n个元素中查找,二分法最多需要⌈log₂(n+1)⌉次。1-1000最多10次,1-100万最多20次。

次数 ≈ log₂(范围大小)
🔄 模块二:循环与变量

5. while(true)无限循环 重点

while(true)条件永远为真,会一直执行循环体,必须用break才能跳出。适合"不知道循环多少次"的场景。

while(true) { ... break; ... }

6. break跳出循环

break语句立即终止当前所在的循环,执行循环后面的代码。猜对数字时用break结束游戏。

if(猜对了) break;

7. 边界变量left/right

left是当前搜索区间的左边界,right是右边界。每次猜测后根据反馈更新其中一个,区间不断缩小。

初始 left=1, right=1000

8. 中间值mid计算

mid=(left+right)/2,取当前区间的中间值作为猜测值。整数除法自动向下取整。

mid = (left + right) / 2
💻 模块三:二分法代码实现

9. 区间更新逻辑 重点

猜小了→left=mid+1(目标在右边);猜大了→right=mid-1(目标在左边)。+1/-1避免死循环。

小了:left=mid+1 大了:right=mid-1

10. 计数器count

count记录猜测次数,初始值为1(第一次猜测),每次循环末尾count++。最后输出总次数。

int count=1; ... count++;

11. 用户输入判断

用if/else if/else判断用户输入的ans:1=猜小了,2=猜大了,3=猜对了。注意用==比较,不是=赋值。

if(ans==1)...else if(ans==2)...else...

12. 程序完整流程

初始化边界→循环:取中值→输出猜测→读取反馈→更新边界或break→计数+1→循环结束输出总次数。

初始化→while(true)→猜→反馈→更新→break

🎯 本节课5大重点知识

二分法定义(取中间、缩区间、重复直到找到)
二分法效率(log₂n次,1000个数最多10次)
while(true)无限循环(需配合break跳出)
区间更新逻辑(left=mid+1, right=mid-1)
中间值计算(mid=(left+right)/2)

📝完整代码参考(猜数字游戏)

#include <iostream> using namespace std; int main() { int left = 1; // 左边界 int right = 1000; // 右边界 int count = 1; // 猜测次数(从第1次开始) int mid, ans; while(true) { // 无限循环,猜对了才break mid = (left + right) / 2; // 取中间值 cout << "第" << count << "次,猜" << mid << endl; cout << "1 猜小了?" << endl; cout << "2 猜大了?" << endl; cout << "3 猜对了?" << endl; cin >> ans; if(ans == 1) { left = mid + 1; // 猜小了,目标在右边 } else if(ans == 2) { right = mid - 1; // 猜大了,目标在左边 } else { cout << "猜对了" << endl; break; // 猜对了,跳出循环 } count++; } cout << "一共竞猜了" << count << "次" << endl; return 0; }

运行示例(假设答案是77)

第1次,猜500 → 2(猜大了)→ right=499 第2次,猜250 → 2(猜大了)→ right=249 第3次,猜125 → 2(猜大了)→ right=124 第4次,猜62 → 1(猜小了)→ left=63 第5次,猜93 → 2(猜大了)→ right=92 第6次,猜77 → 3(猜对了!) 猜对了 一共竞猜了6次

💡可拓展授课知识点与思路

拓展A:二分法效率的数学证明

每次猜测后区间缩小一半,k次猜测后区间大小为 n/2^k。当区间大小为1时就找到了,即 n/2^k ≤ 1,所以 k ≥ log₂n。可以用简单的数学推导让学生理解为什么是log级别的效率。

拓展B:三分法与多分法

除了二分法,还有三分法(每次分3组)、多分法。假币问题用天平称就是三分法(左盘/右盘/不上盘),81枚硬币4次就能找出假币(3^4=81)。可以对比二分和三分的适用场景。

拓展C:二分查找在有序数组中的应用

在一个有序数组中查找某个元素,就是标准的二分查找算法。可以用"在一排按身高排好的同学中找某个同学"的场景来讲解,为后续学习数组和算法打基础。

拓展D:故意写bug让学生debug

故意写一段有bug的代码(如left=mid忘记+1导致死循环、count初始值为0、mid=left+right/2运算优先级错误),让学生运行后发现问题,通过分析找出bug,培养排错能力。

拓展E:自动猜数字程序

让程序自己生成随机数作为答案,然后自己用二分法猜,不需要人输入反馈。需要用到rand()和srand()生成随机数,以及用if(mid

拓展F:二分答案思想

简单介绍"二分答案":对于"最大值最小化"类问题,可以二分枚举答案,然后判断是否可行。比如"把n个苹果分给k个小朋友,每个小朋友最多分几个,使得所有苹果刚好分完"。这是二分法的高级应用,激发学生对算法的兴趣。

📐板书设计

第12课 神奇的二分法
一、二分法
  取中间值 → 根据反馈缩小区间 → 重复
  效率:log₂n次(1000→10次,100万→20次)

二、核心变量
  left=1, right=1000, count=1
  mid = (left + right) / 2

三、边界更新(关键!)
  猜小了 → left = mid + 1
  猜大了 → right = mid - 1
  猜对了 → break

四、循环结构
  while(true) { 猜 → 反馈 → 更新 → count++ }

⚠️教学注意事项与常见问题

时间把控

互动猜数字游戏容易超时,控制在10分钟内。代码填空环节给足12-15分钟,不要催促。效率讨论环节学生可能很兴奋,适当引导但不要跑题。

概念难度

二分法思想本身不难,但"为什么+1/-1"和"为什么不会死循环"是难点。一定要用具体例子(如left=5,right=6)演示,如果不+1会发生什么,让学生直观看到死循环。

代码填空设计

8个填空点覆盖:初始值(3个)、循环条件、中间值计算、边界更新、条件判断、break。重点填算法核心步骤,语法细节预先写好。

易错点强调

必须反复强调"left=mid+1"中的+1——这是学生最容易犯的错误。可以现场演示不+1时的死循环,让学生印象深刻。同时强调while(true)必须配合break。

硬件准备

确保每台电脑C++编译环境正常,课前测试运行无误。互动游戏环节可以准备一个小奖品激励学生。

差异化教学

理解较慢的学生可以提供"半完成代码",只填3-4个空;学有余力的学生布置自动猜数字、统计范围等拓展任务。

📊评价标准

评价维度优秀(A)良好(B)需努力(C)
二分法概念能准确说出定义,快速解释为什么效率高能说出基本定义,理解大概思路对二分法概念模糊
边界更新理解left=mid+1的原因,能解释不+1会死循环能正确写边界更新,但说不清原因边界更新经常出错
代码实现独立完成所有8个填空,代码运行正确,理解while(true)+break能完成大部分填空,少量错误需提示填空困难,需要大量帮助
课堂参与积极参与猜数字游戏,主动思考和提问能参与课堂活动,偶尔发言参与度低

📝 课堂点评(家长端)

📚 第12课《神奇的二分法》课堂点评 ━━━━━━━━━━━━━━━━━━━━ 🎯 本节课学习重点: 1. 二分法核心思想:取中间值,根据反馈缩小搜索范围 2. while(true)无限循环 + break跳出 3. 边界变量left/right/mid的使用 4. 猜小了left=mid+1,猜大了right=mid-1 5. 二分法效率:1000个数最多10次猜中 ━━━━━━━━━━━━━━━━━━━━ 🌟 孩子课堂表现: - 上课认真听讲,积极参与猜数字互动游戏 (๑•̀ㅂ•́)و✧ - 对二分法"每次缩小一半"的概念理解很快,能主动回答问题 - 代码填空环节思考认真,遇到问题会主动提问 - 调试环节表现不错,能根据错误提示逐步修正代码 - 拓展任务部分愿意尝试,有探索精神和求知欲 🚀 ━━━━━━━━━━━━━━━━━━━━ 📝 知识点掌握情况: - 二分法定义和效率:掌握较好 - while(true)循环和break:理解到位 - 中间值mid=(left+right)/2:能正确填写 - 边界更新逻辑(+1/-1):基本掌握,建议再巩固为什么要+1 - 代码填空8个:完成情况良好 ━━━━━━━━━━━━━━━━━━━━ 💡 课后建议: 1. 复习边界更新为什么要+1/-1,避免死循环 2. 可以尝试修改猜数字范围(如1-100),观察猜测次数变化 3. 完成学生端拓展任务的3道代码填空,巩固for循环 4. 生活中可以用二分法思想玩猜数字游戏,加深理解 ━━━━━━━━━━━━━━━━━━━━ 加油!二分法是非常重要的算法思想,掌握了对以后学习数据结构和算法很有帮助!(ง •_•)ง
💡 提示:点击"一键复制点评"后,可直接粘贴到微信发送给家长,格式已优化无特殊符号

🔄教学反思(课后填写)

1. 互动猜数字游戏效果如何?学生是否体会到二分法的高效?

(课后记录)

2. "left=mid+1为什么+1"学生理解了吗?是否需要更多例子?

(课后记录)

3. 代码填空完成度如何?哪个空错误率最高?

(课后记录)

4. 下节课需要复习或补充什么内容?

(课后记录)

🎬 课后总结动画 — 本节课知识点回顾
🎯
二分法
取中间值,根据反馈缩小区间,重复直到找到
高效率
1000个数最多10次,100万最多20次(log₂n)
🔄
while(true)
无限循环,必须配合break才能跳出
📏
边界更新
猜小了left=mid+1,猜大了right=mid-1
🔢
中间值
mid=(left+right)/2,每次猜区间正中间