資源簡介 第九單元 算法的程序實現單元小結知識系統構建第九單元 算法的程序實現單元檢測題組時間:40分鐘 分值:50分一、選擇題(每題3分,共27分)1.對包含100個元素遞增排序的數組a,采用對分查找法找某關鍵字,若查找不成功,則關鍵字的比較次數最多是( )A.100 B.6 C.7 D.8答案 C 本題考查對分查找的基本原理。n個元素中查找不成功的最多比較次數為[log2n]+1。2.有如下某排序算法程序段:For i=1 To 3 k=i For j=i+1 To 6 If a(j) > a(k) Then k=j Next j t=a(i):a(i)=a(k):a(k)=tNext i數組元素a(1)到a(6)的值依次為“8,2,9,3,5,1”,經過該程序段“加工”后,數組元素a(1)到a(5)的值依次為( )A.8,2,9,3,5,1 B.9,2,8,3,5,1C.9,8,5,2,3,1 D.9,8,5,3,2,1答案 D 本題考查排序算法及其程序的實現。i=1時,代入循環體,計算得到數組元素的值依次為9,2,8,3,5,1。i=2時,代入循環體,計算得到數組元素的值依次為9,8,2,3,5,1。i=3時,代入循環體,計算得到數組元素的值依次為9,8,5,3,2,1。3.某VB程序段如下:For i=1 To 6 j=7 Do While j > i If a(j)>a(j-1) Then a(j)=a(j)+a(j-1) a(j-1)=a(j)-a(j–1) a(j)=a(j)-a(j-1) End If j=j-1 LoopNext iFor i=3 To 6 s=s+a(i)Next iLabel1. Caption=Str(s)已知數組元素a(l)到a(7)的值依次為“8, 2, 3, 7, 10, 6, 5”,則執行該程序段后,標簽Label1中顯示的是( )A.21 B.26 C.41 D.18答案 A 首先理解 a(j)=a(j)+a(j-1),a(j-1)=a(j)-a(j-1),a(j)=a(j)-a(j-1)這三個語句實際上就是將a(j)與 a(j-1)兩數據交換。兩數交換的經典寫法是:t=a,a=b,b=t。程序首先實現數組a中的數據降序,得到“10,8,7,6,5,3,2”,而后將 a(3),a(4),a(5),a(6)的值相加輸出。4.有如下程序段:Dim a(4) As IntegerPrivate Sub Command1_Click() Dim s As Stringa(1)=10:a(2)=30:a(3)=20:a(4)=40 s=doit(4) Label1.Caption=sEnd SubFunction doit(k As Integer) As String If k=1 Then doit=Str(a(1)) Else doit=doit(k-1) & Str(a(k)) End IfEnd Function程序運行后,標簽Label1中顯示的內容是( )A.10 20 30 40 B.10 30 20 40C.40 30 20 10 D.40 20 30 10答案 B 本題考查遞歸程序。遞歸調用過程如下:5.用以下對分查找算法:在一個包含有重復元素且從小到大排序(相等元素排在一起)的整數數組a中,查找某個重復出現的整數key,其中數組元素的總個數是n。i=1: j=nDo While i <=j m=(i+j) 2 If a(m) < key Then i=m+1 Else j=m-1 End IfLoop那么執行該程序后,下列說法正確的是( )A.程序可以找到重復元素key最開始出現的位置,該位置信息由變量i指示B.程序可以找到重復元素key最后出現的位置,該位置信息由變量i指示C.程序可以找到重復元素key最開始出現的位置,該位置信息由變量j指示D.程序可以找到重復元素key最后出現的位置,該位置信息由變量j指示答案 A 本題考查對分查找算法的理解和應用。由程序可知,當i≤j時程序要循環,而循環時,當a(m)≥key時,變量j移動,這就表明當找到key時,指示變量j勢必會跑到key所在位置的前面去,key所在位置由i來指示。由升序排序和j的移動方向可知,這是起始位置。6.有以下VB程序段i=1: j=10: flag=True: cs=0Key=Int(Rnd()*10)+28Do While i <=j And flag=True m=(i+j) 2 : cs=cs+1 If a (m)=Key Then flag=False Else If a(m) < Key Then i=m+1 Else j=m-1 End IfLoop數組元素a(1)到a(10)依次是3 10 17 23 27 30 35 40 45 50,變量cs的值可能是( )A.1或2 B.2或3C.3或4 D.4或5答案 C 本題考查對分查找,key=Int(Rnd() * 10)+28即產生[28,37]的隨機整數。cs表示查找次數,10個數查找過程如下(只需要考慮28至37范圍內的數):3101723273035404550①③④②因此三次(如30)、四次(如35)都可能,找不到的情況也可能是三次(如28)或四次(如33),10個數不管找不找得到,最多查找次數不超過int(log210)+1=4次。7.有如下程序段:For i=1 To 2 k=i For j=i+1 To 5 If d(k) < d(j) Then k=j Next j If k <> i Then t=d(k): d(k)=d(i) :d(i)=tNext i經過該程序段“加工”后,數組元素d(1)到d(5)的值依次為“44, 35, 30, 11,7”,則數組元素d(1)到d(5)的原始數據依次為( )A.30,44,7,11,35 B.30,11,44,7,35C.44,30,11,7,35 D.30,7,44,11,35答案 D 該段程序僅進行了兩趟排序,數據就已完成降序排序。而選項 A 需要三趟,B、C兩個選項都需要四趟才能使數據完成降序排序。 所以答案選 D。8.有如下VB程序段:i=1j=6s=“”Key=Text1. TextDo While i <=j m=Int((i+j) / 2+0. 5) s=s+“ ”+a(m) If Key > a(m) Then i=m+1 Else j=m-1 End IfLoopText1. Text=s數組元素a(1)到a(6)的值分別為“Beijing”“Guangdong”“Jiangsu” “Jiangxi”“Shanghai” “Zhejiang”,己按字典序排序。當key的值為“Zhejiang”時,單擊命令按鈕Command1,文本框Text1中顯示的內容為( )A.Jiangxi ZhejiangB.Jiangsu Shanghai Jiangxi ZhejiangC.Jiangxi Zhejiang ShanghaiD.Jiangsu Shanghai Zhejiang答案 C 本題考查對分查找,第一次查找時i=1,j=6,得到m=4,因此s=“Jiangxi”,因為key>a(m),因此第二次查找時i=5,j=6,得到m=6,因此s=“Jiangxi Zhejiang”,此時key=a(m),執行j=m-1=5;因此第三次查找時i=5,j=5,得到m=5,因此s=“Jiangxi Zhejiang Shanghai”,此時key>a(m),因此執行i=m+1=6,此時i>j,退出循環。所以答案選擇C。9.有如下VB程序段:s=“7218634594” : n=Len(s): c=0For i=1 To n-1 a(i)=Val(Mid(s, i, 2))Next iFor i=1 To n-2 Step 2 k=i For j=i+2 To n-1 Step 2 If a(j) < a(k) Then k=j Next j If k <> i Then t=a(i): a(i)=a(k): a(k)=t: c=c+1 End IfNext iText1.Text=Str(c)該程序段運行后,Text1中顯示的內容是( )A.1 B.2 C.3 D.4答案 B 首先獲取 a數組的各元素為72,21,18,86,63,34,45,59,94。然后從外層For i=1 To n-2 Step 2看出,僅對奇數位上的數據排序。變量c統計排序過程中數據交換的次數。第一趟排序,數據“ 72 ”與“ 18 ”交換。第二趟排序,數據“ 72 ”與“ 45 ”交換。而后奇數位上的數據已有序。 所以答案選 B。二、非選擇題(共23分)10.現有n根棍子,第i根棍子的長度為ai。想要從中選出三根棍子組成周長盡可能長的三角形,輸出最大的周長;若無法組成三角形,則輸出0。如當n=5,a={2,3,4,5,10}時,輸出12,即選擇了3、4、5。當n=4,a={4,5,10,20}時,無法組成三角形,輸出0。加框處代碼有誤,請改正。Dim a(1 To 1000) As IntegerDim n As IntegerPrivate Sub Form_Load()’確定 n 的值和數組 a 的各個元素值,即每根棍子的長度值,代碼略End SubFunction max(x As Integer , y As Integer) As IntegerIf x > y Then max=x Else max=y End IfEnd FunctionPrivate Sub Command1_Click() Dim i As Integer , j As Integer , k As Integer Dim ans As Integer , c As Integer , longest As Integer , rest As Integerans=0 ’讓 i For i=1 To n For j=i+1 To n For k=j+1 To n c=a(i)+a(j)+a(k) longest=max(longest, c) ’① rest=c-longest ’rest 保存最短的兩條邊的和 If ans > c Then ’② ans=max(ans , c)End If Next kNext j Next iPrint ansEnd Sub答案?、賛ax(a(i), max(a(j), a(k)))(或其他寫法) ②rest > longest解析 由三重For循環和變量c的組成可以判斷這是一個枚舉算法,c是當前枚舉到的周長。而由程序的輸出可知ans是最長的周長,顯然要找到最大值,需要比較,還有一個很重要的條件就是三條邊可以組成三角形。大小比較的任務已經由ans=max(ans,c)來完成,那么第②空就是判斷能否成為三角形的條件。這里可以寫成a(i)+a(j)>a(k)&a(i)+a(k)>a(j) &a(j)+a(k)>a(i)的復合表達式,但由前面的rest=c-longest可以猜測出longest保存了最長邊,而rest是剩余兩邊之和。于是第②空的條件可以簡單地變成最短兩邊之和大于最長邊,即rest>longest。而第①空就是a(i),a(j),a(k)三者的最大值,可以迭代調用函數max(),即現調用任意兩個,再調用第3個,如max(max(a(i),a(j)),a(k))或者任意交換這三個變量的書寫位置都可以。11.小王編寫“合并區間” VB程序,功能如下:窗體加載時,獲取并存儲合并前的區間數據,并顯示在列表框List1中。單擊“合并”按鈕后,以區間左端點數值對區間進行升序排序,然后相鄰區間的相交進行合并,最后在列表框List2上顯示合并后的區間。程序運行如圖所示:實現以上功能的VB程序如下,在橫處填入合適的代碼。Dim a(1 To 20) As Integer ??存儲區間的左端點數值Dim b(1 To 20) As Integer ??存儲區間的右端點數值Private Sub Form_Load()’將區間左端點存入數組a,區間右端點存入數組b,并在列表框List1顯示,代碼略End SubPrivate Sub Command1_Click()Dim i As Integer, j As IntegerDim curL As Integer, curR As IntegerFor i=1 To n-1 For j=l To n-i If ① Then? t=a(j): a(j)=a(j+1): a(j+1)=t t=b(j): b(j)=b(j+1): b(j+1)=t End If Next jNext icurL=a(1): curR=b(1)For i=2 To n If ?、凇hen? If curR < b(i) Then?、邸? Else List2.AddItem“["+Str(curL)+Str(curR)+"]” curL=a(i): curR=b(i) End IfNext iList2. AddItem “[”+Str(curL)+Str(curR)+“]”End Sub答案?、賏(j) > a(j+1)?、赼(i) <=curR?、踓urR=b(i)解析 第①空,以區間左端點數值,即數組a,對區間進行升序排序。第②空和第③空,這是需要合并區間的情況,首先理解變量 curR 的含義,curR 表示第i個區間的上一個區間的右端點數值。因此如果當前區間的左端點數值即a(i)<=curR,而當前區間的右端點數值即b(i)>curR時,上一個區間與當前區間就可以合并。因此第②空填a(i) <=curR。第③空是合并后,右區間curR則等于第 i 個區間右端點數值。12.插數。輸入一個整數x,要將x插入到n(n<50)個有序(按降序排列)數據中,并使數據序列仍保持有序,試求出x應插入的位置。界面設計如圖所示。程序說明:(1)其中n由文本框Text1中數據得到,x由文本框Text2中數據得到,插入位置顯示在文本框Text3中。(2)其中n個有序數據將通過隨機函數Rnd產生,并對n個數進行降序排序后存入數組a中,同時顯示在列表框List1中。為了實現這一目標,完善下面的VB程序,在橫線處填入合適的語句或表達式,完成程序設計。Private Sub Command1_Click() Dim a(1 To 50)As Integer Dim n As Integer,i As Integer Dim x As Integer,temp As Integer Randomize List1.Clear n=Val(Text1.Text) x=Val(Text2.Text)’隨機產生n個數,并存放至a數組中 For i=1 To n a(i)=Rnd*200+1Next i’將數組a中的數按降序排序For i=2 To n For j=n To i Step-1 If (1) Then?temp=a(j):a(j)=a(j-1):a(j-1)=tempNext jNext i’將排序后的數組元素顯示在列表框List1中For i=1 To n List1.AddItem Str(a(i))Next i’插入操作If (2) Then? i=n+1Else (3) ? Do While x i=i+1 LoopEnd if’在文本框Text3中顯示插入位置Text3 Text=Str(i)End Sub(1) 。?(2) 。?(3) 。?答案 (1)a(j)>a(j-1) (2)x<=a(n) (3)i=1解析 本題主要考查排序算法的程序實現。(1)本題采用了冒泡排序。冒泡排序的算法特點是相鄰兩個元素的兩兩比較,并根據需要交換,代碼中a(j)與a(j-1)的交換語句說明該程序采用了冒泡排序。因為是降序排序,因此大的數在前,小的數在后,如果次序反了,則需要交換兩數。因此該處應該填:a(j)>a(j-1)。(2)變量i用于存儲x應該插入的位置。由于數據源是從大到小排列,因此如果x小于或等于數據源中最后一個數據,則它應該插在最后面,這是最簡單的情況。該數據源總共有n個數,最后一個數據是a(n)。因此如果x≤a(n),則i=n+1。(3)如果x比數據源中最后一個數據要大,那么就要尋找它合適的位置。方法是通過循環語句,將x與該數列中的每一個數據a(i)比較,如果xa(i),則當前的i值就是x該插入的位置。13.n個數據的冒泡升序排序需要經過n-1遍的加工,每一遍加工自下而上比較相鄰兩個數據,把較小者交換到上面,在第i遍加工過程中需要進行n-i對數據的比較。在某些情況下,第i遍加工過程中,在上面部分較小數據已經有序的情況下,不需要再進行n-i對數據的比較。如對“17, 18,19, 24, 23, 20”這6個數據排序中,第1遍排序結束后數據為“17, 18,19, 20, 24, 23”,第2遍排序時不再需要對20及其前面3個數據進行比較。以下程序實現了冒泡排序的優化,在橫處填入合適的代碼。Dim n As IntegerDim a(1 To 100) As Integer’n=10,排序前生成的數據存儲在數組a中,并在列表框List1中顯示,代碼略Private Sub Command1_Click() Dim i As Integer, j As Integer, start As Integer, t As Integer i=2 Do While i < n start=n For j=n To i Step-1 If?、佟hen? t=a(j):a(j)=a(j-1):a(j-1)=t ② ? End If Next j i=start+1 Loop For i=1 To n List2.AddItem ③ ? Next iEnd Sub答案?、賏(j) < a(j-1) ② start=j?、?Str(a(i))解析 第①空,從圖中得知程序要實現升序排序,所以只有當后面的數據小于前面的數據時才需要數據交換,而從后面交換的語句中可以看出是 a(j) 與 a(j-1)交換,所以填 a(j) < a(j-1)。第②空,冒泡升序排序優化即每一趟排序記錄下最后一個數據交換的位置,那么下一趟排序時就不需要對該位置前面的數據進行比較了。因此把每一趟的最后一個數據交換的位置定義為下一趟排序時的結束位置,所以 start=j 。第③空, 列表框中輸出排序好的數組 a,同時注意列表框輸出結果是字符串類型。14.查找最接近的數。編寫一個查找最接近的數的VB程序:程序運行時,在文本框Text1中輸入產生隨機數的個數(1到100之間),單擊命令按鈕“產生隨機數并升序排列”后,在列表框List1中顯示已經按升序排列后的隨機整數。然后在文本框Text2中輸入要查找的整數,單擊命令按鈕“查找”后,在標簽Label3中顯示隨機整數序列中與待查找數最接近的整數(當最接近的數有2個時,輸出較大的一個)。程序運行效果如圖所示。實現上述功能的VB代碼如下,請在橫線處填入合適代碼。Dim n As Integer ’存儲隨機數的個數Dim f(1 To 100) As Boolean ’f (i)為true時表示隨機整數i已經產生過Dim a(1 To 100) As Integer ’依次存放升序排序后的n個隨機數Private Sub Command1_Click()’命令按鈕“產生隨機數并升序排列”的單擊事件Dim i As IntegerRandomizeFor i=1 To 100 f(i)=FalseNext in=Val(Text1. Text)For i=1 To n t=Int(Rnd * 100+1) Do While f(i)=True t=Int (Rnd * 100+1) Loop ?、佟?Next ij=0For i=1 To 100??實現排序并輸出 If f(i)=True Then ?、凇? a(j)=i List1.AddItem Str(i) End IfNext iEnd SubPrivate Sub Command2_Click()??命令按鈕“查找”的單擊事件Dim key As Integerkey=Val(Text2. Text)If key <=a(1) Then Label3. Caption=Str(a(1)) : Exit SubIf key >=a(n) Then Label3. Caption=Str(a(n)) : Exit SubL=1: R=nDo While L <=R??找到與key較為接近的兩個數a(R)和a(L) m=(L+R) 2 If key <=a(m) Then R=m-1 Else L=m+1 End IfLoopIf?、邸hen ??在a(R)和a(L)中選出更接近key的數? Label3. Caption=Str(a(R))Else Label3. Caption=Str(a(L))End IfEnd Sub答案?、?f(t)=True ②j=j+1 ③Abs(a(R)-key) < Abs(a(L)-key)解析 ①處根據題干可知該處為產生不重復的隨機數,產生之后將對應的f數組內的值改為 True,標記該數字已產生,故①f(t)=True,②將產生的數依次輸出,故②j=j+1,③通過對分查找到二個數 a(R)、 a(L),判別更接近key的數。故③Abs(a(R)-key) < Abs(a(L)-key)。15.有100個大小形狀一樣的玻璃球,其中有1個玻璃球的重量輕于其他99個玻璃球,如何用一臺無砝碼的天平,以最快的速度找出這個輕玻璃球?運用“三分篩選”法來模擬“尋找”這個輕玻璃球的算法如下:步驟1:如果待篩選的玻璃球個數<3,則認定己經找出了這個玻璃球(認定方法參照步驟2中描述), 停止篩選,并輸出經過的篩選總次數;否則,重復執行步驟2。步驟2:按編號依次將玻璃球均分成3份,如果有多余的放入第3份中;比較第1、2份的玻璃球重量:①如果第1份等于第2份的重量,則選取第3份的玻璃球作為下一次篩選的對象;②如果第1份小于第2份的重量,則選取第1份的玻璃球作為下一次篩選的對象;③如果第1份大于第2份的重量,則選取第2份的玻璃球作為下一次篩選的對象;重復執行步驟1。例如:第1次篩選的小球編號區間是1~100,均分成三份的待稱重小球編號分別是1~33、34~66、67~100;第 2次則選取以上3份中的一份進行再篩選、再均分……直至找到。解決上述問題的VB程序功能如下:運行程序,在列表框List1中顯示100組數據,分別代表每個編號及對應的小球重量(其中有且只有一個小球的重量與其他小球不同),單擊“篩選”按鈕Command1,在列表框 List2中顯示每次篩選的編號區間和完成篩選的總次數。程序運行界面如圖。(1)如果編號為88的小球是最輕的,按照題中給定算法,找到此小球需經歷的篩選次數是 次。?(2)實現上述功能的VB程序如下,請在橫線處填入合適的代碼。Const maxn=100Dim a(1 To maxn) As IntegerDim w(1 To 2) As Integer ??數組w用來存儲第1份和第2份小球的重量Private Sub Form Load()??此處代碼用來模擬產生100個小球的重量,分別存儲在數組元素a(1)~a(100)中;??其中只有1個小球的重量為8,隨機存儲在數組a的某元素中,其余重量均為10;??此處代碼略End SubPrivate Sub Command1_Click()Dim left As Integer, right As Integer ??left 為起始編號,right 為結束編號Dim s As Integer, c As Integer ??s為每次查找的區間長度left=1: right=maxnc=1: s=right: i=0List2. AddItem Str (i+1)+“--->”+Str(maxn)Do While right-left > 3 w(1)=0: w(2)=0: k=1 i=left s= ① ? Do While i<=(s 3) * 2+left-1??Do語句用于將待篩選的數據進行區域劃分 w(k)=w(k)+a(i) If i=(s 3) * k+left-1 Then k=k+1 i=i+1 Loop If w(1)=w(2) Then left=left+(s 3) * 2 Elself w(1) < w(2) Then ② ? Else right=left+(s 3) *2-1 left=s 3+left End If ③ ?List2. AddItem Str(left) &“--->” & Str(right)LoopList2. AddItem “經過” +Str (c)+“次后找到”End Sub答案 (1)5 (2) ①right-left+1 ②right=s 3+(left-1) ③c=c+1解析 (1)處根據題干第一次查找范圍[1,100],第二次查找范圍[67,100],第三次查找范圍[78,88],第四次查找范圍[84,88],第五次查找范圍[86,88],區間長度小于等于3,結束,故為5次。(2)①處為賦值區間長度的初始值,故①right-left+1,②為當第一份小于第二份的情況,待查找在第一份里找,賦值右端點值,故②right=s 3+(left-1),③為滿足一次區間相關次數加1故③c=c+1。16.活動課上,n個學生要兩兩組隊進行拔河比賽,要求每個小組總體重不超過120kg,小林想知道最多可以組成多少個隊伍,并希望得到可行的組隊方案。于是設計了如下界面的程序,在文本框Text1中輸入n 個學生的體重(數字之間用逗號隔開),單擊“隊伍”按鈕Command1后在標簽Label1上顯示最多可組隊數量,同時在列表框List1輸出方案。實現上述功能程序如下,在橫線處填入合適的代碼。Dim n As IntegerDim a(1 To 50) As IntegerSub makedata(s As String) ??該過程實現將輸入的體重分別存入數組a中Dim in As Long, x As Long, c As String, i As Integerm=Len (s) : n=0For i=1 To m c=Mid(s, i, 1) If c >=“0” And c <=“9” Then ?、佟 ? x=x+Asc(c)-Asc(“0”) Else If x > 0 Then n=n+1: a(n)=x x=0 End IfNext in=n+1: a(n)=xEnd SubPrivate Sub Command1_Click()Dim s As String, i As Integer, j As Integer, t As IntegerDim cnt As Integer, st As Integer, ed As Integers=Text1.Text Call makedata(s) ??調用過程For i=1 To n-1??實現降序排序For j=n To i+1 Step-1If ?、凇 hen?a(j)=a(j)+a(j-l) : a(j-l)=a(j)-a(j-l) : ③ ? End If Next jNext i??下列程序段實現計算最多可組隊伍cnt=0: st=1: ed=nDo While st < ed If a(st)+a(ecl) <=120 Then List1. AddItem Str(a(st))+“和”+Str(a(ed))+“組隊” cnt=cnt+1 st=st+1 ?、堋 ? Else st=st+1 End IfLoopLabel2. Caption=“最多可以組”+Str (cnt)+“組隊伍”End Sub答案?、?x=x * 10?、?a(j) > a(j-1) ③ a(j)=a(j)-a(j-1) ④ ed=ed-1解析 第①空,變量 c 為文本框中截取下來的每一個字符,如果截取下來的字符是數字,那么通過它的ASCII 碼值減去數字“0”的 ASCII 碼值求得該數值存儲在變量 x 中,x=x+Asc(c)-Asc(“0”),如果截取下來的下一個字符還是數字,那么 x 需要乘以 10 變成十位上的一個數,即 x=x * 10,然后與新截取下來的數值相加 x=x+Asc(c)-Asc(“0”),得到一個兩位數的體重存儲在變量 x 中。第②空,冒泡排序,降序,從后往前,相鄰兩數比較大小,后面的數大于前面的數時需要交換,即 a(j) > a(j-1)。第③空,數據 a(j) 與 a(j-1)交換。第④空, 組隊伍, 第一個數據與最后一個數據加起來如果小于 120 那么可以組一隊。 組隊后組數加 1,即 cnt=cnt+1,同時指向下一組數據的位置,即起始位置往后移一個 st=st+1,終止位置往前移一個 ed=ed-1。 展開更多...... 收起↑ 資源列表 單元小結.docx 單元檢測題組.docx 縮略圖、資源來源于二一教育資源庫