📋课程基本信息
| 项目 | 内容 |
|---|---|
| 课程名称 | 第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 整体设计
| 环节 | 核心活动 | 学生任务 |
|---|---|---|
| 联系 | 师生互动猜数字游戏 → 对比"逐个猜"和"取中间猜"的效率 → 引出二分法概念 → 生活中的二分法 | 参与游戏,体验二分法高效性 |
| 建构 | 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……记录次数。
2. 二分法概念明确(8分钟)
核心要素:①有序的搜索区间 ②取中间值 ③根据反馈缩小区间 ④重复直到找到
3. 生活中的二分法(7分钟)
- 查字典:翻到中间,根据页码判断目标字在前面还是后面
- 找东西:在一排东西中找物品,从中间开始找
- 快递分拣:根据邮编/地区不断缩小范围
- 电脑文件搜索:二分查找算法在程序中的应用
🏗️C2 建构 Construction(45分钟)
1. while(true)循环复习(5分钟)
- while(true)是无限循环,条件永远为真,会一直执行循环体
- 需要用break语句跳出循环
- 适合"不知道要循环多少次,直到满足某个条件才停止"的场景
- 猜数字游戏正好符合:不知道要猜几次,猜对了才停止
2. 二分法核心思想与变量设计(10分钟)
猜数字的算法步骤:
- 设定搜索范围:left=1, right=1000
- 取中间值:mid = (left + right) / 2
- 猜mid,根据反馈更新范围:
• 猜小了 → 目标在右半区间 → left = mid + 1
• 猜大了 → 目标在左半区间 → right = mid - 1
• 猜对了 → 结束游戏 - 重复步骤2-3,直到猜对
• left:当前搜索区间的左边界
• right:当前搜索区间的右边界
• mid:当前区间的中间值(猜测值)
• count:猜测次数计数器
• ans:用户输入的反馈(1=猜小了,2=猜大了,3=猜对了)
3. 边界更新的关键点(7分钟)
因为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分钟)
场景:小航写了一个猜数字游戏程序,电脑每次猜中间值,玩家告诉电脑"猜小了/猜大了/猜对了",电脑根据反馈调整范围,直到猜对。
填空答案:①1 ②1000 ③1 ④true ⑤left+right ⑥mid+1 ⑦== ⑧break
🤔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万次!)
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分钟)
🧠本节课知识点体系总览
本节课共涵盖 3大模块、12个核心知识点,其中 重点 标注的为必须掌握的核心内容。
1. 二分法定义 重点
每次取搜索区间的中间值,根据反馈判断目标在左半还是右半区间,将范围缩小一半,重复直到找到目标。
2. 二分法核心思想
"分而治之":把大问题不断拆成一半大小的小问题,每次排除一半的可能性,效率极高。
3. 生活中的二分法
查字典、找东西、快递分拣、电脑文件搜索等,都是二分法思想的实际应用。
4. 二分法的效率 重点
n个元素中查找,二分法最多需要⌈log₂(n+1)⌉次。1-1000最多10次,1-100万最多20次。
5. while(true)无限循环 重点
while(true)条件永远为真,会一直执行循环体,必须用break才能跳出。适合"不知道循环多少次"的场景。
6. break跳出循环
break语句立即终止当前所在的循环,执行循环后面的代码。猜对数字时用break结束游戏。
7. 边界变量left/right
left是当前搜索区间的左边界,right是右边界。每次猜测后根据反馈更新其中一个,区间不断缩小。
8. 中间值mid计算
mid=(left+right)/2,取当前区间的中间值作为猜测值。整数除法自动向下取整。
9. 区间更新逻辑 重点
猜小了→left=mid+1(目标在右边);猜大了→right=mid-1(目标在左边)。+1/-1避免死循环。
10. 计数器count
count记录猜测次数,初始值为1(第一次猜测),每次循环末尾count++。最后输出总次数。
11. 用户输入判断
用if/else if/else判断用户输入的ans:1=猜小了,2=猜大了,3=猜对了。注意用==比较,不是=赋值。
12. 程序完整流程
初始化边界→循环:取中值→输出猜测→读取反馈→更新边界或break→计数+1→循环结束输出总次数。
🎯 本节课5大重点知识
① 二分法定义(取中间、缩区间、重复直到找到)
② 二分法效率(log₂n次,1000个数最多10次)
③ while(true)无限循环(需配合break跳出)
④ 区间更新逻辑(left=mid+1, right=mid-1)
⑤ 中间值计算(mid=(left+right)/2)
📝完整代码参考(猜数字游戏)
运行示例(假设答案是77)
💡可拓展授课知识点与思路
拓展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 简单介绍"二分答案":对于"最大值最小化"类问题,可以二分枚举答案,然后判断是否可行。比如"把n个苹果分给k个小朋友,每个小朋友最多分几个,使得所有苹果刚好分完"。这是二分法的高级应用,激发学生对算法的兴趣。拓展F:二分答案思想
📐板书设计
效率:log₂n次(1000→10次,100万→20次)
mid = (left + right) / 2
猜大了 → right = mid - 1
猜对了 → break
⚠️教学注意事项与常见问题
时间把控
互动猜数字游戏容易超时,控制在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 | 能完成大部分填空,少量错误需提示 | 填空困难,需要大量帮助 |
| 课堂参与 | 积极参与猜数字游戏,主动思考和提问 | 能参与课堂活动,偶尔发言 | 参与度低 |
📝 课堂点评(家长端)
🔄教学反思(课后填写)
1. 互动猜数字游戏效果如何?学生是否体会到二分法的高效?
(课后记录)
2. "left=mid+1为什么+1"学生理解了吗?是否需要更多例子?
(课后记录)
3. 代码填空完成度如何?哪个空错误率最高?
(课后记录)
4. 下节课需要复习或补充什么内容?
(课后记录)