《非数值计算(第一课时)》教学设计
一、 学习单元主题解读
(一)《非数值计算(第一课时)》属于必修 1 模块
(二)课程标准要求从生活实例出发,概述算法的概念与特征,运用恰当的描述方法和控制结构表示简单算法,掌握一种程序设计语言的基础知识,使用程序设计语言实现简单算法。
(三)通过解决实际问题,体验程序设计的基本流程,感受算法的效率,掌握程序设计与运行的方法。
(四)创设程序设计的活动情景,组织学生在解决问题的过程中探究顺序,结构选择结构和循环结构的特点,通过小组学习,分析问题,设计解决问题的算法,例如通过编程体验程序设计的基本过程,学习程序设计的基本方法,通过设计选课趣味小程序等,具有一定实用价值的程序培养学生利用程序设计解决实际问题的基本能力。
二、 教学对象分析
学生经过前三章的学习,掌握编程的基本调试方法,对条件语句、循环语句编程语言已基本掌握。通过《4.1 算法及其特征》、《4.2 数值计算》学习,初步掌握算法的要素和重要特征,学习了如何表达算法,体验了枚举算法。通过《4.2数值计算》的学习,学生对数值计算的研究范围有所了解,对求解数学模型的理论、算法和编程实现有一定的体验。
本课以递增数列为例,通过二分查找算法分析,掌握二分查找的思想,并体验算法思想如何一步步转化为计算机可计算的指令过程。充分体会和理解分治策略的思想,在是培养学生的计算思维的重要版块。
三、 教学目标
知识与技能
了解分治的思想
掌握二分查找的算法思想
过程与方法
通过实例编程,体验如何把算法思想转化为计算机可计算的代码过
程。
上机实现二分查找算法的编程与调试
情感态度价值观
体会分冶思想在应用中的的作用
培养学生利用程序设计解决实际问题的基本能力。四、 教学重点与难点
重点: (1)理解分治思想。(2)掌握二分查找算法
难点:把思维转换为代码五、 教学策略
二分查找算法的实现与实际查找的步骤有较高的一致性,是算法入门的典型例子。先学习分治策略及其特点,然后学习二分查找的算法,进而编程实现二分查找,全面深入地理解二分查找及分治策略。在学习算法知识的阶段学习使用讲授法进行教学,在讲授的过程中充分使用启发式学习策略、推理分析学习策略、归纳学习策略等让学生把算法与平时现象联系起来,较快理解算法,并且将算法转化为指令。最后通过上机编程实现二分查找,较充分地使用了探究学习策略,在实践中实现对算法思想的理解。
课时安排:1 课时(40 分钟)
六、 教学媒体
七、 教学过程
步骤 教师活动 学生活动 设计意图
导入新课 学习分治策略:是把一个难以直接解决的大问题分割成若干个较小的同类问题,然后用同样的方法把小问题各个击破,实现最终解决问题。 我们在学习生活里常常使用分治思想解决问题,比如说求 2 的 8 次幂,很多同学看到这个任务后,都会把它拆分成几个小部分,各小部分的值分别求出后相乘求到得数。这种分而治之求解的策略就是分治的思想。 学生听讲、思考,概念与实际建立联系。 把算法与平时现象联系起来,较快理解概念,掌握分治策略的核心要领。
二分查找算法 二分查找:先来了解二分查找的实施前提。不同的搜索算法适用于不同的数据结构。二分查找适用于线性表的数据查找。除了这个要求以外,二分查找还要求待查的序列是有序的,升序或者是降序。 为什么要求待查的序列是有序的呢?跟二分查找算法有关。查找的时候,以待查序列的中点位置元素作为比较对象,要查找的数据跟中点位置的元素相等,就完成了查找任务。中点位置元素如果和目标不相等,以递增序列为例,如果目标小于中点位置元素,那么待查的序列在左边,如果大于这个中点位置的元素,那么待查的序列就在右边。 没有找到目标数据,在新的系列里面进行反复查找,不断收缩待查序列的范围,直到找到这个数为止,这就是我们的二分查找的思想。这种查找的方法,每次都使查找的序列一分为二,所以被称为二分查找,也叫对半查找。 学生听讲、推理、分析为什么序列是有序的。并且 二分查找算法的实现与实际查找的步骤有较高的一致性,通过对算法与分析归纳等学习,能更好地把握二分查找的关键内容与特点。
算法转化为代码 如何把二分查找的思想转换为代 码。(1)查找对象 X 将由随机函数分配。 (2)定义 flag_left、flag_right 两个变量用于存储左右边界的信息。通过代码告诉计算机,序列的中点位置的元素怎么求。 mid=(flag_left+flag_right)//2 是求中点位置元素的表达式。在这个任务里,查找的对象都是整数,因此使用整除符号,以保证求出的数据是整数。查找的过程以待查序列中点位置元素 mid=(flag_left+flag_right)//2 作为比较对象,如果 mid 就等于查找的对象,那么,查找的工作就结束了。如果 mid与 x 不相等,就要收缩待查的序列。 怎么收缩待查序列呢?如果大于中 点位置元素,则将待查序列缩小为右半部分。 代码应该写成: if x>mid: flag_left=mid+1以待查序列中点位置元素 mid=(flag_left+flag_right)//2 作为比较对象,如果小于中点位置元素,则将待查序列缩小为左半部分。 代码应该表达为 if x(
下面请同学们和老师一起打开编程软件
,
对照流程图
,
准备开始编写程序:
首先我们完成的是变
量
x
、
边界定义等的初始化部分代码。程序产生一个
100
以内的正整数
,
因此在程序的最开始要
导入随机数模块
,
定义左右边界并赋初值
。
随机数产生的范围与
flag_left 、flag_right
初值重合,所以,把随机数
x
的值由随机函数
random.randint(flag_left,flag_right)函数产生
。
我们先测试一下随机数能否正常地产生
。
这部分代码调试没问题。我们把
print(x)语句删除掉。
接着我们用代码求出,第一个中点位置元素 mid=(flag_left+flag_right)//2
程序的第二大部分是负责二分查找的代码
用
while
语句,执行循环条件判断:如果
mid
与
x
相等,那么
mid
为所查找的目标数字
,
结束循环
。
如果
,
mid
与
x
不相等
,
则进入循环部分
,
执行序列收缩与新中点位置元素的计算。
在这组循环语句中,代码除了要更新待查序列的左右边界
,
还要更新
mid
变量
。
为什么呢?因为边界更新了
,
中点位置元素的值也要更新
,
才能正确地进入下一轮的条件判断
,
实现正确查找,正确解决问题。
第三部分:输出查找结果。
程序写好后就进行调试运行,很快找到目标对象进行输出。增加一个输出变量,把
print(mid),改为
print(mid,x),对照查找到的数值是否与
x
一致
。
经过检查非常一致
。
完善输出的语句的提示信息。
我们可以在程序中加上统计查找次数的变量 step,对二分查找的次数进行统计。100 以内的数不超过 7 次就能找到。
我们也可以把待查序列调整为
1-1000
,
观察
1000
以内的二分查找执行的情况。可以看到,虽然查找的范围扩大了
10
倍,多了 900 个数字,执行二分查找的次数不会超过 10 次。把右边界调整为 10000,执行二分查找,不超过 14 次就能找到这个数。可见二分查找的效率是很高的。
在编写这个程序的练习中
,
有些同学发现自己的程序运行报错
,
他们的程序往往在缩进上犯了错误
。
对照程序的流程图,可以清楚地看到这两行语句写错了位置
。
错误的书写
,
导致在 if
的条件下才计算新序列的中点位置元素值,不符合流程的要求。 由流程图可以见,结束分支环节后即进行中点位置元素的计算,因此这行句不应缩进在
else
分支中。由流程图可见
,
循环结束查找后才输出查找到的
mid
,
print(mid)不应缩进在
else:的分支中。正确的写法应该是:mid
语句与
if
语句平齐,print(mid)语句与
while
语句平齐。请同学们检查自己的书写有无类似的错误
,
改错后再进行调试
。
完成二分查找知识的学习
,
我们来体验一个小游戏
。
这是一个猜数游
创设程序设计的活
动情景,组织学生在
解决问题的过程中
探究学习,
分析问
题,培养学生利用程
序设计解决实际问
题的基本能力。
编程探究
)
戏。在没有学习二分查找之前,我们玩猜数游戏会比较随意地
小结这节课的学习内容:这节课学习了分治策略和二分查 找。 分治策略,它是将一个难以直接解决的大问题,分割成一些较小的同类问题,同样的方法把各个小问题击破,最终达到解决问题的目的。 二分查找就是在分治策略的一种应用。把一下子难以一次遍历的大范围分成若干个小的序列,使用同样的方法,以中间位置的元素值为比较对象,不断收缩待查序列,直到把这个数找出来。 二分查找是一种高效的查找方法。计算机查找数据的方法很多,二分查找仅是其中的一种,分治思想也只是算法策略的一种,希望同学带着更多的好奇继续学习算法知识,喜欢上算法。今天的课程就学习到这里,谢谢您的观看学习。 师生共同小结,总结
算法思想在程序设
计中的重要作用与
地位。
小结及课
后拓展