資源簡介 (共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 縮略圖、資源來源于二一教育資源庫