資源簡介 登錄二一教育在線組卷平臺 助您教考全無憂其他典型算法之線性表的應用-專項訓練浙江2022屆選考專用一、其他典型算法之線性表的應用-專項訓練浙江2022屆選考專用【gb】1.(2022高三下·浙江)在一升序數組a中插入一個數x,使數組元素仍保持升序。解決該問題的VB程序段如下,在橫線處應填入的正確語句以實現功能。i=n 'n為數組a中的元素個數do while i>0 anda(i)>x i=i-1loopa(i+1)=x2.(2022高三下·浙江)插入排序的基本思想是:把待排序的數據按其值的大小逐個插入到一個已經排好序的有序序列中,直到所有的數據插入完為止,得到一個新的有序序列。例如,已知待排序的一組數據是60,71,49,11,24,3,66。假設在排序過程中,前3個數據已完成升序排列,構成一個有序序列49,60,71。將待排序數據中的第4個數據(即11)插入上述有序序列,以得到一個新的含4個數據的有序序列。首先,應找到11的插入位置,再進行插入??梢詫?1放入數組的第一個元素r(0)中,這個元素稱為監視哨,然后從71起從右到左查找,11小于71,將71右移一個位置,11小于60,又將60右移一個位置,11小于49,又再將49右移一個位置,這時再將11與r(0)的值比較,11≥r(0),它的插入位置就是r(1)。假設11大于第一個值r(1),它的插入位置應該在r(1)和r(2)之間,由于60已經右移了,留出來的位置正好留給11,后面的數據依照同樣的方法逐個插入到該有序序列中。若數據有n個,須進行n-1趟排序,才能完成。以下VB程序執行后,數組元素a(1)的值是( )a(1)=10:a(2)=18:a(3)=12:a(4)=6:a(5)=9for i=2 to 5a(0)=a(i)j=i-1do while a(0)>a(j)a(j+1)=a(j)j=j-1loopa(j+1)=a(0)next iA.10 B.18 C.6 D.93.(2022高三下·浙江)n個人排成一個圓圈,然后把這n個人按逆時針方向分別編號為1、2、…、n。從編號為1的人開始按逆時針計數,當某人計數為m的倍數時,該人出圈;如此循環下去,直到圈中只有一個人留下。現用VB6制作一個模擬報數出列的程序,程序界面如下圖所示:在文本框Text1中輸入人數n,在文本框Text2中輸入出列號m,單擊按鈕模擬報數Command1,在列表框List1中顯示出列順序編號,程序界面如下。實現上述功能的VB 代碼如下, 請在劃線處填入合適代碼。Private Sub Command1_Click()Dim n As Integer, m As IntegerDim a(1 To 100) As Integern = Val(Text1.Text)m = Val(Text2.Text)For i = 1 To n Next is = 0j = 0Do While s < nt = 0Do While t t = t + a(j)Loopa(j) = 0List1.AddItem Str(j)s = s + 1LoopText3.Text = Str(j)End Sub4.(2022高三下·浙江)利用VB程序將兩組成績數據合并為一組并按成績從高到低排列輸出。成績相同時,第一批學生優先輸出。實現上述功能的VB代碼如下,但加框處代碼有錯,請改正:Dim xm(1 to 1000) asstring '存儲學生姓名Dim cj(1 to 1000) asinteger '存儲學生成績Private SubForm_Load() '該處具體代碼省略'從數據庫讀取兩批學生數據第1批學生的人數rs1,按成績從高到低的順序將成績存入cj(1)、cj(2)…cj(rs1)中,姓名存入xm(1)、xm(2)…xm(rs1)中,第2批人數rs2,按成績從高到低的順序將成績存入cj(rs1+1)、cj(rs1+2)…cj(rs1+rs2)中,姓名存入xm(rs1+1)、xm(rs1+2)…xm(rs1+rs2)中End SubPrivate SubCommand1_Click()i=1j=rs1+1'以下程序開始按成績高低逐個輸出,每次輸出前后兩段中,尚未處理的學生中成績最高的n=1 '①Do While i<=rs1 And j<=rs1+rs2 '兩段都有未輸出的情況,輸出兩段中最大值n=n+1If cj(i)>=cj(j) Thenk=i:i=i+1Elsek=j: j=j+1End IfList1.AddItem(″第″+Str(n)+″名″+xm(k)+″成績:″+Str(cj(k)))LoopDo While i<=rs1 '剩下第一段還有未輸出的,逐個輸出n=n+1List1.AddItem(″第″+Str(n)+″名″+xm(i)+″成績:″+Str(cj(i)))i=i+1LoopDo While j<=rs2 '②若第二段還有未輸出的,逐個輸出n=n+1List1.AddItem(″第″+Str(n)+″名″+xm(j)+″成績:″+Str(cj(j)))j=j+1LoopEnd Sub5.(2022高三下·浙江)編寫一個VB程序,將一個長度為n的有序序列a(1)、a(2)、……a(n),以整數t(1≤t≤n)將該有序序列劃分為兩段,并將序列a的前t個數與后n-t個數對調,且保持這兩段(t個數和n-t個數)之間的相對位置不變(即t個數和n-t個數各自有序)。例如,長度為6的有序序列38、42、59、61、69、78,當t=2時重排結果為59、61、69、78、38、42。程序運行時產生n個整數存儲在數組a中,在文本框Text1中輸入t,單擊“對調”按鈕Command1,在列表框List2輸出t個數與n-t個數對調后的數字序列。為了實現上述功能,請在劃線處填入合適的代碼。Const n=10Dim a(1 To 10) As IntegerPrivate SubForm_Load()'生成n個有序數,顯示在List1中,代碼略End SubPrivate SubCommand1_Click()Dim t As Integer,i As Integer,j As Integer,temp As Integer For i=t+1 To ntemp=a(i)For j=i To i+1-t Step-1 Next ja(j)= Next iFor i=1 To nList2.AddItem Str(a(i))NextiEnd Sub6.(2022高三下·浙江)單循環賽制是一種較為公平合理的比賽制度,比賽過程中所有參賽隊伍均能相遇一次。其秩序編排可采用“逆時針輪轉方法”:數字1~n依次作為隊伍編號,把編號按U型走向分成均等兩邊(若n為奇數,則在末尾增加編號0,使總數為偶數),即可得到第一輪的比賽秩序,例如,5個隊伍的比賽編排情況如圖a所示;第二輪,固定編號1,其余編號均按逆時針方向移動一個位置,即為該輪比賽秩序;以后各輪比賽秩序以此類推,與編號0對陣的表示本輪輪空。現用VB程序實現上述功能:在文本框Text1中輸入參賽隊伍數n,單擊“編排”按鈕Command1,在列表圖a 圖b框List1中輸出每輪比賽秩序。程序運行效果如圖b所示。實現上述功能的VB代碼如下,但加框處代碼有錯,請改正。Private Sub Command1_Click( )Dim team(1 To 20) As String '存儲各隊伍編號Dim n As Integer,c As Integer,result As StringDim i As Integer,j As Integer,temp As Stringn=Val(Text1.Text)For i=1 To nteam(i)=Str(i)Next ic=n+n Mod 2 '變量c存儲比賽編排的隊伍總數If c<>n Then team(c)=Str(0)For i=1 To c-1result=″ ″For j=1 To c\2result=result & team(j) & ″-″& & ″;″ ' Next jList1.AddItem ″第″ & Str(i) & ″ 輪″ & result'固定編號1,其余隊伍逆時針移動一個位置temp=team(c)For j=c To 2 Step -1' Next jteam(2)=tempNext iEnd Sub7.(2022高三下·浙江)小李同學碰到了一個數學問題:400個同學按順序進行編號后圍成一個大圈,按1至2報數(從1號位置開始),報到2的同學出列,以此一直循環報數下去,問最后剩下的那位同學他的編號是幾號 例如以6個同學編號為例,按1至2報數(從1號位置開始)依次出列的編號次序為2-4-6-3-1-5,那么最后剩下的就是編號為5的同學。為了解決這個問題,小李用VB編寫了如下程序嘗試解決,其中列表List1顯示出列的順序編號,文本框Text1中顯示最后留下的編號,程序代碼如下,請在劃線處填入合適的代碼。Private SubCommand1_Click()Dim s,f,t As IntegerDim a(1 To 400) As BooleanFor i=1 To 400a(i)=FalseNext is=0:f=0:i=0Do While f<399i=i+1If i=401 Then i= If a(i)=False Then s=s+1If s=2 Then List1.AddItem Str(i)a(i)=Truef= End IfLoopFor i=1 To 400If ThenText1.Text=Str(i)Next iEnd Sub8.(2022高三下·浙江)有n個互不重復的數字,值的范圍是[1,n],分別保存在數組元素a(1)到a(n)中,如果數字i保存在a(i),認為數字i在正確的位置上。若干個相互占用了位置的數字稱為一組,一個在正確位置上的數字單獨為一組,比如6個數字2,3,1,4,6,5分別保存在數組元素a(1)到a(6)中,則2、3、1為一組,4為一組,6、5為一組。該程序的功能為輸出每組的情況。運行界面如下圖:(1)數組元素a(1)到a(5)的值分別為2、5、3、1、4,這5個元素總共有 組。(2)請在劃線處填入合適的代碼。Const n=10Dim a(1 To n) AsInteger '保存原始數據Dim b(1 To n) AsBoolean '數組b用來標記相應的位置有沒有找過Private SubCommand1_Click()Dim iAs Integer, sum As Integer, total As Integersum=0:total=1 'total表示第幾組i=1List2.Addltem″第″+Str(total)+″組″DoWhile sumDo While Not b(i)List2.Addltem a(i)b(i)=True sum=sum+1LoopIfsum List2.Addltem″第″+Str(total)+″組″i=1DoWhile b(i) '該循環用來查找下一組的開始位置i=i+1LoopEndIfLoopEnd SubPrivate SubForm_Load()Dim iAs IntegerRandomizeFori=1 To n '產生n個不一樣的整數,范圍為[1,n]a(i)=Int(Rnd n)+1DoWhile a(i)=Int(Rnd n)+1LoopNextiFori=1 To nList1.Addltema(i)b(i)=FalseNextiEnd SubFunction f(x As Integer,y AsInteger) As Boolean'該函數的功能:判斷x和數組a中前y個數有沒有重復Dim jAs Integerf=FalseForj=1 To yIfa(j)=x Then f=True:Exit ForNextiEnd Function9.(2022高三下·浙江)平面上有N(3≤N≤100)個房間圍成一圈,按順時針方向分別編號為1、2……N,相鄰的兩個房間之間均有一扇門,第i個房間居住人數為a(i)。初始時選擇一個房間,將所有人都聚集在該房間,接著每個人都按順時針方向走到相鄰的房間,直到走到居住的房間。一個人每經過一扇門花費1能量,請確定初始房間,使得所有人花費的能量和最小。例如:N=5,a(1)=4,a(2)=7,a(3)=8,a(4)=6,a(5)=4最佳方案:初始時所有人聚集在2號房間,花費的能量和:7 0+8 1+6 2+4 3+4 4=48。為了解決這個問題,小明編寫了一個VB程序。在窗體加載時,從數據庫中讀取N的值和編號為1到N的房間的居住人數,人數存儲在數組a中。點擊窗體上的按鈕Command1,程序枚舉每一種方案(不同的初始房間),計算該方案的能量和,在文本框Text1中輸出最優方案的初始房間編號,在文本框Text2中輸出最小能量和。實現上述功能的VB代碼如下,請在劃線處填入合適代碼。Dim a(1 To 100) AsInteger '依次存儲編號為1到100的房間居住人數Private Sub Form_Load()'本過程從數據庫中讀取N的值和每個房間居住人數,存儲在數組a中'代碼略End SubPrivate SubCommand1_Click()Dim iAs Integer,j As Integer,w As Integer,k as IntegerDim t As Long,ansAs Longk=0:ans=32767'ans 初始化為最大的Integer數據Fori=1 To nt=0Forj=0 To n-1w= If w=0 Then w=nt= Next jIftk=ians=tEnd IfNext iText1.Text=Str(k) '起始房間編號Text2.Text= End Sub答案解析部分1.【答案】a(i+1)=a(i)【考點】循環結構語句及程序實現【解析】【解答】這是在一線性表中插入一元素的問題,該算法的基本方法是先找到數據插入的位置i,把原有元素a(i)、a(i+1)、a(i+2)…a(n)依次移到表中的第i+1、i+2、i+3…n+1個位置,以便騰出一個空位置i,再把新元素存入到該位置上。本程序的循環部分即完成了位置的查找和原數據后移的功能,因此劃線處應填入的語句是a(i+1)=a(i)。故答案為:a(i+1)=a(i)。【分析】本題主要考查的是循環結構及線性表的應用。2.【答案】B【考點】排序算法及程序實現【解析】【解答】這是一個插入排序的算法,a(0)是待插入的數據。在do循環中,把小于待插入數a(0)的元素往后移動,最后留出空位存放a(0),說明這是一個降序方式的插入排序算法,所以,a(1)中存放的是最大值18。故答案選B。【分析】本題考查的是插入排序。3.【答案】a(i)=1;j = j Mod n + 1 或者 if j=n then n=1 else j=j+1【考點】循環結構語句及程序實現【解析】【解答】本題算法思想是:先設數組a的每個元素值為1;然后從第1個元素開始累加,累加結果存入變量t,當累加到j號元素時如果t值為3,則置a(j)=0,即j號出列,出列人數加1,一直到出列人數為n時結束,此時的j值即為最后剩下的編號。第一空:把每個元素的值設為1,表示未出列,可填入語句a(i)=1。第二空:計算本次輪到的元素下標,可填入j = j Mod n + 1,也可以是if j=n then n=1 else j=j+1。故答案為:【分析】本題主要考查的是線性表的應用。模擬報數是一種典型的線性表應用,程序中使用一維數組表示鏈表,數組元素下標即編號。4.【答案】n=0|j<=rs1+rs2【考點】分支結構語句及程序實現;循環結構語句及程序實現【解析】【解答】第一空:程序中,變量n表示名次,在第1個do循環語句中,先對n加1,再輸出名次,所以n的初值應為0。第二空:變量j第二段成績的位置,第二段成績到rs1+rs2為止,所以循環條件應為j<=rs1+rs2。故答案為:n=0、j<=rs1+rs2。【分析】本題主要考查的是線性表的應用。5.【答案】t=Val(Text1.Text);a(j)=a(j-1);temp【考點】分支結構語句及程序實現;循環結構語句及程序實現【解析】【解答】第一空:根據題目意思,要將有序數組a分成兩段,對換位置,首先要讀入數據t。故答案為:t=Val(Text1.Text)。第二空:程序為了實現數組a的1→t位置和t+1→n位置的互換,使用雙重循環來解決這個問題,具體做法是:第1輪(i=t+1),把a(1)~a(t)依次后移一個位置,再把a(t+1)存入a(1);第2輪(i=t+2),把a(2)~a(t+1)依次后移一個位置,再把a(t+2)存入a(2);如此重復,直到最后一輪(i=n),把a(t)~a(n-1)依次后移一個位置,再把a(n)存入a(t)。所以程序第2空應該完成j-1位置到j位置的數據移動。故答案為:a(j)=a(j-1)。第三空:當完成t個數據的移動后,a(j)應該等于原來存放在temp中的a(i)的值。故答案為:temp。【分析】本題主要考查的是程序的分析與設計。6.【答案】team(c-j+1);team(j)=team(j-1)【考點】分支結構語句及程序實現;循環結構語句及程序實現【解析】【解答】程序以數組team來存儲隊伍的編號,初始的時候team(i)的值就是i,用模擬法來分析算法,以6個隊伍為例,初始編號為1、2、3、4、5、6,程序始終以位置1-6、2-5、3-4的值來組成對陣表,第2輪編號變成1、6、2、3、4、5,那么位置1-6、2-5、3-4所表示的對陣表為1-5、6-4、2-3,第3輪1、5、6、2、3、4,那么位置1-6、2-5、3-4所表示的對陣表為1-4、5-3、6-2,……依次類推。第一個加框處:根據算法描述,以6個隊伍來模擬的話,兩個對陣的隊伍對陣始終以數組team的1-6、2-5、3-4位置的值,下標之和是7(即c+1),所以與team(j)對陣的應該是team(c-j+1)。第二個加框處:固定編號1,其余隊伍移動的時候,先把最后一個位置的值拿出來存放到temp,把數組team的2到c-1位置的值逐個往后移動,存儲到3到c的位置,由于本程序用的是c到2的循環,當j=c的時候,應該是把c-1位置的值存儲到c位置,j=2時,應該是把2位置的值存儲到3位置,所以程序應改成team(j)=team(j-1)。【分析】本題考查的是程序的分析。7.【答案】1;s=0;f+1;Not a(i)或a(i)=False【考點】分支結構語句及程序實現;循環結構語句及程序實現【解析】【解答】400人圍成一圈從1號開始,1,2,1,2…的報數,報到2的就出列,直到剩下最后一位同學,定義一個a數組,元素的初值均為false,表示游戲一開始時所有學生全未出列,亦即開始時全在列。設置變量s初值為零,接著從1號開始兩個兩個的數,只要計數器s等于2,當前這位報到2的就出列,數組a當前元素值變為True,表示該位同學出列,計數器s重置為零,計數器f表示到當前為止已經出列的人數,以此一直循環到只剩下一位同學,f的最大值為399,a(289)=false最后剩下289號同學。故答案為:1、s=0、f+1、Not a(i)或a(i)=False。【分析】本題主要考查的是程序分析。8.【答案】(1)2(2)i=a(i);total=total+1;f(a(i),i-1)或f(a(i),i-1)=True【考點】過程與自定義函數;分支結構語句及程序實現;循環結構語句及程序實現【解析】9.【答案】(i+j) Mod n|t+a(w)*j|Str(ans)【考點】分支結構語句及程序實現;循環結構語句及程序實現【解析】二一教育在線組卷平臺(zujuan.21cnjy.com)自動生成 1 / 1登錄二一教育在線組卷平臺 助您教考全無憂其他典型算法之線性表的應用-專項訓練浙江2022屆選考專用一、其他典型算法之線性表的應用-專項訓練浙江2022屆選考專用【gb】1.(2022高三下·浙江)在一升序數組a中插入一個數x,使數組元素仍保持升序。解決該問題的VB程序段如下,在橫線處應填入的正確語句以實現功能。i=n 'n為數組a中的元素個數do while i>0 anda(i)>x i=i-1loopa(i+1)=x【答案】a(i+1)=a(i)【考點】循環結構語句及程序實現【解析】【解答】這是在一線性表中插入一元素的問題,該算法的基本方法是先找到數據插入的位置i,把原有元素a(i)、a(i+1)、a(i+2)…a(n)依次移到表中的第i+1、i+2、i+3…n+1個位置,以便騰出一個空位置i,再把新元素存入到該位置上。本程序的循環部分即完成了位置的查找和原數據后移的功能,因此劃線處應填入的語句是a(i+1)=a(i)。故答案為:a(i+1)=a(i)。【分析】本題主要考查的是循環結構及線性表的應用。2.(2022高三下·浙江)插入排序的基本思想是:把待排序的數據按其值的大小逐個插入到一個已經排好序的有序序列中,直到所有的數據插入完為止,得到一個新的有序序列。例如,已知待排序的一組數據是60,71,49,11,24,3,66。假設在排序過程中,前3個數據已完成升序排列,構成一個有序序列49,60,71。將待排序數據中的第4個數據(即11)插入上述有序序列,以得到一個新的含4個數據的有序序列。首先,應找到11的插入位置,再進行插入??梢詫?1放入數組的第一個元素r(0)中,這個元素稱為監視哨,然后從71起從右到左查找,11小于71,將71右移一個位置,11小于60,又將60右移一個位置,11小于49,又再將49右移一個位置,這時再將11與r(0)的值比較,11≥r(0),它的插入位置就是r(1)。假設11大于第一個值r(1),它的插入位置應該在r(1)和r(2)之間,由于60已經右移了,留出來的位置正好留給11,后面的數據依照同樣的方法逐個插入到該有序序列中。若數據有n個,須進行n-1趟排序,才能完成。以下VB程序執行后,數組元素a(1)的值是( )a(1)=10:a(2)=18:a(3)=12:a(4)=6:a(5)=9for i=2 to 5a(0)=a(i)j=i-1do while a(0)>a(j)a(j+1)=a(j)j=j-1loopa(j+1)=a(0)next iA.10 B.18 C.6 D.9【答案】B【考點】排序算法及程序實現【解析】【解答】這是一個插入排序的算法,a(0)是待插入的數據。在do循環中,把小于待插入數a(0)的元素往后移動,最后留出空位存放a(0),說明這是一個降序方式的插入排序算法,所以,a(1)中存放的是最大值18。故答案選B。【分析】本題考查的是插入排序。3.(2022高三下·浙江)n個人排成一個圓圈,然后把這n個人按逆時針方向分別編號為1、2、…、n。從編號為1的人開始按逆時針計數,當某人計數為m的倍數時,該人出圈;如此循環下去,直到圈中只有一個人留下。現用VB6制作一個模擬報數出列的程序,程序界面如下圖所示:在文本框Text1中輸入人數n,在文本框Text2中輸入出列號m,單擊按鈕模擬報數Command1,在列表框List1中顯示出列順序編號,程序界面如下。實現上述功能的VB 代碼如下, 請在劃線處填入合適代碼。Private Sub Command1_Click()Dim n As Integer, m As IntegerDim a(1 To 100) As Integern = Val(Text1.Text)m = Val(Text2.Text)For i = 1 To n Next is = 0j = 0Do While s < nt = 0Do While t t = t + a(j)Loopa(j) = 0List1.AddItem Str(j)s = s + 1LoopText3.Text = Str(j)End Sub【答案】a(i)=1;j = j Mod n + 1 或者 if j=n then n=1 else j=j+1【考點】循環結構語句及程序實現【解析】【解答】本題算法思想是:先設數組a的每個元素值為1;然后從第1個元素開始累加,累加結果存入變量t,當累加到j號元素時如果t值為3,則置a(j)=0,即j號出列,出列人數加1,一直到出列人數為n時結束,此時的j值即為最后剩下的編號。第一空:把每個元素的值設為1,表示未出列,可填入語句a(i)=1。第二空:計算本次輪到的元素下標,可填入j = j Mod n + 1,也可以是if j=n then n=1 else j=j+1。故答案為:【分析】本題主要考查的是線性表的應用。模擬報數是一種典型的線性表應用,程序中使用一維數組表示鏈表,數組元素下標即編號。4.(2022高三下·浙江)利用VB程序將兩組成績數據合并為一組并按成績從高到低排列輸出。成績相同時,第一批學生優先輸出。實現上述功能的VB代碼如下,但加框處代碼有錯,請改正:Dim xm(1 to 1000) asstring '存儲學生姓名Dim cj(1 to 1000) asinteger '存儲學生成績Private SubForm_Load() '該處具體代碼省略'從數據庫讀取兩批學生數據第1批學生的人數rs1,按成績從高到低的順序將成績存入cj(1)、cj(2)…cj(rs1)中,姓名存入xm(1)、xm(2)…xm(rs1)中,第2批人數rs2,按成績從高到低的順序將成績存入cj(rs1+1)、cj(rs1+2)…cj(rs1+rs2)中,姓名存入xm(rs1+1)、xm(rs1+2)…xm(rs1+rs2)中End SubPrivate SubCommand1_Click()i=1j=rs1+1'以下程序開始按成績高低逐個輸出,每次輸出前后兩段中,尚未處理的學生中成績最高的n=1 '①Do While i<=rs1 And j<=rs1+rs2 '兩段都有未輸出的情況,輸出兩段中最大值n=n+1If cj(i)>=cj(j) Thenk=i:i=i+1Elsek=j: j=j+1End IfList1.AddItem(″第″+Str(n)+″名″+xm(k)+″成績:″+Str(cj(k)))LoopDo While i<=rs1 '剩下第一段還有未輸出的,逐個輸出n=n+1List1.AddItem(″第″+Str(n)+″名″+xm(i)+″成績:″+Str(cj(i)))i=i+1LoopDo While j<=rs2 '②若第二段還有未輸出的,逐個輸出n=n+1List1.AddItem(″第″+Str(n)+″名″+xm(j)+″成績:″+Str(cj(j)))j=j+1LoopEnd Sub【答案】n=0|j<=rs1+rs2【考點】分支結構語句及程序實現;循環結構語句及程序實現【解析】【解答】第一空:程序中,變量n表示名次,在第1個do循環語句中,先對n加1,再輸出名次,所以n的初值應為0。第二空:變量j第二段成績的位置,第二段成績到rs1+rs2為止,所以循環條件應為j<=rs1+rs2。故答案為:n=0、j<=rs1+rs2。【分析】本題主要考查的是線性表的應用。5.(2022高三下·浙江)編寫一個VB程序,將一個長度為n的有序序列a(1)、a(2)、……a(n),以整數t(1≤t≤n)將該有序序列劃分為兩段,并將序列a的前t個數與后n-t個數對調,且保持這兩段(t個數和n-t個數)之間的相對位置不變(即t個數和n-t個數各自有序)。例如,長度為6的有序序列38、42、59、61、69、78,當t=2時重排結果為59、61、69、78、38、42。程序運行時產生n個整數存儲在數組a中,在文本框Text1中輸入t,單擊“對調”按鈕Command1,在列表框List2輸出t個數與n-t個數對調后的數字序列。為了實現上述功能,請在劃線處填入合適的代碼。Const n=10Dim a(1 To 10) As IntegerPrivate SubForm_Load()'生成n個有序數,顯示在List1中,代碼略End SubPrivate SubCommand1_Click()Dim t As Integer,i As Integer,j As Integer,temp As Integer For i=t+1 To ntemp=a(i)For j=i To i+1-t Step-1 Next ja(j)= Next iFor i=1 To nList2.AddItem Str(a(i))NextiEnd Sub【答案】t=Val(Text1.Text);a(j)=a(j-1);temp【考點】分支結構語句及程序實現;循環結構語句及程序實現【解析】【解答】第一空:根據題目意思,要將有序數組a分成兩段,對換位置,首先要讀入數據t。故答案為:t=Val(Text1.Text)。第二空:程序為了實現數組a的1→t位置和t+1→n位置的互換,使用雙重循環來解決這個問題,具體做法是:第1輪(i=t+1),把a(1)~a(t)依次后移一個位置,再把a(t+1)存入a(1);第2輪(i=t+2),把a(2)~a(t+1)依次后移一個位置,再把a(t+2)存入a(2);如此重復,直到最后一輪(i=n),把a(t)~a(n-1)依次后移一個位置,再把a(n)存入a(t)。所以程序第2空應該完成j-1位置到j位置的數據移動。故答案為:a(j)=a(j-1)。第三空:當完成t個數據的移動后,a(j)應該等于原來存放在temp中的a(i)的值。故答案為:temp。【分析】本題主要考查的是程序的分析與設計。6.(2022高三下·浙江)單循環賽制是一種較為公平合理的比賽制度,比賽過程中所有參賽隊伍均能相遇一次。其秩序編排可采用“逆時針輪轉方法”:數字1~n依次作為隊伍編號,把編號按U型走向分成均等兩邊(若n為奇數,則在末尾增加編號0,使總數為偶數),即可得到第一輪的比賽秩序,例如,5個隊伍的比賽編排情況如圖a所示;第二輪,固定編號1,其余編號均按逆時針方向移動一個位置,即為該輪比賽秩序;以后各輪比賽秩序以此類推,與編號0對陣的表示本輪輪空。現用VB程序實現上述功能:在文本框Text1中輸入參賽隊伍數n,單擊“編排”按鈕Command1,在列表圖a 圖b框List1中輸出每輪比賽秩序。程序運行效果如圖b所示。實現上述功能的VB代碼如下,但加框處代碼有錯,請改正。Private Sub Command1_Click( )Dim team(1 To 20) As String '存儲各隊伍編號Dim n As Integer,c As Integer,result As StringDim i As Integer,j As Integer,temp As Stringn=Val(Text1.Text)For i=1 To nteam(i)=Str(i)Next ic=n+n Mod 2 '變量c存儲比賽編排的隊伍總數If c<>n Then team(c)=Str(0)For i=1 To c-1result=″ ″For j=1 To c\2result=result & team(j) & ″-″& & ″;″ ' Next jList1.AddItem ″第″ & Str(i) & ″ 輪″ & result'固定編號1,其余隊伍逆時針移動一個位置temp=team(c)For j=c To 2 Step -1' Next jteam(2)=tempNext iEnd Sub【答案】team(c-j+1);team(j)=team(j-1)【考點】分支結構語句及程序實現;循環結構語句及程序實現【解析】【解答】程序以數組team來存儲隊伍的編號,初始的時候team(i)的值就是i,用模擬法來分析算法,以6個隊伍為例,初始編號為1、2、3、4、5、6,程序始終以位置1-6、2-5、3-4的值來組成對陣表,第2輪編號變成1、6、2、3、4、5,那么位置1-6、2-5、3-4所表示的對陣表為1-5、6-4、2-3,第3輪1、5、6、2、3、4,那么位置1-6、2-5、3-4所表示的對陣表為1-4、5-3、6-2,……依次類推。第一個加框處:根據算法描述,以6個隊伍來模擬的話,兩個對陣的隊伍對陣始終以數組team的1-6、2-5、3-4位置的值,下標之和是7(即c+1),所以與team(j)對陣的應該是team(c-j+1)。第二個加框處:固定編號1,其余隊伍移動的時候,先把最后一個位置的值拿出來存放到temp,把數組team的2到c-1位置的值逐個往后移動,存儲到3到c的位置,由于本程序用的是c到2的循環,當j=c的時候,應該是把c-1位置的值存儲到c位置,j=2時,應該是把2位置的值存儲到3位置,所以程序應改成team(j)=team(j-1)。【分析】本題考查的是程序的分析。7.(2022高三下·浙江)小李同學碰到了一個數學問題:400個同學按順序進行編號后圍成一個大圈,按1至2報數(從1號位置開始),報到2的同學出列,以此一直循環報數下去,問最后剩下的那位同學他的編號是幾號 例如以6個同學編號為例,按1至2報數(從1號位置開始)依次出列的編號次序為2-4-6-3-1-5,那么最后剩下的就是編號為5的同學。為了解決這個問題,小李用VB編寫了如下程序嘗試解決,其中列表List1顯示出列的順序編號,文本框Text1中顯示最后留下的編號,程序代碼如下,請在劃線處填入合適的代碼。Private SubCommand1_Click()Dim s,f,t As IntegerDim a(1 To 400) As BooleanFor i=1 To 400a(i)=FalseNext is=0:f=0:i=0Do While f<399i=i+1If i=401 Then i= If a(i)=False Then s=s+1If s=2 Then List1.AddItem Str(i)a(i)=Truef= End IfLoopFor i=1 To 400If ThenText1.Text=Str(i)Next iEnd Sub【答案】1;s=0;f+1;Not a(i)或a(i)=False【考點】分支結構語句及程序實現;循環結構語句及程序實現【解析】【解答】400人圍成一圈從1號開始,1,2,1,2…的報數,報到2的就出列,直到剩下最后一位同學,定義一個a數組,元素的初值均為false,表示游戲一開始時所有學生全未出列,亦即開始時全在列。設置變量s初值為零,接著從1號開始兩個兩個的數,只要計數器s等于2,當前這位報到2的就出列,數組a當前元素值變為True,表示該位同學出列,計數器s重置為零,計數器f表示到當前為止已經出列的人數,以此一直循環到只剩下一位同學,f的最大值為399,a(289)=false最后剩下289號同學。故答案為:1、s=0、f+1、Not a(i)或a(i)=False。【分析】本題主要考查的是程序分析。8.(2022高三下·浙江)有n個互不重復的數字,值的范圍是[1,n],分別保存在數組元素a(1)到a(n)中,如果數字i保存在a(i),認為數字i在正確的位置上。若干個相互占用了位置的數字稱為一組,一個在正確位置上的數字單獨為一組,比如6個數字2,3,1,4,6,5分別保存在數組元素a(1)到a(6)中,則2、3、1為一組,4為一組,6、5為一組。該程序的功能為輸出每組的情況。運行界面如下圖:(1)數組元素a(1)到a(5)的值分別為2、5、3、1、4,這5個元素總共有 組。(2)請在劃線處填入合適的代碼。Const n=10Dim a(1 To n) AsInteger '保存原始數據Dim b(1 To n) AsBoolean '數組b用來標記相應的位置有沒有找過Private SubCommand1_Click()Dim iAs Integer, sum As Integer, total As Integersum=0:total=1 'total表示第幾組i=1List2.Addltem″第″+Str(total)+″組″DoWhile sumDo While Not b(i)List2.Addltem a(i)b(i)=True sum=sum+1LoopIfsum List2.Addltem″第″+Str(total)+″組″i=1DoWhile b(i) '該循環用來查找下一組的開始位置i=i+1LoopEndIfLoopEnd SubPrivate SubForm_Load()Dim iAs IntegerRandomizeFori=1 To n '產生n個不一樣的整數,范圍為[1,n]a(i)=Int(Rnd n)+1DoWhile a(i)=Int(Rnd n)+1LoopNextiFori=1 To nList1.Addltema(i)b(i)=FalseNextiEnd SubFunction f(x As Integer,y AsInteger) As Boolean'該函數的功能:判斷x和數組a中前y個數有沒有重復Dim jAs Integerf=FalseForj=1 To yIfa(j)=x Then f=True:Exit ForNextiEnd Function【答案】(1)2(2)i=a(i);total=total+1;f(a(i),i-1)或f(a(i),i-1)=True【考點】過程與自定義函數;分支結構語句及程序實現;循環結構語句及程序實現【解析】9.(2022高三下·浙江)平面上有N(3≤N≤100)個房間圍成一圈,按順時針方向分別編號為1、2……N,相鄰的兩個房間之間均有一扇門,第i個房間居住人數為a(i)。初始時選擇一個房間,將所有人都聚集在該房間,接著每個人都按順時針方向走到相鄰的房間,直到走到居住的房間。一個人每經過一扇門花費1能量,請確定初始房間,使得所有人花費的能量和最小。例如:N=5,a(1)=4,a(2)=7,a(3)=8,a(4)=6,a(5)=4最佳方案:初始時所有人聚集在2號房間,花費的能量和:7 0+8 1+6 2+4 3+4 4=48。為了解決這個問題,小明編寫了一個VB程序。在窗體加載時,從數據庫中讀取N的值和編號為1到N的房間的居住人數,人數存儲在數組a中。點擊窗體上的按鈕Command1,程序枚舉每一種方案(不同的初始房間),計算該方案的能量和,在文本框Text1中輸出最優方案的初始房間編號,在文本框Text2中輸出最小能量和。實現上述功能的VB代碼如下,請在劃線處填入合適代碼。Dim a(1 To 100) AsInteger '依次存儲編號為1到100的房間居住人數Private Sub Form_Load()'本過程從數據庫中讀取N的值和每個房間居住人數,存儲在數組a中'代碼略End SubPrivate SubCommand1_Click()Dim iAs Integer,j As Integer,w As Integer,k as IntegerDim t As Long,ansAs Longk=0:ans=32767'ans 初始化為最大的Integer數據Fori=1 To nt=0Forj=0 To n-1w= If w=0 Then w=nt= Next jIftk=ians=tEnd IfNext iText1.Text=Str(k) '起始房間編號Text2.Text= End Sub【答案】(i+j) Mod n|t+a(w)*j|Str(ans)【考點】分支結構語句及程序實現;循環結構語句及程序實現【解析】二一教育在線組卷平臺(zujuan.21cnjy.com)自動生成 1 / 1 展開更多...... 收起↑ 資源列表 其他典型算法之線性表的應用-專項訓練浙江2022屆選考專用(學生版).docx 其他典型算法之線性表的應用-專項訓練浙江2022屆選考專用(教師版).docx 縮略圖、資源來源于二一教育資源庫