资源简介 (共79张PPT)课时1 数 组第二章 数组与链表1.通过案例分析,理解数组的概念和特性。2.掌握数组的基本操作,并能编程解决实际问题。目 录CONTENTS知识梳理01例题精析02随堂检测03巩固与提升04知识梳理11.数组的概念(1)数组在内存中的存储方式为____________。(2)数组是由____________的变量构成的一个序列。(3)数组名和下标组成数组的各个变量称为数组的分量,也称为____________。(4)创建数组时,系统会在内存中分配一块______的存储空间,每个数组元素按照______顺序存储。(5)一维数组:只有一个下标,下标用来表示数据元素在该序列中的位置。(6)二维数组:有两个下标,表示数据元素在该序列中的行、列位置,二维数组有行优先存储和列优先存储两种方式。顺序存储相同类型数组元素连续下标2.数组的特性(1)数组元素的数据类型相同。(2)通过数组名和下标对数组元素的值进行访问。(3)存储空间固定不变。数组创建时就分配好存储空间,即其占用空间就已固定,因此删除数组中的元素后,其占用的空间不变。3.数组的基本操作(1)数组的创建数组的创建实质是在系统内存中划分一块连续区域,用来保存数组所含的所有数据元素。(2)数组元素的访问①数组元素的访问指的是寻址到特定的数据元素,并根据存储地址对该数据元素进行读取、修改等操作。②数组元素可以通过数组名和下标直接进行访问。(3)数组元素的插入与删除①当数组中某个位置要插入一个新数据时,必须先将该位置及后面的所有数据向后移动一个位置,然后将新数据插入。例如,在数组a的1位置插入一个新数据datax,操作后的数组a如下所示。②删除数组元素时,需要将被删除元素位置后的所有元素前移一个位置。例如,删除数组元素a[1]后的数组如下图所示。4.Python列表常用函数和方法在Python中,常用列表来模拟实现数组的操作。Python列表常用函数和方法函数和方法 功能 实例len(list1) 统计列表list1中元素的个数 list1=[1,2,3,4]print(len(list1)),输出为4list1.append(x) 在列表list1末尾添加元素x list1=[1,2,3,4]list1.append(5)列表中的内容为:[1,2,3,4,5]list1.insert(i,x) 在列表list1中下标为i位置处插入元素x list1=[1,2,3,4]list1.insert(2,5)列表中的内容为:[1,2,5 3,4]list1.pop(i) 将列表list1中下标为i的元素删除;若i不指定,默认为-1,即删除最后一个元素 list1=[1,2,3,4]list1.pop()列表中的内容为:[1,2,3]例题精析2例1 下列有关数组的描述正确的是( )B解析 本题主要考查的是数组的定义。数组是由相同类型的变量构成的一个序列;一个数组在内存中的存储空间一定是连续的;数组在内存中的存储方式为顺序结构;因此答案为B。A.数组是由多种不同类型的变量构成的一个序列B.数组是由相同类型的变量构成的一个序列C.一个数组在内存中的存储空间不一定是连续的D.数组在内存中的存储方式为非顺序结构变式训练 有如下的Python程序段:Aa=[3,5,7,9,11,13,15]p=2for i in range(p+1,len(a)):a[i-1]=a[i]del a[i] #从列表中删除元素a[i]则与方框中程序段功能相同的语句是(注:pop()删除列表最后一个元素,del()删除列表指定范围元素)( )A.a=a[:p]+a[p+1:] B.a=a[:p]+a[p:]C.a.pop() D.del a[p:]解析 题框中程序相当于把索引p位置以后字符依次前移一个位置,然后把最后一个元素删除,答案A实现同样功能。B内容不变,C只删除了最后一个元素,D则把p及以后元素全部删除了。例2 数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤xtemp=a[n-1]for i in range(n-2,x-1,-1):A解析 先将7保存在a[n-1],变量i从n-2遍历到x,将当前位置i后面的值移动到当前位置,故答案为A。变式训练 若长度为n的线性表采用数组a(a[0]~a[n-l])存储,要删除第t个位置上(存储在a[t-1])的元素,对应的Python程序如下:for i in range(t-1,n-1): ①______划线处的代码应是( )A.a[t]=a[i] B.a[i]=a[i+1]C.a[i]=a[i-1] D.a[i-1]=a[i]解析 变量i的值从t-1至n-2,要删除第t个位置上(存储在a[t-1]),将用索引i+1位置上的值覆盖索引i的值。B例3 已知6行4列的二维数组a以行优先的方式存储在k个连续存储单元中,每个数组元素占8个存储单元,如果已知a[0][0]的首地址为1000,则a[3][2]的首地址为( )A.1112 B.1160 C.1104 D.1080解析 本题考查二维数组的相关知识。以行优先的方式存储,每行共4个数据项,a[3][2]前共有3行2列,因此共3*4+2=14个数据项,共占14*8=112个存储单元,首元素地址为1000,故答案为A。A变式训练 使用列表生成式创建数组的Python代码如下:解析 当i为偶数时,将i的平方添加到列表a中,因此a中值依次为0,4,16,36,64。表达式sum(a[1:-1])求列表中除头尾元素之外元素之和,答案为C。Ca=[i*i for i in range(10) if i%2==0]则执行语句print(sum(a[1:-1]))后输出的结果为( )A.20 B.52 C.56 D.116例4 上城小学将在本学期开展趣味运动会,一(10)班的班主任邀请你为他们设计一个Python程序,用于挑选参加集体项目的选手。挑选规则为:当班级有足够候选人员时,进行随机挑选,并输出人员名单;若无足够人员时,提示“无足够候选人员参加比赛!”,并规定每个学生最多参加一个集体项目。程序要求用户按照规范输入比赛项目及相关人员要求,例如输入“投篮:8,2”即篮球项目要求男生8人,女生2人。该程序的运行效果如下图所示:请输入比赛项目及相关人员要求:跳绳:5,5;赶猪:15,15;投篮:8,2跳绳项目:男:艾震宇 蔡温淼 叶埕奇 何夫 王子硕女:王晓清 黄鑫橼 陈佳妮 陈昱彤 陈奕臻赶猪项目:无足够候选人员参加比赛!投篮项目:男:陈展骢 李俊翰 张子俊 刘泓成 胡海伟 王子涵 叶赛特 伍越女:贾熙 钱梓涵(1)实现挑选集体项目选手的Python代码如下,程序中用到的列表函数与方法如下表所示,请在划线处填入合适的代码。函数与方法 功能w.append(x) 在列表w末尾添加元素xx=w.pop(i) 将列表w末尾下标为i的元素赋值给x,并将其从w中删除(2)程序加框处代码有误,请改正。from random import shuffledef disp(inf): # 将输入的字符串整理为指定格式,当输入字符串为″跳绳:10,10;投篮:8,2″,则将其调整为{″跳绳″: [10,10],″投篮″: [8,2]}并返回。def player(x,n): #输出列表前n个元素,并删除这些元素,返回删除后的新列表for i in range(n):①______print(xm,end=″ ″)return x c=[[″陈浩琦″,″男″],[″王慧敏″,″女″],[″王子涵″,″男″],…] #班级学生名单ctemp=[[],[]] #根据学生性别分别存储男生和女生名单for ②______ in c:if p[1]==″男″: ctemp[0].append(p[0]) #append()函数的功能为在列表末尾插入新元素else: ctemp[1].append(p[0])inf=input(″请输入比赛项目及相关人员要求:″)s=[″男″,″女″]sj=disp(inf)for t in sj: #变量遍历字典中的每个键 if sj[t][0]<=len(ctemp[0]) and sj[t][1]<=len(ctemp[1]):print(t+″项目: ″)for i in ③______: print(s[i],end=″:″) shuffle(ctemp[i]) #shuffle 用于将序列的所有元素进行随机排序答案 (1)①xm=x.pop(0) ②p③range(len(ctemp))或range(2)(2)ctemp[i]=player(ctemp[i],sj[t][i])解析 本题考查列表的方法实现。(1)①自定义函数player的功能是输出列表前n个元素,并删除这些元素。表中所示x=w.pop(i)将列表w末尾下标为i的元素赋值给x,并将其从w中删除,因此下标i的值为0。②ctemp数组存储男生和女生名单,因此需遍历c数组的每个元素p,并根据p[0]的值进行相应的处理。③分别处理男生和女生的情况,因此需重复2次。(2)player函数是处理一个一维数组,即分别处理男生和女生的名单。变式训练 生成n颗(n<=30)地雷随机放置在10×10的方格中,方块中出现地雷用#表示,出现数字,则表示在其周围相邻的方块中共有多少颗地雷,中间位置有8个方块相邻,边上位置有5个方块相邻,角上位置有3个方块相邻。程序运行的结果如图所示,请在划线处填入合适的代码。def Check(a,x,y): #统计第x行第y列四周雷的个数count=0for i in range(x-1,x+2):for j in range(y-1,y+2): if ①______: if a[i][j]==9: count+=1return countimport randomn=10a=[[0 for j in range(10)]for i in range(10)]m=int(input(″输入地雷的个数″))i=0while ix=random.randint(0,9)y=random.randint(0,9)if a[x][y]==0: a[x][y]=9 ②______for i in range(n): for j in range(n): if a[i][j]!=9: ③______for i in range(n): s=″″ for j in range(n): if a[i][j]==9: s=s+″# ″ else: s=s+str(a[i][j])+″″print(s)答案 ①0<=i<10 and 0<=j<10 ②i+=1 ③a[i][j]=Check(a,i,j)解析 本题考查二维数组和枚举算法。程序共分3部分,第1部分生成10×10的矩阵,并随机生成m个地雷,第2部分是统计不是地雷的格子周围有多少地雷,第3部分是输出。②随机生成x,y坐标,若该位置不是雷,则将雷的数量增加1,因此答案为i+=1。①采用枚举算法检测坐标x,y的上一行、当前行和下一行中,左右3列中雷的个数。但要注意边界问题,即必须在矩阵内。③调用自定义函数来检测坐标i,j周围雷的个数。随堂检测3A.数组元素可通过数组名和下标直接访问B.数组中的数据在内存中是按照下标顺序依次存储的C.数组元素的访问必须通过第一个数组元素才能逐步找到目标数组元素D.创建一个数组实质是在系统内存中划分一块连续的区域C解析 本题主要考查的是数组的定义。数组创建后,可以通过数组名和下标直接访问,不需要找到第一个数组元素。因此答案为C。D解析 本题考查循环结构。D选项中变量i已经是列表a中的元素,则最后进行交换的并不是a[i],正确的交换语句为:a[0],i=i,a[0],故选D。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]B解析 p是数组a中元素,即是一个列表,故选B。4.下有如下Python程序段:Cfrom random import randinta=[randint(1,50) for i in range(50)]p=1for j in range(2,50):if abs(a[j]-a[j-1])>abs(a[p]-a[p-1]):p=jans=abs(a[p]-a[p-1])print(p,ans)本程序的功能是( )A.求a[1]至a[50]中的相邻元素的最大差值B.求a[1]至a[50]中的相邻元素的最小差值C.求a[0]至a[49]中的相邻元素的最大差值D.求a[0]至a[49]中的相邻元素的最小差值解析 本题考查数组的基本操作。p的初值为1,使用for循环求出数组元素a[2]~a[49]中相邻元素的最大差值,并用变量p记录元素的位置,因此,最后ans的值为相邻元素中的最大差值,故答案为C。5.在一个6行8列的二维数组a中,每个元素所占空间大小为8个字节,从首地址SA开始连续存放在存储器内。该数组按行优先存储时,元素a[3][4]的起始地址为( )A.SA+224 B.SA+216 C.SA+192 D.SA+176A解析 本题考查二维数组空间相关知识点。元素a[3][4]的起始地址为 SA+8*(24+4)=SA+224。6.有如下 Python 程序:Ba=[12,45,45,63,0,0,63]cnt=0for i in range(1,len(a)): j=i-1 t=a[i] while j>=0 and t>a[j]:a[j+1]=a[j]j=j-1cnt=cnt+1 a[j+1]=tprint(cnt)运行该程序后,输出的结果是( )A.8 B.10 C.11 D.13解析 本题考查插入排序算法。内循环用于查找合适的插入位置,从第2个数据开始插入到合适位置。待插入a[i]暂时存放于变量t中,若 t 比前面的数据 a[j]大,则将数据 a[j]移动到后面,然后继续往前检查直到找到合适的位置将 t 插入。7.有如下Python程序段:B解析 本题考查二维数组。先生成一个1-4,5-8,9-12,13-16的4 行4列的矩阵。外循环for i in range(1,n,2)表示对偶数行进行操作,j和n-j-1表示两个列坐标,且是左右对称的,行坐标保持不变,因此程序的功能是偶数行的数据进行左右水平翻转,奇数行保持不变。n=4a=[[j*n+i+1 for i in range(n)]for j in range(n)]for i in range(1,n,2): for j in range(n∥2): a[i][j],a[i][n-j-1]=a[i][n-j-1],a[i][j]则程序执行后,a[1][1]和a[2][1]的值分别为( )A.6和10 B.7和10 C.6和11 D.7和118.某校图书馆提供 3 类自习室,A 类最多容纳 2 人,B 类最多容纳 4 人,C 类最多容纳 8 人,以 1 小时为单位进行预约,每人每天只能预约一次,每次预约仅限个人,规定预约时间结束之前必须离开。图书馆每天 6 点开馆,22 点闭馆。编写程序,输入某自习室号牌,根据已预约情况,输出该自习室还能被预约的时间段。例:读取“A102”已预约情况[[6,11],[15,18],[8,12],[15,22]],其中“A102”表示为 A 类 102 号自习室,[6,11]表示某个人预约 6:00 开始,11:00 前必须离开,时间占用如图所示,则该自习室还能预约的时间段为[[6,8],[11,15],[18,22]]。请回答下列问题:(1)若“B101”的已预约情况为[[6,11],[8,12],[8,11],[6,12]],则该自习室还能预约的时间段是__________。(时间段格式参照题中样例)(2)实现上述功能的部分 Python 代码如下,请在划线处填入合适的代码。r=input(″输入自习室号牌: ″)#根据自习室号牌 r,获取该自习室可容纳的人数上限和预约情况分别存入 ceil 和 time 中,代码略#如 time=[[6,11],[15,18],[8,12],[15,22]]bucket=[0]*24 #记录该自习室每个时刻被预约的人数for period in time: for i in range(period[0],①______): bucket[i]+=1ans=[]; rec=[]for i in range(6,22): if bucket[i] rec.append(i) if len(rec)==0: print(″该自习室目前没有可预约时段″) else: left,right=0,0 i=1 while i if rec[i]==rec[i-1]+1: ②______ else: ans.append([rec[left],rec[right]+1]) left,right=i,i③______ ans.append([rec[left],rec[right]+1])print(r,″可预约的时间:″,ans)答案 (1)[[6,8],[11,22]] (2)①period[1]②ringt=i或 right+=1 ③i+=1或i=i+1解析 (1)[6,11]表示某个人预约 6:00 开始,11:00 前必须离开,因此6-7点还可以容纳2人,8-10点已经约了4人,11点还可以容纳2人,12-22点还可以容纳4人。(2)①遍历各个预约时间段,将各个预约时刻记录到预约的人数bucket数组中,period表示每个预约时间段,period[0]是预约的开始时间,period[1]是预约的离开时间。②条件bucket[i]4巩固与提升基础巩固能力提升1.有如下Python程序段:C解析 本题考查记数统计。统计奇数位置上4的个数。a=[4,4,4,9,4,9,6,4,4]s=[0,0,0,0,0,0,0,0,0]for i in range(0,len(a),2): s[a[i]]+=1print(s[4])执行程序段,输出结果的是( )A.6 B.5 C.4 D.32.已知二维数组a=[[1,3,5],[2,4,6],[7,8,9]],执行语句s=a[1][2]+a[2][1]后,变量s的值为( )A.5 B.11 C.13 D.14D解析 本题主要考查的是二维数组的运算。a[1][2]是指数组a中第2行第3个元素,即a[1][2]=6, a[2][1]是指数组a中第3行第2个元素,即a[2][1]=8,因此s=14,答案为D。3.有如下Python程序段:Bb=[11,4,17,19,3,8,19,5]k=0for i in range(1,len(b)):if b[i]>b[k]:k=ib.pop(k)程序段执行后,数组b中的元素为( )A.11,4,17,19,3,8,19,5 B.11,4,17,3,8,19,5C.11,4,17,19,3,8,5 D.11,4,17,19,3,8,19解析 本题主要考查的是一维数组的操作。本程序的功能是找出数组b中值最大的元素所在的位置,然后将该位置上的元素从数组b中删除,根据程序代码可知,若值最大的元素有多个时,k记录的是第一个最大值的位置,因此,操作后数组b中的元素为“11,4,17,3,8,19,5”,故答案为B。4.有如下Python程序段:C解析 本题主要考查的是二维数组的操作。本程序的功能是求二维数组中正对角线上的元素之和,即s=2+6+9=17,因此答案为C。s=0a=[[2,8,3],[1,6,4],[5,7,9]]for i in range(3):for j in range(3):if i==j: s=s+a[i][j]程序段执行后,变量s的值为( )A.11 B.14 C.17 D.215.有如下Python程序段:C解析 本题主要考查的是二维数组的定义与赋值。本程序的功能首先为3行4列的二维数组a赋值 [[1,2,3,4],[1,2,3,4],[1,2,3,4]],然后依次给二维数组a加4*i,a[1][2]即为第2行第3列的值为7,故答案为C。a=[[i+1 for i in range(4)] for j in range(3)]for i in range(3):for j in range(4):a[i][j]=a[i][j]+4*i则程序执行后,a[1][2]的值为( )A.2 B.4 C.7 D.86.有如下Python程序段:Anum=[0]*10n=36s=0for i in range(n): j=9 num[j]+=1 while num[j]==2:num[j]=0j-=1num[j]+=1for i in range(10): s+=num[i]print(s)执行此代码后,变量s的值为( )A.2 B.3 C.4 D.5解析 本题主要考查的是数组的应用。题目中的程序实现的是进制数的转换,变量i从 0循环到35,每次循环j从9开始,对该位置上的值加1,当该位置上的值满2时,该位置上的值变为0,向j-1位置上进1。因此程序的功能是将36转成二进制,其值为100100,将二进制位置上的各值进行累加,和为2,答案为A。7.查找素数能够很好地体现出计算机解决某些数学问题的速度优势,除了计算机性能以外,设计更加简单的算法也能够提高计算机解决某些问题的速度。某种素数算法就是通过“开关”的思想,例如求100以内的所有素数,采用数组来表示[1,1,1,……,1,1,1],数组的索引值表示0~99中的每个数,1表示“开”即为素数(先假设都为素数)),从2(0和1不是素数)开始,因为索引2号对应的值为1,则2是素数,再将后面能够被2整除的索引对应的值都改为0,依次类推……以下程序就是采用这种思路编写的输出1000以内的所有素数的程序:lst1=[] # 存放每个数的开关lst2=[] # 存放找到的素数lst1=[1]*1000 # 初始化开关列表for i in range(2,1000):if lst 1[i]==1:lst2.append(i)________: lst1[j]=0print(lst2) # 输出所有1000以内的素数解析 本题主要考查的是数组的应用。按照题意,程序的外层for循环列举所有1000以内的可能素数,作为数组lst1的下标位置,如果该位置对应的数组元素值为1,作为素数存入数组lst2,同时按照素数的性质排除后面的为该素数的整数倍的整数判定为非素数,所以划线处即列举该数的倍数整数,答案为C。上述程序横线处的合适代码为( )A.if lst1[j]%i==0 B.if lst1[i]%i==0C.for j in range(i,1000,i) D.for j in range(i+1,1000,i)C8.某次测试的答题结果存储在asht.txt文件中,该文件每行记录1个考生10道单选题的答案,每题有A,B,C,D四个选项,空白的答案标记为'K'。评分标准:正确得3分,错误得-1分,空白得0分。实现评分的Python程序如下。ANS='ACBBCDADBC' #ANS 为标准答案score=[]for line in open('asht.txt','r'): score.append(0) i=len(score)-1 j=0 while jif ①______: score[i]+=3 elif line[j]!='K': ②______j+=1print(score)(1)若标准答案为:'ACBBCDADBC',则答案'ACBBDDADKC'的得分为________。(2)完善上述①②处代码。答案 (1)23 (2)①line[j]==ANS[j] ②score[i]-=1解析 本题考查顺序查找算法。line表示asht.txt文件中每一条记录,每条记录有10道单选题答案。语句score.append(0)表示每读取一条记录,该列表增加一个值为0的元素,i表示score列表中最后一个元素的索引值。j初值为0,终值为len(ANS)-1,表示在标准答案中比对当前记录中答案,如果line[j]==ANS[j]表示当前答案与标准答案一致,得3分,不正确将扣1分。9.下列程序的功能是:输入一个由大小写字母和数字组成的字符串,统计字符串中出现次数最多的小写字母。程序运行界面如下图所示:实现上述功能的Python程序如下,请在程序划线处填入合适的代码。s=input(″输入字符串:″)a=[0]*26for i in range(len(s)):if ″z″>=s[i]>=″a″:①______a[n]+=1max=0for i in range(26):if a[i]>max:max=a[i]②______print(chr(ord(″a″)+posi),″times:″,max)答案 ①n=ord(s[i])-ord(″a″) ②posi=i解析 本题主要考查的是数组的综合应用。本题的算法思想是:将小写字母a~z出现的次数依次记录在数组元素a[0]~a[25]中,然后求出a[0]~a[25]中的最大值,并记录在变量max中,将字母序号记录在变量posi中,从而求得问题的解。①处代码的功能是求出当前小写字母在字母表中的序号n,因此①处代码为n=ord(s[i])-ord(″a″)。划线②处代码的功能是用posi记录当前出现次数最多的字母在字母表的序号,因此②处代码为posi=i。10.某物品柜有5层,每层有10个格子,每个格子只能放一个物品。输入一组物品的高度值(按降序排列),将这些物品放在同一层的连续格子中。第一步:查找存放物品的格子。从第1层开始查找,若该层物品柜连续空格数量小于物品数量,则查找下一层。查找5层后还是不能找到连续存放位置,输出“不能连续存放”。若在某一层中找到符合要求的连续空格子,则进行第二步:将物品按中间高两端低的原则存放物品。先将高度最高的物品存放在连续空格的中间位置(若空格数量为偶数,则放在中间靠左位置),接着依次将物品按先右后左的顺序依次存放。如输入物品高度为8,5,2,1,则依次放在第1排的第5,6,4,7的位置。第一排各个格子存放物品高度如图所示,其中0表示未存放物品。(1)输入第1组物品高度依次为8,5,2,第2组依次为9,6,3,1,则高度为3的物品存放在第1排第__________(填数字)个格子中。0 0 0 2 8 5 1 0 0 0(2)实现该功能的Python程序段如下,请在程序划线处填入合适的代码。#将已经存放的物品高度存储在数组a中,如:[[0,9,6,2,8,5,1,0,0,0],[0,0,1,7,10,9,2,0,0,0],……],代码略。s=input(″输入一组降序的物品高度,用逗号分开:″)wp=list(map(int,s.split(″,″))) #输入的数字转换成列表flag=False;i=0while i<5 and not flag: beg=0 for j in range(10): if a[i][j]==0: #物品柜格子为0表示没有存放物品 if j-beg+1>=len(wp): hang=i;end=j;flag=True else: if flag : break ①______i+=1if flag:②______a[hang][wz]=wp[0]i=1while iif ③______: wz-=ielse: wz+=ia[hang][wz]=wp[i]i+=1else:print(″不能连续存放″)#输出物品柜的存放情况,代码略答案 (1)7 (2)①beg=j+1 ②wz=(beg+end)∥2 ③i%2==0解析 本题考查二维数组的遍历和在一个序列中查找最值。(1)高度8,5,2依次存放第5、6、4的格子中,因此左边还有3个空格,右边有4个空格。高度9,6,3,1依次存放第8、9、7、10的格子中。(2)①确定连续空格子的最左边位置beg,若格子为空,计算连续空格子数量为j-beg+1,若数量达到存放物品数量时,将flag设置为True。若格子不为空,则下一个空格子的位置只能在当前j的下一个位置。②中间位置的计算方法类似于二分查找,将左右位置相加再整除以2。③语句a[hang][wz]=wp[0]的功能是放置最中间的物品,接下来放在i为1的物品,在中间的右边,即wz等于i+1,当i的值为2时,放在左边的前面2个位置中,因此通过判断变量i的奇偶性来决定存放的位置。11.杨辉三角,是二项式系数在三角形中的一种几何排列,在我国南宋数学家杨辉1261年所编写的《详解九章算法》一书中出现。我们可以把杨辉三角看作这样的图形:最左侧一列数字和右边的斜边数字均为1,内部其他位置上的每个数字均为上一行同一列的数字与上一行前一列数字之和,前10行的杨辉三角如图所示。11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6 15 20 15 6 11 7 21 35 35 21 7 11 8 28 56 70 56 28 8 11 9 36 84 126 126 84 36 9 1为了在计算机存储和处理上述的数据,可用数组表示。实现输出该图形的代码如下,在程序划线处填入适当的语句或表达式,将程序补充完整。n=int(input(″请输入行数n=:″))pa=[1]*100k=1 #变量k存储上一行的下标起始位置for i in range(2,n):t=k+i+1 #变量t存储当前行的下标起始位置for j in range(i-1): pa[t+j]=pa[k+j]+①______k=k+ik=0for i in range(n): #输出第0到n-1共n行的数据s=″″for j in range(i+1): s=s+″ ″+ ②______ k+=1print(s)答案 ①pa[k+j+1] ②str(pa[k])解析 本题主要考查的是数组的综合应用。根据题意分析可知,计算数组的新值可通过上一行两个连续的数组值相加获得,前一个值为pa[k+j],因此①处代码为pa[k+j+1];②处为每一行数据的输出,变量s存储每一行的数据,注意数组pa的类型,需使用str()函数进行转换。12.编写“矩形面积”程序,实现如下功能:随机生成一个包含0或1的10×10的二维数组a;当数组元素的值为0时表示没有障碍物,当数组元素的值为1时有障碍物。寻找阵列中构造出的最大面积的矩形面积和起点坐标。程序运行界面如图所示。(1)实现上述功能的Python程序如下,请在划线处填入合适的代码。(2)程序中加框处代码有错,请改正。 实现上述功能的Python代码如下:def Check(a,x,y): #在数组a中从点x,y开始向右向下查找最大矩形面积i=x;maxx=0;n=10;jn=10while iif ①______: breakj=y+1;s=0while j j+=1②______jn=j #更新右边界,从该位置开始,右边的区域不能计算面积if s>maxx: maxx=si+=1return maxx#产生一个10*10的初值为0的二维数组a,并随机产生若干个障碍物,将数组a中的值修改为1,代码略n=0;maxx=0;px=0;py=0;t=0for i in range(n):for j in range(n): if t>maxx: maxx=t px=i+1 py=j+1print(″构成的最大面积是:″,maxx,″。起点坐标为:″,px,py)答案 (1)①a[i][y]==1 ②s=(i-x+1)*(j-y) ③t=Check(a,i,j) (2)a[i][j]!=1解析 本题考查二维数组和枚举算法。将矩阵的每个点作为起点,从该点开始,不断地向右检测,找到能构成矩形的最右边界,向下检测,找到下边界,计算矩形面积,并找出最大面积。自定义函数功能在数组a中从点x,y开始向右向下查找最大矩形面积,终点坐标是(i,j),先不断地向右查找,若找到1停止,此时的右边界为j-1,再向下一行枚举,若下一行的y位置是1,则不能向下构成矩形,结束查找,因此①表示检测到新行的第1列就是障碍物。②计算矩形面积,表示第x行与第i行,第y列与第j-1列构成的矩形面积。③调用自定义函数计算该坐标开始的最大矩形面积。(2)起点不能是障碍物。课时1 数 组课时目标1.通过案例分析,理解数组的概念和特性。2.掌握数组的基本操作,并能编程解决实际问题。1.数组的概念(1)数组在内存中的存储方式为____________。(2)数组是由____________的变量构成的一个序列。(3)数组名和下标组成数组的各个变量称为数组的分量,也称为____________。(4)创建数组时,系统会在内存中分配一块__________的存储空间,每个数组元素按照________顺序存储。(5)一维数组:只有一个下标,下标用来表示数据元素在该序列中的位置。(6)二维数组:有两个下标,表示数据元素在该序列中的行、列位置,二维数组有行优先存储和列优先存储两种方式。2.数组的特性(1)数组元素的数据类型相同。(2)通过数组名和下标对数组元素的值进行访问。(3)存储空间固定不变。数组创建时就分配好存储空间,即其占用空间就已固定,因此删除数组中的元素后,其占用的空间不变。3.数组的基本操作(1)数组的创建数组的创建实质是在系统内存中划分一块连续区域,用来保存数组所含的所有数据元素。(2)数组元素的访问①数组元素的访问指的是寻址到特定的数据元素,并根据存储地址对该数据元素进行读取、修改等操作。②数组元素可以通过数组名和下标直接进行访问。(3)数组元素的插入与删除①当数组中某个位置要插入一个新数据时,必须先将该位置及后面的所有数据向后移动一个位置,然后将新数据插入。例如,在数组a的1位置插入一个新数据datax,操作后的数组a如下所示。②删除数组元素时,需要将被删除元素位置后的所有元素前移一个位置。例如,删除数组元素a[1]后的数组如下图所示。4.Python列表常用函数和方法在Python中,常用列表来模拟实现数组的操作。Python列表常用函数和方法函数和方法 功能 实例len(list1) 统计列表list1中元素的个数 list1=[1,2,3,4] print(len(list1)),输出为4list1.append(x) 在列表list1末尾添加元素x list1=[1,2,3,4] list1.append(5) 列表中的内容为:[1,2,3,4,5]list1.insert(i,x) 在列表list1中下标为i位置处插入元素x list1=[1,2,3,4] list1.insert(2,5) 列表中的内容为:[1,2,5 3,4]list1.pop(i) 将列表list1中下标为i的元素删除;若i不指定,默认为-1,即删除最后一个元素 list1=[1,2,3,4] list1.pop() 列表中的内容为:[1,2,3]例1 下列有关数组的描述正确的是( )A.数组是由多种不同类型的变量构成的一个序列B.数组是由相同类型的变量构成的一个序列C.一个数组在内存中的存储空间不一定是连续的D.数组在内存中的存储方式为非顺序结构听课笔记: 变式训练 有如下的Python程序段:a=[3,5,7,9,11,13,15]p=2for i in range(p+1,len(a)): a[i-1]=a[i] del a[i] #从列表中删除元素a[i]则与方框中程序段功能相同的语句是(注:pop()删除列表最后一个元素,del()删除列表指定范围元素)( )A.a=a[:p]+a[p+1:] B.a=a[:p]+a[p:]C.a.pop() D.del a[p:]例2 数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤xtemp=a[n-1]for i in range(n-2,x-1,-1): a[x]=tempA.a[i+1]=a[i] B.a[i-1]=a[i]C.a[i]=a[i+1] D.a[i]=a[i-1]听课笔记: 变式训练 若长度为n的线性表采用数组a(a[0]~a[n-l])存储,要删除第t个位置上(存储在a[t-1])的元素,对应的Python程序如下:for i in range(t-1,n-1): ①______划线处的代码应是( )A.a[t]=a[i] B.a[i]=a[i+1]C.a[i]=a[i-1] D.a[i-1]=a[i]例3 已知6行4列的二维数组a以行优先的方式存储在k个连续存储单元中,每个数组元素占8个存储单元,如果已知a[0][0]的首地址为1000,则a[3][2]的首地址为( )A.1112 B.1160 C.1104 D.1080听课笔记: 变式训练 使用列表生成式创建数组的Python代码如下:a=[i*i for i in range(10) if i%2==0]则执行语句print(sum(a[1:-1]))后输出的结果为( )A.20 B.52 C.56 D.116例4 上城小学将在本学期开展趣味运动会,一(10)班的班主任邀请你为他们设计一个Python程序,用于挑选参加集体项目的选手。挑选规则为:当班级有足够候选人员时,进行随机挑选,并输出人员名单;若无足够人员时,提示“无足够候选人员参加比赛!”,并规定每个学生最多参加一个集体项目。程序要求用户按照规范输入比赛项目及相关人员要求,例如输入“投篮:8,2”即篮球项目要求男生8人,女生2人。该程序的运行效果如下图所示:请输入比赛项目及相关人员要求:跳绳:5,5;赶猪:15,15;投篮:8,2 跳绳项目: 男:艾震宇 蔡温淼 叶埕奇 何夫 王子硕 女:王晓清 黄鑫橼 陈佳妮 陈昱彤 陈奕臻 赶猪项目: 无足够候选人员参加比赛! 投篮项目: 男:陈展骢 李俊翰 张子俊 刘泓成 胡海伟 王子涵 叶赛特 伍越 女:贾熙 钱梓涵(1)实现挑选集体项目选手的Python代码如下,程序中用到的列表函数与方法如下表所示,请在划线处填入合适的代码。函数与方法 功能w.append(x) 在列表w末尾添加元素xx=w.pop(i) 将列表w末尾下标为i的元素赋值给x,并将其从w中删除(2)程序加框处代码有误,请改正。from random import shuffledef disp(inf): # 将输入的字符串整理为指定格式,当输入字符串为″跳绳:10,10;投篮:8,2″,则将其调整为{″跳绳″: [10,10],″投篮″: [8,2]}并返回。def player(x,n): #输出列表前n个元素,并删除这些元素,返回删除后的新列表for i in range(n):①____________print(xm,end=″ ″)return x c=[[″陈浩琦″,″男″],[″王慧敏″,″女″],[″王子涵″,″男″],…] #班级学生名单ctemp=[[],[]] #根据学生性别分别存储男生和女生名单for ②____________ in c:if p[1]==″男″: ctemp[0].append(p[0]) #append()函数的功能为在列表末尾插入新元素else: ctemp[1].append(p[0])inf=input(″请输入比赛项目及相关人员要求:″)s=[″男″,″女″]sj=disp(inf)for t in sj: #变量遍历字典中的每个键 if sj[t][0]<=len(ctemp[0]) and sj[t][1]<=len(ctemp[1]):print(t+″项目: ″)for i in ③____________: print(s[i],end=″:″) shuffle(ctemp[i]) #shuffle 用于将序列的所有元素进行随机排序 print()else: print(t+″项目:\\n 无足够候选人员参加比赛!″)听课笔记: 变式训练 生成n颗(n<=30)地雷随机放置在10×10的方格中,方块中出现地雷用#表示,出现数字,则表示在其周围相邻的方块中共有多少颗地雷,中间位置有8个方块相邻,边上位置有5个方块相邻,角上位置有3个方块相邻。程序运行的结果如图所示,请在划线处填入合适的代码。def Check(a,x,y): #统计第x行第y列四周雷的个数count=0for i in range(x-1,x+2):for j in range(y-1,y+2): if ①____________: if a[i][j]==9: count+=1return countimport randomn=10a=[[0 for j in range(10)]for i in range(10)]m=int(input(″输入地雷的个数″))i=0while ix=random.randint(0,9)y=random.randint(0,9)if a[x][y]==0: a[x][y]=9 ②____________for i in range(n): for j in range(n): if a[i][j]!=9: ③____________for i in range(n): s=″″ for j in range(n): if a[i][j]==9: s=s+″# ″ else: s=s+str(a[i][j])+″″print(s)1.下列有关数组的描述中不正确的是( )A.数组元素可通过数组名和下标直接访问B.数组中的数据在内存中是按照下标顺序依次存储的C.数组元素的访问必须通过第一个数组元素才能逐步找到目标数组元素D.创建一个数组实质是在系统内存中划分一块连续的区域2.将一组数保存在数组a中,若a[0]=0,则在列表a中从左到右找到第一个大于零的元素,并与a[0]交换。用Python程序描述,下列选项中不可行的是( )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]4.下有如下Python程序段:from random import randinta=[randint(1,50) for i in range(50)]p=1for j in range(2,50):if abs(a[j]-a[j-1])>abs(a[p]-a[p-1]):p=jans=abs(a[p]-a[p-1])print(p,ans)本程序的功能是( )A.求a[1]至a[50]中的相邻元素的最大差值B.求a[1]至a[50]中的相邻元素的最小差值C.求a[0]至a[49]中的相邻元素的最大差值D.求a[0]至a[49]中的相邻元素的最小差值5.在一个6行8列的二维数组a中,每个元素所占空间大小为8个字节,从首地址SA开始连续存放在存储器内。该数组按行优先存储时,元素a[3][4]的起始地址为( )A.SA+224 B.SA+216 C.SA+192 D.SA+1766.有如下 Python 程序:a=[12,45,45,63,0,0,63]cnt=0for i in range(1,len(a)): j=i-1 t=a[i] while j>=0 and t>a[j]:a[j+1]=a[j]j=j-1cnt=cnt+1 a[j+1]=tprint(cnt)运行该程序后,输出的结果是( )A.8 B.10 C.11 D.137.有如下Python程序段:n=4a=[[j*n+i+1 for i in range(n)]for j in range(n)]for i in range(1,n,2): for j in range(n∥2): a[i][j],a[i][n-j-1]=a[i][n-j-1],a[i][j]则程序执行后,a[1][1]和a[2][1]的值分别为( )A.6和10 B.7和10 C.6和11 D.7和118.某校图书馆提供 3 类自习室,A 类最多容纳 2 人,B 类最多容纳 4 人,C 类最多容纳 8 人,以 1 小时为单位进行预约,每人每天只能预约一次,每次预约仅限个人,规定预约时间结束之前必须离开。图书馆每天 6 点开馆,22 点闭馆。编写程序,输入某自习室号牌,根据已预约情况,输出该自习室还能被预约的时间段。例:读取“A102”已预约情况[[6,11],[15,18],[8,12],[15,22]],其中“A102”表示为 A 类 102 号自习室,[6,11]表示某个人预约 6:00 开始,11:00 前必须离开,时间占用如图所示,则该自习室还能预约的时间段为[[6,8],[11,15],[18,22]]。请回答下列问题:(1)若“B101”的已预约情况为[[6,11],[8,12],[8,11],[6,12]],则该自习室还能预约的时间段是__________。(时间段格式参照题中样例)(2)实现上述功能的部分 Python 代码如下,请在划线处填入合适的代码。r=input(″输入自习室号牌: ″)#根据自习室号牌 r,获取该自习室可容纳的人数上限和预约情况分别存入 ceil 和 time 中,代码略#如 time=[[6,11],[15,18],[8,12],[15,22]]bucket=[0]*24 #记录该自习室每个时刻被预约的人数for period in time: for i in range(period[0],①____________): bucket[i]+=1ans=[]; rec=[]for i in range(6,22): if bucket[i] rec.append(i) if len(rec)==0: print(″该自习室目前没有可预约时段″) else: left,right=0,0 i=1 while i if rec[i]==rec[i-1]+1: ②______________ else: ans.append([rec[left],rec[right]+1]) left,right=i,i ③______________ans.append([rec[left],rec[right]+1])print(r,″可预约的时间:″,ans)课时1 数 组知识梳理1.(1)顺序存储 (2)相同类型 (3)数组元素 (4)连续 下标例题精析例1 B [本题主要考查的是数组的定义。数组是由相同类型的变量构成的一个序列;一个数组在内存中的存储空间一定是连续的;数组在内存中的存储方式为顺序结构;因此答案为B。]变式训练 A [题框中程序相当于把索引p位置以后字符依次前移一个位置,然后把最后一个元素删除,答案A实现同样功能。B内容不变,C只删除了最后一个元素,D则把p及以后元素全部删除了。]例2 A [先将7保存在a[n-1],变量i从n-2遍历到x,将当前位置i后面的值移动到当前位置,故答案为A。]变式训练 B [变量i的值从t-1至n-2,要删除第t个位置上(存储在a[t-1]),将用索引i+1位置上的值覆盖索引i的值。]例3 A [本题考查二维数组的相关知识。以行优先的方式存储,每行共4个数据项,a[3][2]前共有3行2列,因此共3*4+2=14个数据项,共占14*8=112个存储单元,首元素地址为1000,故答案为A。]变式训练 C [当i为偶数时,将i的平方添加到列表a中,因此a中值依次为0,4,16,36,64。表达式sum(a[1:-1])求列表中除头尾元素之外元素之和,答案为C。]例4 (1)①xm=x.pop(0) ②p ③range(len(ctemp))或range(2)(2)ctemp[i]=player(ctemp[i],sj[t][i])解析 本题考查列表的方法实现。(1)①自定义函数player的功能是输出列表前n个元素,并删除这些元素。表中所示x=w.pop(i)将列表w末尾下标为i的元素赋值给x,并将其从w中删除,因此下标i的值为0。②ctemp数组存储男生和女生名单,因此需遍历c数组的每个元素p,并根据p[0]的值进行相应的处理。③分别处理男生和女生的情况,因此需重复2次。(2)player函数是处理一个一维数组,即分别处理男生和女生的名单。变式训练 ①0<=i<10 and 0<=j<10 ②i+=1 ③a[i][j]=Check(a,i,j)解析 本题考查二维数组和枚举算法。程序共分3部分,第1部分生成10×10的矩阵,并随机生成m个地雷,第2部分是统计不是地雷的格子周围有多少地雷,第3部分是输出。②随机生成x,y坐标,若该位置不是雷,则将雷的数量增加1,因此答案为i+=1。①采用枚举算法检测坐标x,y的上一行、当前行和下一行中,左右3列中雷的个数。但要注意边界问题,即必须在矩阵内。③调用自定义函数来检测坐标i,j周围雷的个数。随堂检测1.C [本题主要考查的是数组的定义。数组创建后,可以通过数组名和下标直接访问,不需要找到第一个数组元素。因此答案为C。]2.D [本题考查循环结构。D选项中变量i已经是列表a中的元素,则最后进行交换的并不是a[i],正确的交换语句为:a[0],i=i,a[0],故选D。]3.B [p是数组a中元素,即是一个列表,故选B。]4.C [本题考查数组的基本操作。p的初值为1,使用for循环求出数组元素a[2]~a[49]中相邻元素的最大差值,并用变量p记录元素的位置,因此,最后ans的值为相邻元素中的最大差值,故答案为C。]5.A [本题考查二维数组空间相关知识点。元素a[3][4]的起始地址为 SA+8*(24+4)=SA+224。]6.B [本题考查插入排序算法。内循环用于查找合适的插入位置,从第2个数据开始插入到合适位置。待插入a[i]暂时存放于变量t中,若 t 比前面的数据 a[j]大,则将数据 a[j]移动到后面,然后继续往前检查直到找到合适的位置将 t 插入。]7.B [本题考查二维数组。先生成一个1-4,5-8,9-12,13-16的4 行4列的矩阵。外循环for i in range(1,n,2)表示对偶数行进行操作,j和n-j-1表示两个列坐标,且是左右对称的,行坐标保持不变,因此程序的功能是偶数行的数据进行左右水平翻转,奇数行保持不变。]8.(1)[[6,8],[11,22]] (2)①period[1]②ringt=i或 right+=1 ③i+=1或i=i+1解析 (1)[6,11]表示某个人预约 6:00 开始,11:00 前必须离开,因此6-7点还可以容纳2人,8-10点已经约了4人,11点还可以容纳2人,12-22点还可以容纳4人。(2)①遍历各个预约时间段,将各个预约时刻记录到预约的人数bucket数组中,period表示每个预约时间段,period[0]是预约的开始时间,period[1]是预约的离开时间。②条件bucket[i] 展开更多...... 收起↑ 资源列表 第二章 课时1 数组 学案(含答案).docx 第二章 课时1 数组.pptx