内容正文:
3.3 简单算法及其程序实现 1课时(教学设计)
年级
高一年级
授课时间
课题
3.3 简单算法及其程序实现
教学
目标
1.了解解析算法、枚举算法的程序实现以及算法程序实现的综合应用;
2.能够运用所学知识进行简单算法的设计和程序实现,已解决实际问题;
3.在进行算法设计和编程实践中,提高合作交流与动手能力,培养严谨的思维习惯和创新精神;
教学
重难点
重点:了解解析算法、枚举算法的程序实现以及算法程序实现的综合应用。
难点:能够运用所学知识进行简单算法的设计和程序实现,已解决实际问题。
教学
准备
多媒体课件、多媒体教室
教学过程
教师活动
学生活动
新
课
导
入
一、课堂导入
1.通过播放答题卡的扫描过程的视频来引入本节课的主题。
在同学们观看了视频后抛出问题,引出同学们的思考。
我们考试用的答题卡是如何识别的,其中用到了哪些算法?
解决问题的算法有很多,当算法设计完成后,就可以用程序设计语言来描述算法。
通过播放答题卡的扫描过程的视频和提问的方式导入教学,激发学习热情和探究欲望。
新 知 讲 授
一、解析算法及其程序实现
解析算法的基本思想是指根据问题的前提条件与所求结果之间的关系,找出求解问题的数学表达式并通过表达式的计算来实现问题的求解。
在解析算法的程序实现过程中,首先要确保数学表达式的正确性,然后在程序中正确描述该数学表达式。
通过一个答题卡填涂识别的项目实例来体验解析算法的程序实现过程。
如下图所示的答题卡常用于标准化考试、选举和调查。答题卡一般采用2B铅笔填涂,填涂好的答题卡经过扫描后得到相应的数字化图像,再通过光学识别,完成答题卡信息数据的采集、分析与统计。那么,计算机是如何判断答题卡中哪些信息点被填涂了呢?
分析:答题卡上的信息点填涂会导致该信息点的像素颜色发生变化(如填涂前为白色,填涂后为黑色)。因此,判断某信息点是否被填涂,可以从判断一个像素的颜色开始。
(1)抽象与建模
由于扫描得到的答题卡图像可能是彩色图像或者是灰度图像,为了提高填涂内容的识别准确率,需要先将图像统一转换为黑白图像。以彩色图像(RGB颜色模式)为例,可以先按照如下数学模型将彩色图像中每个像素的R、G、B值转换成灰度值:
灰度值= 0.299×红色颜色分量+ 0.587×绿色颜色分量+ 0.114×蓝色颜色分量
在此基础上,再根据像素的灰度值,依据一定的颜色判断标准(如灰度值小于132,判定为黑色,否则判定为白色),将灰色近似判定为黑色或白色。
(2)设计算法
基于问题的抽象与建模,判定一个像素的颜色可以用解析算法,算法描述如下:
①给定颜色初值:输入某像素在RGB颜色模式下的各颜色分量。
②转换颜色模式:将彩色(RGB颜色模式)值转化成灰度值。
③判定黑、白颜色:若灰度值小于132,则判定为黑色;否则判定为白色。
(3)编写程序
用变量R、G、B分别存储某像素红色、绿色、蓝色的颜色分量,Gray_scale是灰度值,判定某像素(颜色值为RGB(43,10,241))为黑色或白色的Python程序及测试结果如下:
程序
测试结果
R=43
G=10
B=241
Gray_scale=0.299*R+0.587*G+0.114*B
if Gray_scale<132:
print("黑色")
else:
print("白色")
黑色
试一试
尝试上网检索并改写程序以实现自动获取输入的R、G、B三种颜色的分量,进而判定某像素(颜色值为RGB)是黑色还是白色?
改进后代码为:
R=int(input("请输入R颜色分量"))
G=int(input("请输入G颜色分量"))
B=int(input("请输入B颜色分量"))
Gray_scale=0.299*R+0.587*G+0.114*B
if Gray_scale<132:
print("黑色")
else:
print("白色")
总结:在解析算法的程序实现过程中,首先要确保数学表达式的正确性,然后在程序中正确描述该数学表达式。
二、枚举算法及其程序实现
想一想:学校举行趣味游戏,游戏规则如下:参与人员排成一个圈,从第一个人开始从1开始快速地报数,若遇到7的倍数或者包含7的数字,则拍手,若没有拍手,则该人淘汰。一直报数,直到圈中只剩下一人,即为胜利者。你准备好了吗?
1.枚举算法
取第一个数50
判断是否需要跳过
取第二个数51
判断是否需要跳过
取第三个数52
判断是否需要跳过
……
……
取最后一个数n
判断是否需要跳过
一一列举
逐个判断
①基本思想
把问题所有可能的解一一列举,然后判断每一个列举出的可能解是否为正确的解。
②解题思路
逐一列举可能解的范围,这个过程用循环结构实现。
对每一个可能解进行验证,这个过程用分支结构实现。
③程序实现
把问题所有可能的解一一列举,然后判断每一个列举出的可能解是否为正确的解。
操作
模块
程序
一一列举
循环结构
For语句/While语句
逐个比较
判断分支结构
If语句
2.思考
在求解某整数x的所有因子(不包含x本身)的问题中,可以一一列举[1,x-1] 范围内的所有整数,如果x能被这个范围内的某个整数整除,那么这个数就是整数x的因子。
①分析
可以一一列举[1,x-1] 范围内的所有整数,如果x能被这个范围内的某个整数整除,那么这个数就是整数x的因子。
②算法设计
※输入某整数X;
※执行X除以i(i大于1小于X-1)求余数;
※判断第二步余数是否为0,输出i;否则i自动加1,循环执行第二步。
思考:请同学们自主思考如何设计算法并程序实现求解某整数x的所有因子?
程序
测试结果
x=int(input("请输入整数x :"))
i=1
while i<=x-1:
if x%i==0:
print(i)
i=i+1
请输入整数x :243
1
3
9
27
81
4.总结
在上述算法的程序实现过程中,由于整数x无法被从[x/2]+1到x-1范围内的整数整除,因此,枚举范围可缩小至从1到[x/2],即循环进行的条件为i≤[x/2]。在枚举的过程中,当数据规模较大时,减少枚举的次数,将大大提高解决问题的效率。因此,在设计枚举算法时,既不能遗漏任何一个正确解,又要尽可能地缩小解的列举范围,以提高算法的效率。
在前面的项目学习中,我们已经解决了答题卡信息点中某个像素是否为黑色的判断问题(即判断该像素是否被涂黑)。但要完整判定某信息点是否被填涂,还需要对该信息点区域中的所有像素进行判断。这里我们使用枚举算法来试一下!
(1)抽象与建模
判断某信息点是否被填涂与该信息点区域中的黑色像素数量有关,当黑色像素数量达到一定比例(如黑色像素的数量不少于该信息点区域内所有像素数量的64%),则认定该信息点被填涂。因此,判断某信息点是否被填涂,首先需要对该信息点区域中的所有像素逐一进行判断,然后统计所有黑色像素的总数。统计黑色像素个数的计算模型如下:
其中,count为n个像素中的黑色像素总数,Gray_scale[i]为某个像素的灰度值。
(2)设计算法
基于问题的抽象与建模,统计某信息点中黑色像素的个数可以用枚举算法,算法描述如下:
①逐一列举某信息点中的各个像素。
②如果当前枚举的像素是黑色,那么黑色像素的数量加1。
③输出该信息点中黑色像素总数。
(3)编写程序
下面以5个像素为例,判定它们当中哪些是黑色像素并且统计黑色像素的个数,实现此功能的程序及测试结果如下:
程序
测试结果
count=0
Gray_scale=[47,178,146,185,116]
for i in range(0,len(Gray_scale)):
if Gray_scale[i]<132:
print("第"+str(i+1)+"个像素为黑色;")
count=count+1
print("黑色像素总共有:"+str(count)+"个。")
第1个像素为黑色;
第5个像素为黑色;
黑色像素总共有:2个。
程序中,变量count用于统计黑色像素的个数,列表Gray_scale存储了5个像素的灰度值。
以小组为单位,总结归纳枚举算法的一般程序结构特点。
枚举算法通常会包含循环结构。因为它需要遍历所有可能的情况。
与循环结构紧密配合的是条件判断语句。在循环内部,需要通过条件判断来检查当前枚举的情况是否满足问题的要求。
枚举算法需要明确枚举的范围。这个范围是根据问题的要求来确定的。
枚举算法一般是按照一定的顺序逐个检查可能的情况。
拓展延伸
如果上述5个像素的颜色用R、G、B的颜色分量表示,为了方便枚举,可以将它们的R、G、B颜色分量值用列表p_color进行组织:
p_color=[[84,24,70],[229,160,145],[133,161,107],[200,176,200],[201,80,85]]
再使用以下语句读取各个像素的R、G、B颜色分量值(变量i为列表p_color的索引):
R=p_color[i][0]
G=p_color[i][1]
B=p_color[i][2]
从而计算出各个像素的灰度值并实现黑白像素判断。
如果要判断如右图所示信息点中的300个像素(25×12)的颜色情况,那么需要对300个像素的颜色数据(RGB各颜色分量值)逐一进行列举并判断。下面的Python程序实现了从某文件中读取300个像素的颜色数据,并将判断后的填涂结果写入文件。
我们一起来看一下程序代码:
程序
注释
fname = input("请输入文件名称: ")
f = open(fname,"r+")
count=0
line = f.readline()
while line:
line = line.split()
R, G, B = map(int, line)
if 0.299 * R + 0.587 * G + 0.144 * B < 132:
count = count + 1
line = f.readline()
if count >= 300 * 0.64:
f.write("
已填涂!")
else:
f.write("
未填涂!")
f.close()
# 以读写的方式打开文件
# 当line非空(从文件读取到了数据)
# 从文件中读取一行
# 把空白字符去除,变成包含三个str的list
# 把line中三个str转化成int并赋值给R, G, B
# 继续读取一行
根据拓展链接部分对文件读写函数的介绍,并总结填写下表。
读写文件的函数
以读文件模式(参数'r')打开文件test.txt
将文件中的全部内容读取到内存
读写文件的函数
每次读取一行内容,并返回字符串
关闭文件的方法
用参数'w'表示写文本文件模式
每次读取一行内容,并返回字符串
3、 算法程序实现的综合应用
在前面所讲的答题卡填涂识别的项目中,也可以通过编写函数来实现原有程序的模块化设计。下面的程序段创建了函数bw_ judge,能够根据某彩色像素的R、G、B三种颜色分量值,通过计算进而“识别”该像素的颜色情况。
def bw_judge(R,G,B):
Gray_scale = 0.299 * R + 0.587 * G + 0.114 * B
if Gray_scale < 132:
color = "黑色"
else:
color = "白色"
return color
调 用bw_ judge函 数 时, 需 将R、G、B的值传递至bw_judge函 数 的 参 数 表。例如,主程序中有函数调用语句bw_ judge(43,10,241),则返回的函数值将是彩色像素RGB(43,10,241)被识别后的结果。如果在程序的其他位置也要检测黑、白颜色的像素,那么只需调用bw_ judge函数即可。
在本项目中,为了方便读取图像中的像素颜色,并快速实现分析、判断,可以使用Python中的Image模块。实现此项目的Python程序如下:
from PIL import Image
im = Image.open("RGB.bmp")
pix = im.load()
width = im.size[0] # size中有两个参数,第1个参数为图像宽度值
height = im.size[1] # 第2个参数为图像高度值
count = 0
for x in range(width):
for y in range(height):
R,G,B = pix[x, y] # 根据像素坐标获得该点的 RGB 值
if bw_judge(R,G,B) == "黑色":
# bw_judge函数用于判断黑、白像素
count = count + 1
if count >= width * height * 0.64:
print("已填涂!")
else:
print("未填涂!")
在本节答题卡填涂识别的项目中,已经实现了判断一个信息点填涂情况的程序编写。但在答题卡的填涂判断中,往往需要对一批信息点进行检测。如图3.3.3所示的准考证号填涂区中有9列、10行,共90个填涂信息点。这样,就需要对90个信息点进行一一检测,才能确定所填涂的准考证号。
1.抽象与建模
如上页PPT中的准考证号填涂区域所示的90个信息点,每个信息点在图像中都有固定的坐标值,根据坐标可以确定它们的位置。右图所示的是准考证号填涂区域中准考证号填涂区左上角的4个信息点的坐标。
答题卡在模板设计时就指定了每个信息点的格式与参数。如下图所示,信息点中的每个像素坐标可表示为:(水平方向值,垂直方向值)。其中,“start”为准考证号填涂区第一行第一列的信息点起始位置,其坐标记作(x_start, y_start)。另外,信息点的宽度(fill_width)、高度(fill_height)以及信息点之间的间隔距离(space_width、space_height)都相同,且同一列的信息点水平方向坐标值和同一行的信息点垂直方向坐标值也都相同。
为了更方便地取得相邻信息点(水平向右或者垂直向下方向)的起始位置坐标,可以将一个标准信息点的宽度、高度与信息点之间的间隔距离组合成一个整体。
该整体的参数为
水平方向总宽度:total_width = fill_width + space_width
垂直方向总高度:total_height = fill_height + space_height
这时,答题卡中的任意一个信息点的起始位置水平方向坐标值x可表示为:
x = x_start + total_width * col
起始位置的垂直方向坐标值y可表示为:
y = y_start + total_height * row
其中col为列号,row为行号;col∈[0,8]范围内的整数,row∈[0,9]范围内的整数。
根据每个信息点的起始位置坐标,就可以找到每个信息点的填涂区域,从而对其进行填涂识别。
2.设计算法
基于问题的抽象与建模,识别准考证号填涂的算法描述如下:
①初始化数据;
②确定信息点位置;
③检测信息点填涂;
④输出填涂的准考证号
3.编写程序
四、小结
五、课堂小练
过一个答题卡填涂识别的项目实例来体验解析算法的程序实现过程。
展示答题卡常用于标准化考试、选举和调查,让同学们一目了然的观察。
展示灰度值的公式计算,让同学们直观的了解如何计算灰度值。
以线性对比的方式展示算法的描述步骤,让同学们在对比和循序渐进中学习知识。
以表格的形式直观的展示程序和测试结果,让同学们直观观察其结果。
将刚才同学们解决的这个问题进行一个变动,同学们通过举一反三来解决问题,这样更能更好的掌握知识点。
通过一个趣味游戏来引出本小节内容,再展示游戏规则引发同学们的思考。
以关键词为基础来展示枚举算法的知识点,让同学们在循序渐进中逐渐掌握新知。
以表格的方式展示程序实现中需要使用的模块,让同学们直观的了解。
抛出问题,引起同学们的思考,这样能更好的加深知识点的讲解。
通过问题的迁移来验证同学们的掌握情况。
以表格的形式直观的展示程序和测试结果,让同学们直观观察其结果。
对知识点进行总结和提炼,让同学们能更好的掌握知识点。
循序渐进的展示算法的描述,让同学们逐步掌握知识点。
以表格的形式直观的展示程序和测试结果,让同学们直观观察其结果。
通过拓展延伸来验证同学们的掌握情况,这样教师能更好的知晓班上同学们的能力情况。
以表格的形式直观的展示程序和注释,让同学们直观观察其结果。
让同学们阅读书中内容来填写表格,验证同学们对知识点的掌握情况。
将前面的案例结合前两个知识点来讲解,巩固知识点的掌握。
展示程序代码及其解释,让同学们直观的观察。
循序渐进的展示算法的设计,让同学们逐步掌握知识点。
课
堂
练
习
(有题有答案有解析)
1.程序如下
a=int(input())
b=int(input ())
c=a+b
print(a,’+’,b,’=’,c)
通过键盘分别输入23和3,运算结果是( )
A.26 B.23+3=26 C.’23’+”3”=26 D.24+4=28
答案:B
解析:本题考查Python程序执行
a=23,b=3,c=23+3=26,最后输出23+3=26,故本题选B选项。
2.购买地铁车票:乘1-4站3元/人;5-9站4元/人;9站以上5元/人。根据输入的站数N,输出应付款M,如需将算法补充完整,最适合的选项是( )
A.N>9 B.N<=9 C.5<=N<=9 D.N>=5 and N<=9
答案:B
解析:本题考查条件语句。根据题目要求,购买地铁车票:乘1-4站3元/人;5-9站4元/人;9站以上5元/人。故N<=9满足5-9站4元/人,最适合,因此选项B正确。
3.下面if语句统计满足“性别 (gender) 为男、职称(rank) 为副教授、年龄(age)小于40岁”条件的人数,正确的语句为( )
A.if(gender=="男" or age<40 and rank=="副教授"): n+=1
B.if(gender=="男" and age<40 and rank=="副教授"): n+=1
C.if(gender=="男" and age<40 or rank=="副教授"): n+=1
D.if(gender=="男" or age<40 or rank=="副教授"): n+=1
答案:B
解析:本题主要考查if条件分支。题目中的条件都是与的关系,所以要用and连接,故本题选B选项。
4.计算表达式1/2+2/3+3/5+5/8+…前30项的和。实现此功能的Python程序如下:
a,b=1,2
s=0
for i in range(30):
(1)
print(s)
横线中的代码由下列3个语句组成:①b=b+a ②s=s+a/b ③a=b-a
下列选项中代码顺序正确的是( )
A.①③② B.③①② C.②①③ D.②③①
答案:C
解析:本题考查的是循环语句的应用。变量a、b的初值分别为1和2,观察该表达式,第1项应为a/b,第2项应为b/(a+b),所以第1步应执行s=s+a/b;接下来考虑更新a、b值,即实现a=b,b=a+b,先执行b=b+a,再执行a=b-a,相当于a=a+b-a=b,故代码顺序为②①③,选项C正确。
5.以下程序段运行结果是( )
s = 0
for i in range(11):
if i % 2==0:
s = s + ielse:
s = s - iprint(s)
A.55 B.-5 C.5 D.-55
答案:C
解析:本题考查的是Python循环及选择语句。range(11)是生成[0,1,2,3,4,5,6,7,8,9,10]的列表,结合if语句可知,当i为偶数用加,为奇数时则用减。故s=0-1+2-3+4-5+6-7+8-9+10=5。故本题应选C。
课
堂
小
结
1.解析算法的基本思想是指根据问题的前提条件与所求结果之间的关系,找出求解问题的数学表达式并通过表达式的计算来实现问题的求解。
2.在解析算法的程序实现过程中,首先要确保数学表达式的正确性,然后在程序中正确描述该数学表达式。
3.在解析算法的程序实现过程中,首先要确保数学表达式的正确性,然后在程序中正确描述该数学表达式
4.枚举算法的基本思想是把问题所有可能的解一一列举,然后判断每一个列举出的可能解是否为正确的解。
5.纳枚举算法的一般程序结构特点:①枚举算法通常会包含循环结构;②与循环结构紧密配合的是条件判断语句;③枚举算法需要明确枚举的范围;④枚举算法一般是按照一定的顺序逐个检查可能的情况。
6.读写文件是计算机中常见的输入输出操作,读写文件时会请求操作系统打开一个文件对象,然后通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
7.Python内置了读写文件的函数。
反
思
评
价
通过本节课的教学,学生了解了利用计算机编程解决问题的一般过程,在教学过程中,要注重引导学生积极思考、主动参与,通过实际问题的解决来加深对算法的理解。同时,要关注学生的个体差异,提供不同层次的问题和任务,满足不同学生的学习需求。在评价环节,要鼓励学生相互学习、共同进步,培养学生的团队合作精神和批判性思维。
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$