内容正文:
2.1 数组 1.5课时(教学设计)
年级
高二年级
授课时间
1.5课时
课题
2.1 数组
教学
目标
1.理解数组概念和特性。
2.掌握数组的基本操作。
3.能运用数组编程解决实际问题。
教学
重难点
重点:数组的概念、组织结构及其特性
难点:能合理利用数组设计算法解决相应的简单问题并编程实现
教学
准备
多媒体课件、多媒体教室
教学过程
教师活动
学生活动
新
课
导
入
一、课堂导入
1.想要用程序实现比较不同人的身高,完成从高到矮的排序。
思考:随着人越来越多,需要的变量也增加,如何解决这个问题?
通过提问: 这些变量有什么共同特点?从而引出本堂课的主题。
变量有什么共同特点?
身高都是数值,即数据类型相同。数组在内存中的存储方式为顺序存储,适用于数据规模可预估且在处理过程中数据规模保持稳定的问题。
学生听到老师的提问,思考并观看教师的PPT课件上的图片提示,从而引出本堂课的主题。
新 知 讲 授
2、 数组的概念与特性
数组作为常用数据结构,有特定的数据组织、存储结构及操作特性。
嵌入拓展链接:顺序存储结构和非顺序存储结构
1.数组的概念
①数组是一组具有相同数据类型的变量集合;
②用一个数组名和下标来唯一确定数组元素
数组在内存中存储的结构简单,创建数组时系统会分配一块连续的存储空间,每个数组元素按照下标顺序依次存储。
如上图所示,数组中的数据在内存中按照下标顺序依次存储,使用数组名指向第一个数组元素存储的位置,由于每个数组元素的类型相同,所需的存储空间一致,因此在明确第一个数组元素的存储位置后,可以利用下标计算出其他数组元素的存储位置,从而达到快速访问的目的。
引出二维数组
二维空间内既有纵向联系又有横向联系的一批数据。由于二维数组中的数据元素有行、列两个维度位置信息,因此需要两个下标。
数组下标表示方法:不同程序语言中的数组,特别是多维数组的下标表示各有不同。有的语言中使用多个方括号分别表示其中一个下标,如:a[1][3],典型代表有C、C++、Python等;有的语言中则是使用一个方括号包含所有下标,每个下标之间用逗号隔开,如:a[1,3],典型代表有Pascal;有的则使用一个圆括号包含所有下标,每个下标之间用逗号隔开,如:a(1,3),典型代表有VB。
对比以下两张图片:
用二 维 数 组描述的棋盘信息
二维数组在内存中也采用顺序存储,有行优先存储和列优先存储两种方式。
数组名指向数组中第一行第一个元素存储的位置,其它数组元素可通过下标快速得到。
2.课堂练习
一个数组的第一个元素的存储位置为1000(表示在第1000个字节处),每个元素所占空间大小为8个字节,则第5个元素的位置是(C)?
A.1000 B.1040
C.1032 D.1256
3.数组的特性
①数组元素(下标变量)的数据类型相同
②通过下标变量对数组元素的值进行访问
③存储空间固定不变
对比动态数组和静态数组
(1)数组和列表的区别
当列表中每个数据元素所含数据项的数量和数据类型均相同时,可以将该列表视为数组,列表索引可视为数组的下标。
展开拓展链接:列表的存储
(2)数组的创建
对比一维数组和二维数组
例题:统计分数
学校元旦文艺会演比赛时,现场有9 位评委给各班节目打分,统计系统需要根据9位评委的原始分计算平均分,作为各班表演节目的最终得分。
分析:该问题中9位评委给出的分数属于同一类型的数据,可以创建一个包含9个下标变量的数值型数组来存储评委的原始分。
通过测试一维数组程序得出:在Python中使用列表实现二维数组有两种方式:一是直接定义,适合创建规模较小的二维数组;二是间接定义,适合创建规模较大的二维数组。
对比两个程序分别使用直接定义和间接定义两种方式创建保存棋盘信息的二维数组qp,并将其信息按行输出。
课堂练习:
1.有如下Python程序段:
a=[[0]*4]*3
b=[[0]*4 for i in range(3)]
a[2][3]=8
b[2][3]=8
则程序执行后,下列说法正确的是(C)
A.a[0][3]的值为0,b[0][3]的值为0
B.a[0][3]的值为0,b[0][3]的值为8
C.a[0][3]的值为8,b[0][3]的值为0
D.a[0][3]的值为8,b[0][3]的值为8
2.有如下Python程序段:
a[[0]*3 for i in range(4)]
for i in range(len(a)):
for i in range(len[a[0]]):
a[i][j]=i*len(a[0])+j+1
则程序执行后,a[2][2]的值为(D)
A.5 B.6 C.8 D.9
(3)数组元素的访问
数组元素可通过数组名和下标快速定位其内存地址,因此可通过数组名和下标直接进行访问。
实例讲解: 第一章1.2节将“数据合并”问题简化成合并两个有序数据序列的问题,对如何使用数组解决数据合并问题进行了分析并设计了算法。下面将对算法进行修改和优化,避免插入数据时其他数据元素的移动,并编程实现该功能。
①设计算法
Ⅰ初始化3个数组a,b,c,元素个数分别为n,m和n+m。
Ⅱ使用变量i指向数组a,变量j指向数组b,变量k指向数组c。
Ⅲ重复以下操作,直至数组a或数组b中的数据元素全部合并入数组c中:比较a[i]和b[j]的大小。
Ⅳ如果数组a或数组b中尚有未处理的数据元素,那么将剩余数据元素按原有顺序依次存入数组c中,合并完成,输出数组c。
②编写程序
对于二维数组,也可以使用数组的数组名和下标来任意访问数组元素。
课堂小练:
阿福将我国部分省份及其省会城市存储到二维数组中,并依次输出各省及其省会名称,例如“湖南省的省会是长沙市”’。相关代码如下:
a=[["浙江省","杭州市"],["吉林省","长春市"],["湖南省","长沙市"],["湖北省","武汉市"],["江苏省","南京市"],["广东省","广州市"]]
for p in a:
print(f"{ ① }的省会是{②}")
则划线①和②处分别应填写的代码为(B)
A.①p[1];②p[0] B.①p[0];②p[1]
C.①a[p][0];②a[p][1] D.①p[1];②p[2]
(4)数组元素的插入与删除
当需要在数组中某个位置插入一个新数据时,必须先将该位置及其后的所有数据依次向后移动一位,在保证顺序不变的前提下保存这些数据,最后再修改该位置上的数据为新数据。
要删除数组中的某个元素,只需将其后的所有元素依次前移一位,并将数组长度减一即可。
注:若数组的实际长度为n,删除元素只是让n减1,并不改变数组所占用的存储空间。
使用数组组织、存储数据时应尽量避免数组元素的增加或删除操作。
问题与讨论:1.在数组中插入新数据是否可以先插入数据,再移动其他数组元素?移动数组元素时,其顺序应该是怎样的?为什么一定要这样的顺序?
2.参考数组元素的插入过程,分组讨论并得出在数组中删除一个数组元素的步骤及其注意事项。
对于静态数组,在增加数组元素时,需要将某位置及其后的所有元素后移一个位置后再插入,一方面时间效率较低,另一方面可能会超出限定的数组元素数量而导致数据的丢失;而在删除数组元素时,需要将被删除元素位置后的所有元素前移一个位置,同样有时间效率低的问题,而且在删除比较多的元素后,数组中存储的有效数据减少,从而造成存储空间的浪费。因此,在使用数组组织、存储数据时应尽量避免数组元素的增删操作。
有了数组概念并知道数组的基本操作后,可以使用数组组织、存储数据解决问题。
案例讲解:车牌摇号系统
基于数组的车牌摇号系统功能实现:汽车数量的急剧增加,导致城市交通的压力越来越大,许多大城市采取通过摇号方式来发放汽车车牌。在申请人通过资格审核后,车牌摇号系统反馈回一个唯一的编号。每次摇号前,车牌摇号系统需要收集所有本次申请人的编号,再在所有编号中随机抽取不重复的若干个编号来发放车牌。
①抽象与建模
②设计算法
③编写程序
(5)课堂小练
五、课堂小结
通过列举教材中数组的概念,引导学生经历自主思考,通过自学,引出二维数组的特性。(意图:体现先学后教的理念。)
通过对比二维数组和一维数组,二维数组更能形象、方便的解决问题。讲解用二维数组描述棋盘信息来生动解释什么是二维数组,让学生在了解的基础上掌握这一知识点。
通过课堂练习,加深同学们对数组的理解。
通过一个表格中的信息对比,数组和列表的区别,这样更加直观的了解数组和列表,在Python中用列表来表示数组。
同样通过实例:统计分数的讲解,然后再将数组问题进行抽象化的展示,让学生理解数组如何解决实际中的问题,再次通过对比:直接定义和间接定义,让同学们在对比中掌握知识点。
通过探讨与讨论,加深同学们对数组的理解,本问题讨论的目的一是引导学生进一步在Python中理解列表和数组。
通过实例讲解理解如何进行数组的访问。
通过案例讲解:车牌摇号系统,了解数组元素的插入与删除。
课
堂
练
习
(有题有答案有解析)
1.数组是由 构成的一个序列。
2.数组的特性包括: 、 、 。
3.计算机中数据的存储结构主要分为 和 。
4.用二维数组表示的数据在内存中的存储方式也采用顺序存储,
有 和 两种方式。
5.将数组元素a[i]中各项的名称填入方框中:
a[i]
6.一个数组的第一个元素的存储位置为1000(表示在第1000个字节处),每个元素所占空间大小为8个字节,则第5个元素的位置是( )?
A.1000 B.1040 C.1032 D.1256
7.有如下Python程序段:
a=[[0]*4]*3
b=[[0]*4 for i in range(3)]
a[2][3]=8
b[2][3]=8
则程序执行后,下列说法正确的是( )
A.a[0][3]的值为0,b[0][3]的值为0
B.a[0][3]的值为0,b[0][3]的值为8
C.a[0][3]的值为8,b[0][3]的值为0
D.a[0][3]的值为8,b[0][3]的值为8
8.有如下Python程序段:
a[[0]*3 for i in range(4)]
for i in range(len(a)):
for i in range(len[a[0]]):
a[i][j]=i*len(a[0])+j+1
则程序执行后,a[2][2]的值为( )
A.5 B.6 C.8 D.9
9.阿福将我国部分省份及其省会城市存储到二维数组中,并依次输出各省及其省会名称,例如“湖南省的省会是长沙市”。相关代码如下:
a=[["浙江省","杭州市"],["吉林省","长春市"],["湖南省","长沙市"],["湖北省","武汉市"],["江苏省","南京市"],["广东省","广州市"]]
for p in a:
print(f"{ }的省会是{ }")
则划线①和②处分别应填写的代码为( )
A.①p[1];②p[0] B.①p[0];②p[1]
C.①a[p][0];②a[p][1] D.①p[1];②p[2]
参考答案:
1.相同类型的变量
2.数组元素的数据类型相同、通过数组名和下标对数组元素的值进行访问、存储空间固定不变。
3.顺序存储结构、非顺序存储结构。
4.行优先存储、列优先存储。
5.数组名、下标/索引
6.[解析]第五个元素的存储地址为1000+8×(5-1)=1032
答案:C。
7.[解析]本题主要考查的是二维数组创建与访问。数组a为间接创建方式,当某个元素值改变时,对应的该列所有值改变,数组b使用的是列表生成式创建,各个元素独立。
答案:C
8.答案:D
9.[解析]考查数组的基本知识。遍历a数组的元素,p[0]获取省份,p[1]获取城市,因此①、②处分别应填写的代码为p[0],p[1]。
答案:①、②、B
课
堂
小
结
课堂小结
1.数组的概念和特性
(1) 数组的概念
(2)数组的特性
①数组元素(下标变量)的数据类型相同
②通过下标变量对数组元素的值进行访问
③存储空间固定不变
2.数组的基本操作
(1)数组的创建
(2)数组元素的访问
(3)数组元素的插入与删除
作
业
设
计
1.下列有关数据的描述正确的是( )
A.数组是由多种不同类型的变量构成的一个序列
B.数组是由相同类型的变量构成的一个序列
C.一个数组在内存中的存储空间不一定是连续的
D.一个数组在内存中的存储方式为非顺序结构
2.在一个长度为n的数组中的第i个元素(1<=i<=n)之前插入一个新元素时,需向后移动的元素个数为( )
A.i B.n-i C.n-i+1 D.n-i-1
3.有如下 Python 程序段:
a=[2,2,6,1,8,5,3,6,4,3,6,4,9,5,3] ; dic={}
for i in a:
if i not in dic:
dic[i]=0
else:
dic[i]+=1
执行该程序段后,dic[3]的值为( )
A.1 B.2 C.3 D.4
4.有如下Python程序段:
ma=a[0]
mb=a[0]
pa,pb=0,0
for i in range(1,10):
if ma<a[i]: ma=a[i] ; pa=i
if mb>a[i]: mb=a[i] ; pb=i
下列关于该程序段功能描述正确的是( )
A. 变量pa存储a[0]至a[9]中的最大值
B. 变量ma存储a[0]至a[9]中的最小值
C. 变量pb存储a[0]至a[9]中的最大值
D.变量mb存储a[0]至a[9]中的最小值
5.有如下Python程序段:
a=[3,6,12,5,9,20,17,8]
p=0
for i in range (1,len(a)):
if a[i]>a[p]:
p=i
a.pop(p)
则执行程序段后,数组a中的元素为
A.3,6,12,5,9,20,17,8 B.3,6,12,5,9,17,8
C.3,6,12,5,9,20,17 D.6,12,5,9,20,17,8
6.有如下程序段:
s=1
a=[[1,2,3],[4,5,6],[7,8,9]]
for i in range(3):
for j in range(3):
if i==j:
s*=a[i][j]
则执行程序段后,变量s的值为
A.28 B.6 C.45 D.15
反
思
评
价
本堂课讲解的是理论方面的知识,比较枯燥,只有通过大量的举例来充实课堂。通过列举实例,分析数组概念和特性,让学生们初步掌握数组的基本操作。能够运用能运用数组编程解决实际问题。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$$