资源简介 (共25张PPT)2.1数组数组基本概念数组是由相同类型的变量构成的一个序列。由数组名和下标组成数组的各个变量称为数组的分量,也称为下标变量或数组元素。每个数组元素的类型相同,所需的存储空间一致,因此在明确第一个数组元素的存储位置后,可以利用下标计算出其他数组元素的存储位置,从而达到快速访问的目的。李彤 张强 胡洁 杜刚a[0]a[1]a[2]a[3]aa[2]数组名下标a[2]数组元素:胡洁牛刀小试一个数组的第一个元素的存储位置为1000(表示在第1000个字节处),每个元素所占空间大小为8个字节,则第5个元素的位置是?1000 B. 1040 C. 1032 D. 1256C数组基本概念一维数组只有一个下标的数组称为一维数组,一维数组适合用来表示具有一维空间的线性特征的数据序列。数组元素:d[0],d[1],d[2],d[3],d[4]….二维数组二维数组中的数据元素有行、列两个维度的元素,需要两个下标。数组元素:d[0][0],d[0][1],d[0][2],d[0][3],d[0][4]….数组基本概念二维数组在内存中也采用顺序存储,有行优先存储和列优先存储两种方式。数组名指向数组中第一行第一个元素存储的位置,其它数组元素可通过下标快速得到。行优先存储列优先存储01001220…[0][0][0][1][0][2][0][3][1][0][1][1][1][2][1][3]...01001222…[0][0][1][0][2][0][3][0][0][1][1][1][2][1][3][1]...数组的特性数组元素的数据类型相同。除非特别说明,数组指向的往往是静态数组。定义数组后,系统会根据每个数组元素的数据类型和总元素个数,在内存中开辟一段地址连续且空间固定的存储空间。通过数组名和下标对数组元素的值进行访问。系统根据下标和数据类型自动计算内存地址以访问数组元素。存储空间固定不变。数组一旦创建,存储空间固定不变。即使数组中某些元素已经删除后,占用的空间仍会保留。静态数组动态数组数组定义时没有确定数据规模,可以在任何时候更改数据规模。数组的基本操作一致可以不一致顺序(连续)存储链式(不连续)存储数组≠列表当列表中存储的元素类型保持一致,并且只考虑逻辑结构时,可以把列表看成数组。数组的基本操作——数组的创建一维数组直接创建:a=[0,0,0]间接创建:a=[0]*3列表生成式创建:a=[0 for i in range(3)]二维数组ab直接创建:间接创建:列表生成式创建:b=[[0,0,0],[0,0,0],[0,0,0]]b=[[0]*3]*3可以理解为:for i in range(3):a.append(0)数组的基本操作——数组的创建bb=[[0]*3]*3b[1][1]=1b想象中的b数组实际上的b数组b数组的基本操作——数组的创建一维数组直接创建:a=[0,0,0]间接创建:a=[0]*3列表生成式创建:a=[0 for i in range(3)]二维数组ab直接创建:间接创建:列表生成式创建:a=[[0,0,0],[0,0,0],[0,0,0]]a=[[0]*3]*3a=[[0 for i in range(3)] for i in range(3)]可以理解为:for i in range(3):a.append(0)可以理解为:for i in range(3):a.append([0 for i in range(3)])数组元素的访问数组元素可通过数组名和下标快速定位其内存地址,因此可通过数组名和下标直接进行访问。一维数组数组名[下标访问]想要取到数组中第三个元素:想要访问数组中第2到第4个元素切片访问:二维数组数组名[行下标][列下标]想要取到数组中第2行第3列的元素:访问第i行第j列的元素表示为:a[2]a[1:4]a[1][2]a[i-1][j-1]数组元素的插入当需要在数组中某个位置插入一个新数据时,必须先将该位置及其后的所有数据依次向后移动一位,在保证顺序不变的前提下保存这些数据,最后再修改该位置上的数据为新数据。静态数组元素的插入方法一a=[1,2,3,4,5,0]n=len(a)p=2x=90for i in range(n-1,p,-1):_____________________________n+=1print(a)ap=2x=901 2 3 4 51 2 3 4 51 2 3 4 590a[5]=a[4]a[4]=a[3]a[3]=a[2]a[i]=a[i-1]0 1 2 3 4 5a[p]=x静态数组一旦创建,存储空间固定不变静态数组元素的插入方法一ap=2x=901 2 3 4 51 2 3 41 2 3 490a[5]=a[4]a[4]=a[3]a[3]=a[2]0 1 2 3 4静态数组一旦创建,存储空间固定不变a=[1,2,3,4,5,0]n=len(a)p=2x=90for i in range(n-1,p,-1):_____________________________n+=1print(a)a[i]=a[i-1]a[p]=x动态数组元素的插入方法二对于数组a=[1,2,3,4,5]1.list.insert(i,x)——向数组中下标为i的位置插入元素x2.list.append(x)——向数组的末尾插入元素x[1,2,90,3,4,5][1,2,3,4,5,100]静态数组元素的删除方法一a=[1,2,3,4,5,6]n=len(a)p=2for i in range(p,n-1):______________________________n-=1print(a)ap=21 2 3 4 5 61 2 4 5 6 61 2 4 5 6a[2]=a[3]a[3]=a[4]a[4]=a[5]a[i]=a[i+1]0 1 2 3 4 5思想:当需要在数组中某个位置中删除一个元素时,只需将所有元素依次前移一位,然后将所有数组长度减一即可。del a[n-1]a.pop(n-1)/a.pop()动态数组元素的删除方法二对于数组a=[1,2,3,4,5,6]1.list.pop(i)——删除数组中下标为i的元素,若i省略则为最后一个2.del list[i]——删除数组中下标为i的元素操作 列表a数据a.pop()[1,2,3,4,5]操作 列表a数据del a[2][1,2,4,5,6]3.list.remove(x)——删除数组中元素为x的第一个元素操作 列表a数据a.remove(2)[1,3,4,5,6]车牌摇号系统实例(1)抽象与建模用n表示有资格参加摇号的申请人总数,用序列luck存储编号,luck[0] ,luck[1],…,luck[n–1]依次表示n个编号,其中的下标表示每个编号的位置,luck[i]的初值为第i+1位申请人的编号。使用变量m表示最终的车牌发放数量,计数器c表示已抽中人数,每当随机抽出一个有效的下标位置(如k)时,计数器c加1,输出申请人的编号后将该下标位置(如luck k )的值设为空串(表示该编号已被抽取),用来判断其后抽取的编号是否重复。重复该过程直至计数器c的值变为m,摇号结束。车牌摇号系统实例(2)设计算法由于该问题中数据规模可以预估,在处理过程中其数据规模保持不变,并需要根据随机产生的编号读取和修改对应的值,所以用数组来存储所有申请人的编号,下标表示该编号的位置。算法分为两个步骤:①根据申请人总数n,初始化数组luck,其数组下标代表位置,数组元素值为申请者编号(类型为字符串),并使用计数器c表示已抽中人数,初始化值为0。②使用随机整数函数randint(a,b)随机产生一个位置k,若其作为数组下标对应的数组数据元素值为空串,则表示该编号已被抽取,该编号为重复号码,需要重新生成;否则,表示该编号为有效编号,计数器c加1,输出对应的数组元素并修改数组元素值为空串,表示该编号已被抽取。③重复执行步骤②,直至计数器c变为m,程序结束。车牌摇号系统实例车牌摇号系统列表函数版from random import randintluck=[] # 新建列表csv_file=open("bh.csv", "r", encoding='utf-8') # 打开存有编号的文件 bh.csvflines=csv_file.readlines() # 将文件中所有编号按行读入 flines 中csv_file.close # 关闭文件n=0for one_line in flines:tmp=one_line.strip("\n") # 将一个编号去除换行后赋给 tmp_________________________ #填加列表元素n+=1 #元素数组增加1个m=int(input(" 请输入发放数: "))for i in range(m):k=randint(0,n-1)print(luck[k])_________________________ #编号抽取后删除n-=1 #元素数组减少1个luck.append(tmp)luck.pop(k)luck.insert(n,tmp)del luck[k]课堂小结课堂练习1.有如下Python程序段:a=[[0]*4]*3b=[[0]*4 for i in range(3)]a[2][3]=8b[2][3]=8则程序执行后,下列说法正确的是( )A.a[0][3]的值为0,b[0][3]的值为0B.a[0][3]的值为0,b[0][3]的值为8C.a[0][3]的值为8,b[0][3]的值为0D.a[0][3]的值为8,b[0][3]的值为8C课堂练习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]的值为( )A.5 B.6 C.8 D.9D课堂练习3.阿福将我国部分省份及其省会城市存储到二维数组中,并依次输出各省及其省会名称,例如“湖南省的省会是长沙市”’。相关代码如下: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]B2.1数组教学设计一、教学设计课程标准和教学目标 数组教材内容: 2.1数组的概念、特性、基本操作1.3结合生活实际,理解数据结构的概念,认识数据结构在解决问题过程中的重要作用。1.4 通过案例分析,理解数组的概念,并能编程实现其相关操作。教学目标:●通过实例讨论与分析,培养学生寻找解决现实问题关键数据的意识与能力●通过实例中关键数据的数字化表达,学会使用数组来表示一组相同类型数据,理解数组的概念和特性。●在数字机房中通过实例的编程实现,掌握数组的相关操作和使用数组编程的思维。教学重点:数组的概念、组织结构及其特性教学难点:能合理利用数组设计算法解决相应的简单问题并编程实现 指向的核心素养: ●信息意识落点在“能够根据解决问题的需要,自觉、主动地寻求恰当方式获取信息与处理信息;在合作解决问题的过程中,愿意与团队成员共享信息,实现信息的更大价值。”教学中是将数组的概念及其基本操作融入实际问题之中,在教师的引导下,通过师生的交流探讨一步一步学习数组相关的理论知识,并根据这些理论,从现实情境问题中提取出关键数据并使用数组存储;在其后的班级抽奖项目的实现过程中自主分析并提取其中关键数据并使用合适的数据结构(数组)存储这些数据;在以上过程中均在培养或提升学生获取关键信息的能力,即信息意识的培养与提升。●计算思维落点在 “能够采用计算机科学领域的思想方法界定问题、抽象问题特征、建立结构模型、合理组织数据;通过判断、分析与综合各种信息资源,运用合理的算法形成解决问题的方案。”学生在车牌摇号随机抽取程序实现过程中,在教师的引导下体验并参与完整的问题解决过程,学习并明了计算机解决实际问题的步骤及相应算法的设计,在此基础上,学生自主完成班级学生随机抽奖问题的建模及算法设计,在该过程中可以加深及强化学生建模及算法设计的能力,提升自身的计算思维。学习环境:机房,预装Python编程环境。建议课时:1.5课时教学活动设计 教学环节 教学过程 设计意图情境导入 以“车牌摇号”的实例引出在编程过程中如何将同类数据保存在一起,从而导出“数组”的概念,数组就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分它们的变量的集合,这个名字称为数组名,这个编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组特性:(1)每个元素类型相同。(2)一般元素个数固定。(3)数组元素使用数组名和它在数组中的位置来表示。 围绕车牌摇号的生活案例,引导学生从数据结构的角度重新审视程序,导出“数组”概念及特性的讲解。同时,由项目的分析提出数组,一方面可以使学生更容易接受,另一方面在介绍这些偏理论方面的内容时,由于涉及到项目的解决从而让学生学习时更有积极性知识讲解1 将数组创建、数组访问、数组元素内容修改等基本操作融入“统计分数”、“五子棋盘描述”、“基于数组实现数据合并的功能”等现实情境中,在实例学习中掌握数组的基本操作。 引领学生学会根据实际项目的数据特点选择合适的数据结构,并在此基础上设计相应的算法。问题与讨论1 参考数组元素的插入过程,分组讨论并得出在数组中删除一个数组元素的步骤及其注意事项。并结合两者的不同从而得出本讨论的结论。 教师可以适当引导学生注意并参考数组元素插入的步骤和注意事项,并结合两者的不同从而得出本讨论的结论。通过插入数组元素和删除数组元素的对比教学,有助强化学生对数组基本操作的理解,培养学生知识迁移的能力。知识讲解2 通过“车牌摇号系统”项目的分析,让学生体验问题界定、抽象特征、建立结构模型、合理组织数据结构,形成算法、程序实现的过程。并通过该项目的算法分析及程序实现,展示数组的应用,最后利用思考与练习中班级随机抽奖问题的分析与实现,重温利用数组结构解决问题的过程,培养学生知识迁移的能力,并起到巩固、提高的教学效果。 让学生体验使用数组解决实际问题的编程过程,通过实际问题的解决,培养学生使用数据结构解决实际问题的意识。自主学习(1) 教师引导学生自主学习Python列表常用函数与方法,并利用列表的方法简化环节8中的程序代码。 通过体验不同的程序实现方式,开拓学生的视野,培养学生在解决问题中合理评估并选择最优方案的意识,同时体会所学Python语言的优势,提升学生学习Python语言的兴趣。课堂小结 知识梳理:学习评价(附件10:学习评价表) 通过自评引导学生反思本节课所学内容,发现问题与不足,起到查漏及巩固的作用,通过互评与交流加强同伴的交流与合作,实现团队协作中多种能力的培养。布置作业 ●基础作业(面向所有学生):1.选择题(详见课后练习)。2. 参考二维数组的行优先存储方式,画图模拟二维数组的列优先存储方式。观察并比较行优先存储与列优先存储中相同元素的存储位置的改变,如qp[1][2]在行优先存储方式下在序列的第7个位置,则其在列优先存储方式下在序列的第几个位置?3. 参考摇号系统的功能实现,将自己班级所有同学的名字以一个名字一行的形式存入文件name.csv,并使用文件读入的方式,使用数组实现随机抽奖程序。设计意图:课后作业是课堂学习的延伸,是巩固和升华知识点的有效途径。根据学生的基础和能力设置不同难度的作业,以满足不同层次的学生需求。●提升作业(面向学有余力学生):网上购物已经成为人们的一种生活方式,人们可以在购物网站上查询商品、购买商品,最终付款。请实现功能:根据购买商品清单计算需付款金额。 课后作业是课堂学习的延伸,是巩固和升华知识点的有效途径。根据学生的基础和能力设置不同难度的作业,以满足不同层次的学生需求。针对核心素养培养的设计考虑 信息意识:落点在“能够根据解决问题的需要,自觉、主动地寻求恰当方式获取信息与处理信息;在合作解决问题的过程中,愿意与团队成员共享信息,实现信息的更大价值。”教学中是将数组的概念及其基本操作融入实际问题之中,在教师的引导下,通过师生的交流探讨一步一步学习数组相关的理论知识,并根据这些理论,从现实情境问题中提取出关键数据并使用数组存储;在其后的班级抽奖项目的实现过程中自主分析并提取其中关键数据并使用合适的数据结构(数组)存储这些数据;在以上过程中均在培养或提升学生获取关键信息的能力,即信息意识的培养与提升。计算思维:落点在 “能够采用计算机科学领域的思想方法界定问题、抽象问题特征、建立结构模型、合理组织数据;通过判断、分析与综合各种信息资源,运用合理的算法形成解决问题的方案。”学生在车牌摇号随机抽取程序实现过程中,在教师的引导下体验并参与完整的问题解决过程,学习并明了计算机解决实际问题的步骤及相应算法的设计,在此基础上,学生自主完成班级学生随机抽奖问题的建模及算法设计,在该过程中可以加深及强化学生建模及算法设计的能力,提升自身的计算思维。 展开更多...... 收起↑ 资源列表 2.1数组.pptx 数组的概念、特性、基本操作教学设计.doc