資源簡(jiǎn)介 (共98張PPT)考點(diǎn)一????解析算法及程序?qū)崿F(xiàn)考向基礎(chǔ)1.解析算法的基本思想用解析的方法找出表示問(wèn)題的前提條件與所求結(jié)果之間關(guān)系的數(shù)學(xué)表達(dá)式,并通過(guò)數(shù)學(xué)表達(dá)式的計(jì)算來(lái)實(shí)現(xiàn)問(wèn)題的求解。如:已知圓的半徑為r,求圓的面積s,則可通過(guò)公式s=3.14*r*r計(jì)算得到。2.解析算法的程序?qū)崿F(xiàn)(1)分析問(wèn)題,建立正確的數(shù)學(xué)模型,找到數(shù)學(xué)計(jì)算式或數(shù)學(xué)算法。要注意的是,有些問(wèn)題能找到一個(gè)明確的公式,但是有些問(wèn)題可能是一個(gè)運(yùn)算過(guò)程,比如除二倒取余法求二進(jìn)制,輾轉(zhuǎn)相除法求最大公約數(shù)等問(wèn)題。考點(diǎn)清單(2)將數(shù)學(xué)計(jì)算或數(shù)學(xué)算法轉(zhuǎn)化為VB運(yùn)算過(guò)程。考向突破解析算法一般難度不大,重點(diǎn)題型是各種進(jìn)制之間的相互轉(zhuǎn)換。例1 將十進(jìn)制數(shù)轉(zhuǎn)化為二進(jìn)制數(shù)的VB 程序段如下:Dim y As Integer, s As String, r As Integery=Val(Text1.Text) ’輸入十進(jìn)制數(shù)s="" ????Do While y <> 0LoopText2.Text=s ’顯示二進(jìn)制數(shù)方框中的代碼由以下三部分組成:①s=Str(r)+s ②y=y\2③r=y Mod 2代碼順序正確的選項(xiàng)是?( )A.②③① B.②①③C.①③② D.③②①解析 本題采用“除2取余法”將十進(jìn)制轉(zhuǎn)換成二進(jìn)制,先求余數(shù)(Mod運(yùn)算)并保存,再求商(整除 \),商用來(lái)下一次求余數(shù)。重復(fù)執(zhí)行該過(guò)程直到商為0。答案????D例2 輾轉(zhuǎn)相除法是數(shù)學(xué)史中著名的算法,用于計(jì)算兩個(gè)正整數(shù)a和b的最大公約數(shù)。步驟如下: 現(xiàn)編寫(xiě)程序,在文本框Text1和Text2中輸入a和b,在文本框Text3中輸出兩數(shù)的最大公約數(shù)。代碼如下:Private Sub Command1_Click()Dim a As Integer, b As Integer, r As Integer變量 a b 余數(shù) 初始值 24 15 9 第一次輾轉(zhuǎn) 15 9 6 第二次輾轉(zhuǎn) 9 6 3 第三次輾轉(zhuǎn) 6 3 0 余數(shù)為0時(shí)終止,最大公約數(shù)為3 a=Val(Text1.Text)b=Val(Text2.Text)r=a Mod bDo While ①???? a=b b=r r=a Mod bLoopText3.Text= ②????End Sub解析 ①循環(huán)結(jié)束條件是r=0,因此循環(huán)條件是r>0 或 r<>0。②退出循環(huán)后,結(jié)果存在變量b中。答案?、賠>0 ②str(b)考點(diǎn)二????枚舉算法及程序?qū)崿F(xiàn)考向基礎(chǔ)1.枚舉算法的基本思想將問(wèn)題的可能解一一列舉,逐個(gè)判斷,找到所有符合條件的解。即使中途找到符合的解也要繼續(xù)找下去,要將所有可能解找完才結(jié)束。設(shè)計(jì)枚舉算法時(shí)要盡量減小羅列范圍(提高算法的效率),不能遺漏,也不能重復(fù)。2.枚舉算法的程序?qū)崿F(xiàn)根據(jù)枚舉算法的主要思想:一一列舉,逐個(gè)判斷。因此一般情況下枚舉算法的代碼具有以下特點(diǎn):(1)用循環(huán)語(yǔ)句在一定范圍內(nèi)列舉所有可能的解。(2)用選擇語(yǔ)句判斷和選擇真正的解。枚舉算法的一般格式:For(列舉所有可能的解)If 可能解是正確解 Then 輸出該解或計(jì)數(shù)Next注意:循環(huán)語(yǔ)句不一定用For語(yǔ)句,也可用Do語(yǔ)句。3.多變量列舉某些枚舉算法的問(wèn)題比較復(fù)雜,可能有多個(gè)變量需要列舉,此時(shí)就需要多重循環(huán),也即循環(huán)嵌套。格式如下:For(列舉變量1所有可能的解)For(列舉變量2所有可能的解) ????…… If 該組解是正確解 Then 輸出該組解或計(jì)數(shù) ????……NextNext如雞兔同籠問(wèn)題、百雞百錢(qián)問(wèn)題等。在設(shè)定多個(gè)變量的列舉范圍時(shí),可以利用驗(yàn)證條件,盡可能縮小列舉范圍,減少列舉變量,從而減少循環(huán)的嵌套。如百雞百錢(qián)問(wèn)題:100元錢(qián)買(mǎi)100只雞,公雞5元一只,母雞3元一只,小雞1元3只。則代碼如下:For x=1 To 100For y=1 To 100 For z=1 To 100 If x+y+z=100 And 5*x+3*y+z/3=100 Then 輸出該組解或計(jì)數(shù) Next zNext yNext x利用驗(yàn)證條件,代碼可優(yōu)化為:For x=1 To 20 ’公雞最多不超過(guò)20只For y=1 To 33 ’母雞最多不超過(guò)33只z=100-x-yIf 5*x+3*y+z/3=100 Then 輸出該組解或計(jì)數(shù)Next yNext x例 尋找3位的水仙花數(shù)。什么是水仙花數(shù)?水仙花數(shù)是指一個(gè) n 位數(shù)(n≥3),它的每一位上的數(shù)字的 n 次冪之和等于它本身。例如153是水仙花數(shù),因?yàn)?3+53+33=153。解決此問(wèn)題的Visual Basic程序如下,程序界面如圖所示,在列表框List1中輸出結(jié)果。?在(1)和(2)劃線處,填入合適的語(yǔ)句或表達(dá)式,把程序補(bǔ)充完整。Private Sub Command1_Click()Dim i As IntegerDim a,b,c As IntegerFor (1)???? a=i\100 b=i\10 Mod 10 c=i Mod 10 If (2) ???? Then List1.AddItem Str(i)NextEnd Sub(1)程序中劃線處(1)應(yīng)填入 ????。(2)程序中劃線處(2)應(yīng)填入 ????。解析 (1)枚舉算法在列舉的過(guò)程中,不能遺漏任何一個(gè)可能的解,尋找3位的水仙花數(shù),100到999都是可能解。因此列舉所有可能解的語(yǔ)句應(yīng)該是For i=100 To 999。(2)If語(yǔ)句用于檢驗(yàn)當(dāng)前列舉的可能解i是不是正確解。水仙花數(shù)的驗(yàn)證條件:它的每一位上的數(shù)字的n次冪之和等于它本身,本程序要求找出3位的水仙花數(shù),因此n=3,變量a、b、c是i的百位、十位和個(gè)位上的數(shù)字,因此驗(yàn)證條件是a^3+b^3+c^3=i。答案 (1)i=100 To 999 (2)a^3+b^3+c^3=i考向突破從目前出現(xiàn)的真題看,直接考枚舉算法的不多,常考字符串的處理,一般題型為:輸入一串字符串,字符串中有一些特殊字符做為間隔符號(hào),利用該間隔符號(hào),將字符串中的字符提取,并作進(jìn)一步的數(shù)據(jù)分析或處理。從代碼特點(diǎn)和思想方法上分析,該類(lèi)問(wèn)題也利用了枚舉算法的思想。一、字符串問(wèn)題相關(guān)知識(shí)1.字符大小的比較字符(包括字符串)在計(jì)算機(jī)中存儲(chǔ)的是每個(gè)字符的內(nèi)碼值。字符比大小實(shí)際上是比較字符的ASCII碼值。如“a”<“b”,“ab”<“abc”,“abc”<“abd”,“acde”<“ad”,比較方法是先比較第一個(gè)字符,如果相同,則比較第二個(gè)字符,依次類(lèi)推。幾個(gè)常用字符的內(nèi)碼值:字符 “0” “9” “A” “Z” “a” “z” “0”~“9”按順序編碼。“A”~“Z”、“a”~“z”按字母順序編碼 十進(jìn)制值 48 57 65 90 97 122 十六進(jìn)制值 30 39 41 5A 61 7A 2.字符相加(1)用“+”號(hào):運(yùn)算符兩邊必須都是字符串型,如“1”+“2”=“12”,而1+“2”則出錯(cuò)。(2)用“&”號(hào):會(huì)自動(dòng)將兩邊的數(shù)據(jù)轉(zhuǎn)成字符串型再拼接。如“1”&“2”=“12”,1&“2”=“12”。注意:字符相加前后位置對(duì)調(diào),結(jié)果不一樣,“1”+“2” =“12”,而“2”+“1” =“21”。利用這一點(diǎn),可達(dá)到字符反串的效果,比如在除二倒取余法中的應(yīng)用。3.不同類(lèi)型字符的判斷功能 表達(dá)式 小寫(xiě)字母 ch>=“a” And ch<=“z” 大寫(xiě)字母 ch>=“A” And ch<=“Z” 數(shù)字字符 ch>=“0” And ch<=“9” 字母 ch>=“A” And ch<=“Z” Or ch>=“a” And ch<=“z” 非字母 Not(ch>=“A” And ch<=“Z” Or ch>=“a” And ch<=“z”) 4.字符轉(zhuǎn)換二、字符串基本操作1.判斷是否對(duì)稱f=truen=Len(s)For i=1 To n\2 If Mid(s,i,1)<>Mid(s,n-i+1,1) Then功能 表達(dá)式 大寫(xiě)轉(zhuǎn)小寫(xiě) Chr(Asc(ch)+32) 小寫(xiě)轉(zhuǎn)大寫(xiě) Chr(Asc(ch)-32) 求字母的字母序 小寫(xiě)字母:Asc(ch)-96或Asc(ch)- Asc(“a”)+1大寫(xiě)字母:Asc(ch)-64或 Asc(ch)- Asc(“A”)+1 f=false:Exit For End IfNext i最后判斷f的值,如果是true,則對(duì)稱,否則不對(duì)稱。2.字符串反轉(zhuǎn)n=Len(s)For i=1 To n s1=Mid(s,i,1)+s1Next i得到的字符串s1是s的反串。3.插入字符串在字符串s中,在第n個(gè)位置插入字符串c:s1=Mid(s,1,n-1)+c+Mid(s,n,Len(s)-n+1)如s=“hppynewyear”,n=2,c=“aa”,則s1=“haappynewyear”。4.刪除字符串在字符串s中,刪除子串s1:i=1Do While i<= Len(s)-Len(s1)+1 If Mid(s,i,Len(s1))=s1 Then s=Mid(s,1,i-1)+Mid(s,i+Len(s1),Len(s)-i-Len(s1)+1) Else i=i+1 End IfLoop5. 刪除重復(fù)字符刪除字符串s中重復(fù)的字符。s1=Mid(s,1,1)For i=2 To Len(s) f=0 For j= 1 To Len(s1) If Mid(s,i,1)=Mid(s1,j,1) Then f=1:Exit For Next j If f=0 Then s1=s1+Mid(s,i,1)Next i6. 單詞個(gè)數(shù)統(tǒng)計(jì)f=0For i=1 To Len(s) ch=Mid(s,i,1) If ch>="A" And ch<="Z" Or ch>="a" And ch<="z" ’ch是字母 If f=0 Then c=c+1:f=1 Else f=0 End IfNext例 用VB編寫(xiě)一個(gè)“加減法運(yùn)算”程序,實(shí)現(xiàn)如下功能:在文本框Text1中輸入多個(gè)正整數(shù)加減算式(只包含數(shù)字和“+ ”“-”字符,以“=”為結(jié)束符),單擊“計(jì)算”按鈕Command1,計(jì)算結(jié)果在標(biāo)簽Label1上顯示。程序運(yùn)行界面如圖所示。?(1)程序運(yùn)行時(shí)清空Label1上的內(nèi)容,則可在Form_Load事件過(guò)程中添加語(yǔ)句 ????(單選,填字母:A.Form1.Caption= “”/ B.Form1.Text=“”/C.La-bel1.Caption=“”/D.Label1. Text=“”)。 (2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Command1_Click()Dim s As String, t As Integers = Text1.Textt = 0: p = 0: flag = 1For i = 1 To Len(s) ch = Mid(s, i, 1) If ch >="0" And ch <= "9" Then p = ?、佟???? Else t= ?、凇???? p = 0 If ch = "-" Then flag = -1 Else If ch = "+" Then flag = 1 End If End IfNext iLabel1.Caption = Str(t)End Sub(3)若文本框Text1中輸入內(nèi)容的結(jié)束符“=”缺失(即輸入內(nèi)容為12+28-15+50),單擊“計(jì)算”按鈕后, 標(biāo)簽Label1上顯示的內(nèi)容是 ????。解析 本題的解題關(guān)鍵在于理解非數(shù)字字符的操作。For語(yǔ)句遍歷字符串值,If語(yǔ)句判斷字符類(lèi)型。(1)略。(2)①分析判斷條件可知,要執(zhí)行數(shù)字相連。原值p乘10加新出現(xiàn)的值Val(ch)組成新值。②非數(shù)字符號(hào)出現(xiàn),要把前值放入累加器t中,flag存放前值符號(hào),因此要累加flag*p。(3)由于“=”缺失,造成最后一個(gè)數(shù)50沒(méi)有被累加。答案 (1)C (2)①p*10 + Val(ch) ②t + flag*p (3)25考點(diǎn)三????排序算法及程序?qū)崿F(xiàn)考向基礎(chǔ)1.冒泡排序的基本思想把待排序的n個(gè)元素的數(shù)組看成是垂直堆放的一列數(shù)據(jù),從最下面的一個(gè)元素起,自下而上地比較相鄰的兩個(gè)元素中的數(shù)據(jù),將較小的數(shù)據(jù)換到上面。重復(fù)這一過(guò)程,直到處理完最后兩個(gè)元素中的數(shù)據(jù),稱為一遍加工。第一遍加工完成后,最小的數(shù)據(jù)已經(jīng)上升到第一個(gè)元素的位置。然后對(duì)余下的n-1個(gè)元素重復(fù)上述處理過(guò)程,直至最后進(jìn)行余下兩個(gè)數(shù)據(jù)的比較和交換。n個(gè)數(shù)需要n-1遍排序。以數(shù)據(jù)130,20,98,15,67,3為例,從小到大冒泡排序的操作過(guò)程如下:原始數(shù)據(jù) 130 20 98 15 67 3 第1遍排序后 3 130 20 98 15 67 第2遍排序后 3 15 130 20 98 67 第3遍排序后 3 15 20 130 67 98 第4遍排序后 3 15 20 67 130 98 第5遍排序后 3 15 20 67 98 130 2.冒泡排序的程序?qū)崿F(xiàn)For i=1 To n-1 ’n個(gè)數(shù)需要n-1遍排序 For j=n To i+1 Step -1 ’從后往前,兩兩比較,直到a(i+1)和a(i)比較完 If a(j) temp=a(j-1):a(j-1)=a(j):a(j)=temp ’小的數(shù)在后面,則交換 End If Next jNext i①外循環(huán)“For i=1 To n-1”中的變量i表示第i遍冒泡排序,n個(gè)數(shù)需要n-1遍排序。②由內(nèi)循環(huán)“For j=n To i+1 Step -1”可看出,冒泡比較的方向是從后往前,兩兩比較,第i遍的比較次數(shù)是n-i次,交換次數(shù)最多是n-i次,交換次數(shù)最少是0次。③從小到大排序(升序),If語(yǔ)句中條件表達(dá)式為:a(j)(降序),If語(yǔ)句中條件表達(dá)式為:a(j)>a(j-1)。例1 有如下程序段:For i=1 To 2 For j=5 To i+1 Step -1 If a(j) Next jNext i數(shù)組元素a(1)到a(5)的值依次為“95,88,66,80,75”,經(jīng)過(guò)該程序段“加工”后,數(shù)組元素a(1)到a(5)的值依次為?( )A.66,75,95,88,80 B.66,75,80,95,88C.95,88,66,80,75 D.95,88,80,75,66解析 此題為冒泡排序,升序排序,排序兩遍。答案為A。答案????A3.選擇排序的基本思想在所有的元素中選出最小(大)的數(shù)據(jù),把它與第一個(gè)數(shù)據(jù)交換,然后在其余的元素中再選出最小(大)的數(shù)據(jù)與第二個(gè)數(shù)據(jù)交換。以此類(lèi)推,直至所有數(shù)據(jù)排序完成。n個(gè)數(shù)需要n-1遍排序。以數(shù)據(jù)130,20,98,15,67,3為例,從小到大選擇排序的操作過(guò)程如下:原始數(shù)據(jù) 130 20 98 15 67 3 第1遍排序后 3 20 98 15 67 130 第2遍排序后 3 15 98 20 67 130 第3遍排序后 3 15 20 98 67 130 第4遍排序后 3 15 20 67 98 130 第5遍排序后 3 15 20 67 98 130 4.選擇排序的程序?qū)崿F(xiàn)選擇排序的代碼如下:For i=1 To n-1k=iFor j=i+1 To n If a(j)Next j If k<>i Then temp=a(i):a(i)=a(k):a(k)=temp End IfNext i①外循環(huán)“For i=1 To n-1”中的變量i表示第i遍選擇排序,n個(gè)數(shù)需要n-1遍排序。②矩形框內(nèi)代碼用于尋找數(shù)據(jù)元素a(i)到a(n)的最小值,變量k記錄當(dāng)前找到的最小值的位置,即數(shù)組元素的下標(biāo),則a(k)就是當(dāng)前找到的最小的數(shù)組元素。它的思想方法是先假設(shè)數(shù)組的第i項(xiàng)是最小的(第i遍排序),因此k記為i,然后把從第i+1項(xiàng)開(kāi)始的所有數(shù)組元素跟a(k)進(jìn)行比較,如果比a(k)小,則用k記錄該元素的下標(biāo)。這樣循環(huán)結(jié)束后,變量k中存儲(chǔ)的就是數(shù)組中從第i項(xiàng)至第n項(xiàng)的最小元素的下標(biāo),a(k)就是第i項(xiàng)至第n項(xiàng)中的最小元素。③從小到大排序(升序),If語(yǔ)句中條件表達(dá)式為:a(j)序),If語(yǔ)句中條件表達(dá)式為:a(j)>a(k)。例2 對(duì)下列一組原始數(shù)組:13,15,2,11,8,18 進(jìn)行選擇排序,第一遍排序結(jié)束,數(shù)組的狀態(tài)不可能是?( )A.2,15,13,11,8,18 B.18,15,2,11,8,13C.13,15,2,11,18,8 D.13,15,18,11,8,2解析 本題考查選擇排序的思想方法。選擇排序算法第一遍一定會(huì)把最大或最小的數(shù)交換到最前或最后,其他數(shù)據(jù)不動(dòng)。因此答案為C。答案????C例3 用選擇排序法對(duì)一組學(xué)生的身高數(shù)據(jù)進(jìn)行升序排序,已知第一遍排序結(jié)束后的數(shù)據(jù)序列為165,168,178,175,171,則下列選項(xiàng)中可能是原始數(shù)據(jù)序列的是?( )A.175,178,168,165,171 B.178,168,165,175,171C.165,178,168,175,171 D.165,168,171,175,178解析 第一遍排序后排第一位的165有5種可能的來(lái)源,①原來(lái)就在第一位,不需要數(shù)據(jù)互換,那么原始數(shù)據(jù)就是165,168,178,175,171;②從第二位換來(lái),那么原始數(shù)據(jù)就是168,165,178,175,171;③從第三位換來(lái),那么原始數(shù)據(jù)就是178,168,165,175,171;④從第四位換來(lái),那么原始數(shù)據(jù)就是175,168,178,165,171;⑤從第五位換來(lái),那么原始數(shù)據(jù)就是171,168,178,175,165。答案????B5.冒泡排序與選擇排序的比較 冒泡排序 選擇排序 思想方法 一邊比較,一邊交換 先選出最大值或最小值,再交換 相同點(diǎn) ①n個(gè)數(shù)都需要n-1遍排序,其中變量i控制排序的遍數(shù) ②比較的次數(shù)一樣多,都是(n-1)+(n-2)+…+3+2+1次 ③最好的情況下,交換的次數(shù)一樣,都是0次 不同點(diǎn) 邊比較邊交換,最壞的情況下交換的次數(shù)是(n-1)+(n-2)+…+3+2+1次 先選擇再交換,最壞的情況下交換的次數(shù)是n-1次 如何區(qū)分 交換兩個(gè)變量的代碼在內(nèi)層循環(huán)內(nèi) 交換兩個(gè)變量的代碼在內(nèi)層循環(huán)后,外層循環(huán)內(nèi) 例4 某校通過(guò)政府招投標(biāo)中心采購(gòu)一套多媒體教學(xué)設(shè)備,有5家單位參加競(jìng)標(biāo),競(jìng)標(biāo)價(jià)分別為19萬(wàn)、15萬(wàn)、21萬(wàn)、13萬(wàn)、12萬(wàn)元人民幣。若采用選擇排序算法對(duì)標(biāo)價(jià)從大到小排序,需要進(jìn)行數(shù)據(jù)互換的次數(shù)是?( )A.1 B.2 C.3 D.4解析 原始數(shù)據(jù)為19、15、21、13、12,第一遍排序19與21互換,得到21,15,19,13,12;第二遍排序15與19互換,得到21,19,15,13,12;第三遍排序與第四遍排序都不需要數(shù)據(jù)互換。因此總共是2次數(shù)據(jù)互換。答案????B例5 有如下VB程序段:a(1)=44: a(2)=36: a(3)=58: a(4)=65: a(5)=12b=0:c=0For i=1 To 4 k=i For j=i+1 To 5 If a(j) < a(k) Then k=j: b=b+1 Next j If k <> i Then t=a(i): a(i)=a(k): a(k)=t:c=c+1 End IfNext iText1.Text=Str(b)+Str(c)該程序段執(zhí)行后,文本框Text1顯示的內(nèi)容是?( )A.53 B.44 C.43 D.34解析 本題首先要理解變量 b和變量 c的含義。變量 b 表示每遍排序a(j)值比a(k)小的次數(shù),變量 c 表示數(shù)據(jù)交換的次數(shù)。第一遍排序 k=1,a(2)第二遍排序 k=2,后面沒(méi)有數(shù)比a(k)小,也沒(méi)有數(shù)據(jù)交換。第三、四遍排序同理,最終b=4,c=3。答案????C考向突破1.冒泡排序算法的變形標(biāo)準(zhǔn)寫(xiě)法:For i=1 To n-1 ’n個(gè)數(shù)需要n-1遍排序For j=n To i+1 Step -1’從后往前,兩兩比較,一直到第i+1個(gè)數(shù) If a(j) temp=a(j-1):a(j-1)=a(j):a(j)=temp ’小的數(shù)在后面,則交換 End IfNext jNext i排序思想解析:n個(gè)數(shù)需要n-1遍排序;每一遍排序都是從最后一個(gè)數(shù)開(kāi)始,兩兩比較,小的數(shù)換到前面,大的數(shù)換到后面;第一遍把最小數(shù)推到了第一個(gè)位置,第二遍把第二小的數(shù)推到了第二個(gè)位置,……。因此排序過(guò)程中,數(shù)據(jù)是從前往后依次排好的。(1)變形一For i=1 To n-1 For j=n-1 To i Step -1If a(j+1) temp=a(j+1):a(j+1)=a(j):a(j)=temp End If Next jNext i排序思想解析:與標(biāo)準(zhǔn)形唯一的差異就是兩個(gè)比較項(xiàng)從a(j-1)和a(j)變成a(j+1)和a(j),因此循環(huán)語(yǔ)句也從“For j=n To i+1 Step -1”變成了“For j=n-1 To i Step -1”,而程序在執(zhí)行過(guò)程中沒(méi)有任何差別,與標(biāo)準(zhǔn)形是完全一樣的。(2)變形二For i=1 To n-1 For j=1 To n-iIf a(j+1) temp=a(j+1):a(j+1)=a(j):a(j)=temp End If Next jNext i排序思想解析:跟標(biāo)準(zhǔn)形不一樣的是本代碼中每一遍冒泡是從前往后兩兩比較的,因此每一遍排序達(dá)到的效果是把最大值推到了最后面。第一遍排序后,最大值就到了最后位置,第二遍后,次大值就到了倒數(shù)第二個(gè)位置,……。因此排序過(guò)程中,數(shù)據(jù)是從后往前依次排好的。(3)變形三For i=1 To n-1 For j=i+1 To 2 Step -1If a(j) temp=a(j):a(j)=a(j-1):a(j-1)=temp End If Next jNext i排序思想解析:第一遍,2號(hào)和1號(hào)元素比較并交換;第二遍,從3號(hào)元素開(kāi)始往前比較并交換,直到1號(hào)元素;第三遍,從4號(hào)元素開(kāi)始往前比較并交換,直到1號(hào)元素;……。最后同樣達(dá)到排序效果。如有5個(gè)數(shù):4、3、1、5、2,第一遍后為:3、4、1、5、2;第二遍后為:1、3、4、5、2;第三遍后為:1、3、4、5、2;第四遍后為:1、2、3、4、5。需要注意的是,當(dāng)某一遍排序過(guò)程中沒(méi)有數(shù)據(jù)交換時(shí),不代表所有數(shù)據(jù)已經(jīng)有序,這點(diǎn)跟標(biāo)準(zhǔn)冒泡排序不同。(4)變形四For i=1 To n-1 For j=i+1 To n If a(j) temp=a(j):a(j)=a(i):a(i)=temp End If Next j Next i排序思想解析:在第i遍排序中,把第i+1到第n個(gè)數(shù)依次與a(i)比較,如果比a(i)小,則交換。它的最大特點(diǎn)是:所有數(shù)據(jù)跟某個(gè)位置上的數(shù)去比較。如第1遍排序時(shí),所有數(shù)都跟a(1)比較;第2遍排序時(shí),所有數(shù)都跟a(2)比較;以此類(lèi)推。排序過(guò)程中,數(shù)據(jù)是從前往后依次排好。(5)冒泡排序的錯(cuò)誤變形For i=1 To n-1 For j=i To n-1 If a(j+1) temp=a(j+1):a(j+1)=a(j):a(j)=temp End If Next jNext i錯(cuò)誤原因解析:從語(yǔ)句“For j=i To n-1”可看出每一遍的冒泡過(guò)程是把最大值從前往后推,因此排序過(guò)程中,是后面的數(shù)據(jù)先排好,前面的數(shù)據(jù)是亂的,但是第i遍的冒泡過(guò)程是從第i個(gè)數(shù)開(kāi)始的,因此i位置前面的數(shù)據(jù)不能參與排序。而后面的數(shù)據(jù)已經(jīng)排好,其實(shí)是不需要參與排序的。因此要改成“For j=1 To n-i”。例1????(2019浙江五校聯(lián)考)有如下 VB 程序段:For i = 2 To 4 j = i: flag = False Do While j >= 2 And Not flag If a(j) < a(j - 1) Then t = a(j): a(j) = a(j - 1): a(j - 1) = t flag = True End If j = j - 1 LoopNext i數(shù)組元素 a(1)到 a(8)的初值依次為“8,2,7,10,6,9,5,3”,則程序運(yùn)行后,元素 a(1)到 a(8)的值依次為?( )A.2,7,8,10,6,9,5,3 B.10,8,7,2,6,9,5,3C.2,3,5,8,6,7,10,9 D.2,3,5,6,7,8,9,10解析 程序用了第3種冒泡排序的變形,數(shù)組中只有前4個(gè)數(shù)參與了排序,從小到大升序,后4個(gè)數(shù)不動(dòng),程序運(yùn)行后元素為:2,7,8,10,6,9,5,3。答案????A2.選擇排序算法的變形選擇排序的變形考法較少。①選擇排序的變形:For i=1 To n-1 k=I For j=n To i+1 Step -1 If a(j) Next j If k<>i Then temp=a(i):a(i)=a(k):a(k)=temp End IfNext i排序思想解釋:在每一遍找最小值時(shí),從前往后的比較改為從后往前的比較,其他沒(méi)有變化。②選擇排序的錯(cuò)誤變形:For i=1 To n-1 k=i For j=i+1 To n If a(j) Next j If k<>i Then temp=a(i):a(i)=a(k):a(k)=temp End IfNext i錯(cuò)誤原因分析:在選擇最小值的過(guò)程中把第i+1到第n個(gè)數(shù)依次與a(i)比較,“If a(j)與a(i)并未交換。這種方法是找不到最小值的位置的。比如有如下數(shù)據(jù):5,2,1,3,4,第一遍排序i=1時(shí)比較過(guò)程如下:a(2)=3;a(4)找到最小值所在的位置(最小值位置應(yīng)該是3),原因就是a(1)的值沒(méi)有變過(guò)。3.冒泡排序算法的優(yōu)化當(dāng)某一遍排序過(guò)程中沒(méi)有數(shù)據(jù)交換,說(shuō)明數(shù)據(jù)已經(jīng)有序,無(wú)需進(jìn)行下一遍排序。代碼如下:Dim flag As Boolean ’flag值為T(mén)rue表示某遍排序中發(fā)生過(guò)交換i = 1flag = TrueDo While i <= n - 1 Or flag = True flag = False For j = n To i + 1 Step -1 If a(j) < a(j - 1) Then k = a(j): a(j) = a(j - 1): a(j - 1) = k flag = True End If Next j i = i + 1Loop思想解析:用一個(gè)邏輯變量flag標(biāo)記某一遍排序過(guò)程中是否有數(shù)據(jù)交換,如果沒(méi)有,則無(wú)需再進(jìn)行下一遍排序。排序遍數(shù)是i-1遍。另一種寫(xiě)法:Dim flag As BooleanFor i=1 To n-1 flag=False For j=n To i+1 Step -1 If a(j) k=a(j):a(j)=a(j-1):a(j-1)=k flag=True End If Next j If flag=False Then Exit ForNext i注意這種寫(xiě)法的排序遍數(shù)是i,因?yàn)槌绦驈闹虚g跳出循環(huán),不執(zhí)行“Next i”指令,因此沒(méi)有多加一次。4.選擇排序算法的優(yōu)化在數(shù)組的所有元素中同時(shí)找出最小和最大的元素,然后將這兩個(gè)元素分別與第一個(gè)和最后一個(gè)元素交換數(shù)據(jù),在余下的元素中找出最小和最大數(shù)據(jù)的元素,分別與第二個(gè)和倒數(shù)第二個(gè)元素交換數(shù)據(jù),以此類(lèi)推,直到所有元 素的數(shù)據(jù)按升序排列。代碼如下:p = 1: q = 10Do While p < qiMin = p:iMax = p For i = p + 1 To q If a(i) < a(iMin) Then iMin = i If a(i) > a(iMax) Then iMax = i Next i t = a(iMin): a(iMin) = a(p): a(p) = t If iMax = p Then iMax = iMin t = a(iMax): a(iMax) = a(q): a(q) = t p = p + 1 q = q - 1Loop普通的選擇排序是從頭到尾一個(gè)方向的,優(yōu)化后的排序是從兩端往中間同時(shí)進(jìn)行,一端從小到大排,另一端從大到小排,變量p和q表示本次排序的范圍(p前和q后的數(shù)據(jù)已經(jīng)完成排序)。For語(yǔ)句找出本次排序的最小數(shù)a(iMin)和最大數(shù)a(iMax),然后將a(iMin)與a(p)交換,將a(iMax)與a(q)交換。由于找最小數(shù)和最大數(shù)時(shí),一開(kāi)始都假定了p位置上的數(shù)是最小值和最大值,如果本次找到的最大值在p位置,那么當(dāng)a(p)和a(iMin)交換以后,最大值a(p)就被換到iMin的位置。因此當(dāng)iMax=p時(shí),在最小值交換完畢后,再給i-Max賦值iMin。5.奇數(shù)偶數(shù)分開(kāi)排序、素?cái)?shù)合數(shù)分開(kāi)排序、男生女生分開(kāi)排序等問(wèn)題解決這類(lèi)排序問(wèn)題的關(guān)鍵點(diǎn)是分析出需要交換的情況有哪些,比如要求奇數(shù)在前升序,偶數(shù)在后升序,則需要交換的情況有:①小奇數(shù)在大奇數(shù)的后面;②奇數(shù)在偶數(shù)的后面;③小偶數(shù)在大偶數(shù)的后面。其他類(lèi)似的排序問(wèn)題也是同樣的思路。例2????(2018稽陽(yáng)聯(lián)誼學(xué)校聯(lián)考,16,3分)有一組正整數(shù),基于冒泡排序?qū)ζ渲?br/>的數(shù)進(jìn)行升序排序。排序后奇數(shù)在前,偶數(shù)在后。排序示例如下: 實(shí)現(xiàn)上述功能的VB程序如下,但加框處代碼有誤,請(qǐng)改正。Const n=10Dim d(1 To n) As IntegerPrivate Sub Command1_Click()Dim i As Integer, j As Integer, t As Integer’讀取一組正整數(shù),存儲(chǔ)在數(shù)組d中,代碼略i=1Do While i <=n-1排序前 78 30 64 39 49 4 8 32 18 32 排序后 39 49 83 4 8 18 30 32 64 78 For j=n To i + 1 Step -1 If d(j) Mod 2=d(j - 1) Mod 2 Then If d(j) > d(i)Then ’(1) t=d(j): d(j) =d(j - 1): d(j - 1)=t End IfElse ’(2) t=d(j): d(j) =d(j - 1): d(j - 1)=t End If Next j i=i + 1Loop’依次輸出排序后的數(shù)據(jù),代碼略End Sub解析 本題考查冒泡排序的應(yīng)用。與普通的冒泡排序不同之處在于,本題把奇數(shù)偶數(shù)分開(kāi)從小到大升序排序。(1) If d(j) Mod 2=d(j-1) Mod 2表示d(j)和d(j-1)的奇偶性相同,此時(shí)如果d(j)(j)和d(j-1)的奇偶性不相同,由于奇數(shù)偶數(shù)分開(kāi)排序,奇數(shù)在前,偶數(shù)在后,因此只有當(dāng) d(j-1)是偶數(shù)而d(j)是奇數(shù)時(shí),才需要交換兩數(shù)的位置。因此此處條件設(shè)置為ElseIf d(j) Mod 2=1 And d(j-1) Mod 2=0 Then。當(dāng)d(j-1)是奇數(shù)而d(j)是偶數(shù)時(shí)是不需要交換的。答案????(1)d(j) < d(j-1) (2)ElseIf d(j) Mod 2=1 And d(j-1) Mod 2=0 Then或其他等價(jià)的答案6.隔位排序偶數(shù)位置和奇數(shù)位置上的元素分別排序。例3 有如下程序段:For i=1 To 9 For j=10 To i+2 Step -1 If a(j) < a(j-2) Then t=a(j): a(j)=a(j-2): a(j-2)=t End If Next jNext i數(shù)組元素a(1)到a(10)的值依次為“10,9,8,7,6,5,4,3,2,1”,執(zhí)行該程序段后,數(shù)組元素a(8)中的值為?( )A.7 B.8 C.9 D.10解析 本題考查冒泡排序。排序時(shí)隔位比較并交換,由“If a(j) < a(j-2) Then”可知程序?qū)崿F(xiàn)隔位遞增排序,也即奇數(shù)位置的數(shù)和偶數(shù)位置的數(shù)分別從小到大排序,排序結(jié)果為“2,1,4,3,6,5,8,7,10,9”,答案為A。答案????A考點(diǎn)四????查找算法及程序?qū)崿F(xiàn)考向基礎(chǔ)1.順序查找的基本思想順序查找的基本思想是從第一個(gè)數(shù)據(jù)開(kāi)始,按順序逐個(gè)將數(shù)據(jù)與查找關(guān)鍵詞進(jìn)行比較。若某個(gè)數(shù)據(jù)和關(guān)鍵詞相等,則查找成功;如果所有的數(shù)據(jù)都比較過(guò),沒(méi)有一個(gè)數(shù)據(jù)和關(guān)鍵詞相等,則查找不成功。2.順序查找的程序?qū)崿F(xiàn)假定在數(shù)組a中有n個(gè)數(shù)據(jù),查找關(guān)鍵詞是key。則順序查找的代碼如下:For i = 1 To n If a(i)=key Then Exit ForNext i說(shuō)明:①For語(yǔ)句用于遍歷整個(gè)數(shù)據(jù)源,從開(kāi)始位置到結(jié)束位置。②If 語(yǔ)句用于判斷當(dāng)前訪問(wèn)的元素是不是等于關(guān)鍵詞。③一旦某個(gè)位置的數(shù)據(jù)等于關(guān)鍵詞,查找任務(wù)結(jié)束,通常用語(yǔ)句 Exit For 退出循環(huán)。④退出循環(huán)后,如果i的值大于n,則表示未找到。i<=n是找到的情況,i的值就是關(guān)鍵詞所在的位置。⑤順序查找不要求數(shù)據(jù)源是有序的。3.對(duì)分查找的基本思想在有序的數(shù)據(jù)列中,首先將要查找的數(shù)據(jù)與有序數(shù)組內(nèi)處于中間位置的數(shù)據(jù)進(jìn)行比較,如果兩者相等,則查找成功;否則根據(jù)數(shù)組元素的有序性,可確定該數(shù)據(jù)在數(shù)組的前半部分還是后半部分。在新確定的范圍內(nèi),繼續(xù)按上述方法進(jìn)行查找,直到找到要查找的數(shù)據(jù),則查找成功,或直到子表不存在,則查找不成功。對(duì)分查找要求數(shù)據(jù)源必須是有序的。4.對(duì)分查找的程序?qū)崿F(xiàn)對(duì)分查找的代碼如下:key=Text1.Text ’輸入關(guān)鍵詞i=1:j=n ’設(shè)置首次查找的范圍f=False ’f標(biāo)志是否已經(jīng)找到關(guān)鍵詞Do While(i<=j)And Not f’未找到并且查找范圍還存在 m=Fix((i+j)/2)’計(jì)算中間位置 If key=a(m) Then f=True ’相等表示找到了,將f設(shè)為T(mén)rue ElseIf key j=m-1 ’下一次查找范圍是前半部分 Else i=m+1 ’下一次查找范圍是后半部分 End IfLoop說(shuō)明:①變量i和j記錄每一次查找的起始位置和結(jié)束位置,變量m記錄中間位置。如果key果key>a(m),則下一次查找的范圍是后半部分,因此j不變,i=m+1。②退出Do循環(huán)有兩種可能:第一種是f為T(mén)rue,說(shuō)明已經(jīng)找到關(guān)鍵詞,此時(shí)結(jié)束查找;第二種是i>j,查找的起始位置超過(guò)結(jié)束位置,說(shuō)明已經(jīng)找遍數(shù)據(jù)源,但是找不到關(guān)鍵詞,此時(shí)結(jié)束查找。例 7位學(xué)生的身高(單位:cm)從高到低依次為:178,177,175,172,170,165,162。用對(duì)分查找法找到178的過(guò)程中,依次被訪問(wèn)到的數(shù)據(jù)是?( )A.178 B.172,175,178C.172,177,178 D.172,175,177,178解析 本題主要考查對(duì)對(duì)分查找算法基本思想的理解。將7個(gè)數(shù)據(jù)從1到7進(jìn)行編號(hào)。第一次訪問(wèn)到的數(shù)據(jù)是第4個(gè),即172(中間位置m=Fix((1+7)/2)=4),178>172,因此下一次查找的范圍是前半部分,即第1個(gè)到第3個(gè)。因此第二次訪問(wèn)的數(shù)據(jù)應(yīng)該是第2個(gè),即177(中間位置m=Fix((1+3)/2)=2),178>177,因此下一次查找的范圍是前半部分,即第1個(gè),因此第三次訪問(wèn)的數(shù)據(jù)是178。答案????C考向突破1.對(duì)分查找的效率問(wèn)題(1)對(duì)分查找的每一次查找,要么找到了目標(biāo),結(jié)束任務(wù);要么通過(guò)比較中間值與關(guān)鍵詞,將下一次的查找范圍縮小一半,因此對(duì)分查找的效率往往高于順序查找。對(duì)n個(gè)數(shù)據(jù)查找某個(gè)值,最多需要查找Int(log2n)+1次。(2)找不到關(guān)鍵詞的情況下,最后一遍查找時(shí),i=j=m,若key>a(m),則i=m+1;若key該遍查找結(jié)束后會(huì)退出循環(huán)。(3)計(jì)算中間值位置的式子有多種寫(xiě)法,不同寫(xiě)法,查找過(guò)程可能不同。實(shí)例:a(1)到a(10)的值依次為2,7,8,10,12,13,16,18,19,20。公式 查找過(guò)程 m=(i+j)\2 m=Int((i+j)/2) m=Fix((i+j)/2) m=Int((i+j+1)/2) m=Int((i+j)/2+0.5) m=(i+j)\2If (i+j) Mod 2=1 Then m=m+1 表中序號(hào)表示第幾次找到該數(shù)。如果“If (i+j) Mod 2=1 Then m=m+1”寫(xiě)成“If j Mod 2=0 Then m=m+1”,查找過(guò)程可能也不同,要根據(jù)實(shí)際情況分析。例1 有一個(gè)由4000個(gè)整數(shù)構(gòu)成的順序表,假定表中的元素已經(jīng)按升序排列,采用對(duì)分查找查找一個(gè)元素,則最多需要 ????次比較就能確定是否存在所查找的元素。?( )A.11 B.12 C.13 D.14解析 本題主要考查對(duì)分查找的效率問(wèn)題。根據(jù)對(duì)分查找的思想方法,每一次查找的結(jié)果要么是找到,要么是找不到,如果找不到則將下一次的查找范圍縮小一半。最差的情況是數(shù)據(jù)源中沒(méi)有查找對(duì)象,每次查找都將查找范圍縮小一半。規(guī)模為n個(gè)數(shù)的數(shù)據(jù)源,使用對(duì)分查找時(shí),最多經(jīng)過(guò)Int(log2n)+1次查找。Int(log24000)+1=11+1=12。答案????B例2 使用對(duì)分查找算法在包含某個(gè)有序元素的數(shù)組中查找某值,下列說(shuō)法錯(cuò)誤的是(中括號(hào)[]表示向下取整)?( )A.第一次查找的位置一般是[(1+n)/2]B.在某連續(xù)的三次查找中,不可能是三個(gè)相鄰的元素C.如果找不到,那么最少需要查找[log2n]次D.如果找得到,那么最多需要查找[log2n]+1次解析 比如5個(gè)元素的查找,第一次查找3號(hào)位置,第二、三次分別查找1號(hào)和2號(hào)位置,三者相鄰。對(duì)分查找在找不到的情況下,最少也需要[log2n]次查找,相當(dāng)于每次都在元素個(gè)數(shù)較少的一半中查找;選項(xiàng)D剛好相反,每次都在元素個(gè)數(shù)較多的一半中查找,但總次數(shù)不會(huì)超過(guò)[log2n]+1次。答案????B2.對(duì)分查找中各個(gè)變量值的變化規(guī)律例3 對(duì)數(shù)組a 中6 個(gè)有序數(shù)據(jù)“11,22,33,44,55,66”,用下面的程序代碼查找數(shù)據(jù)“23”,程序執(zhí)行完畢后,下列各變量值正確的是?( )Dim a(1 To 6)As IntegerDim i As Integer,j As Integer,Key As Integer,m As Integera(1)= 11:a(2)= 22:a(3)= 33: a(4)= 44:a(5)= 55:a(6)= 66i= 1:j= 6:p= 0:Key= 23Do While i<=j p=p+1 m=(i+j) \2 If j Mod 2=0 Then m=m+1 If a(m)= Key Then Exit Do If KeyLoopA.i=5 B.j=4 C.m=3 D.p=2解析 本題主要考查對(duì)分查找。變量p是查找次數(shù)。第一次查找,i=1,j=6,m=(i+j)\2=3,而j Mod 2=0,因此m=m+1=4,23<44,因此j=m-1=3;第二次查找,m=(i+j)\2=2,23>22因此i=m+1=3;第三次查找,m=(i+j)\2=3,23<33,因此i=m+1=4,此時(shí)i=4,m=3,j=3,p=3,i>j,整個(gè)查找過(guò)程結(jié)束,故C正確。答案????C例4 用對(duì)分查找算法在含有100個(gè)元素的無(wú)重復(fù)有序數(shù)組中查找某元素,已知第3次查找位置是62號(hào)元素,則第4次查找不可能是?( )A.第43號(hào)元素 B.第56號(hào)元素C.第68號(hào)元素 D.無(wú)需第4次查找解析 本題考查對(duì)分查找算法的原理。100個(gè)有序元素中,第1次查找位置是50,第2次查找位置是25或75,根據(jù)題意第3次查找位置是62,說(shuō)明關(guān)鍵詞大于第50號(hào)元素,因此第4次不可能再去找50之前的元素,A不可能。第4次查找位置是62左右兩段區(qū)間:[51,61]或[63,74],因此B和C可能。如果第3次找到的第62號(hào)元素就是關(guān)鍵詞,則無(wú)需第4次查找,因此D可能。答案????A3.在有相同項(xiàng)的數(shù)據(jù)源中找關(guān)鍵字找到最先出現(xiàn)的位置,代碼如下:i = 1: j = nDo While i<= j m = (i + j) \ 2 If key>a(m) Then i = m + 1 Else j = m - 1 End IfLoop說(shuō)明:當(dāng)key>a(m)時(shí),往后半部分查找;當(dāng)keykey=a(m)時(shí),仍然往前半部分查找,因此可以理解成是找到最先出現(xiàn)key的位置。退出循環(huán)時(shí),如果key在序列中,則key等于最后一次的a(m),此時(shí)i=j=m,然后執(zhí)行j=m-1,因此退出循環(huán)后,最先出現(xiàn)key的位置是i。如果key不在序列中,則退出循環(huán)時(shí)a(j)上述代碼如果將key>a(m)寫(xiě)成key>=a(m),則當(dāng)key=a(m)時(shí),仍然往后半部分查找,因此是找到最后出現(xiàn)key的位置,退出循環(huán)時(shí),j的位置是最后出現(xiàn)的位置。例5????(2018 浙江“七彩陽(yáng)光 ”聯(lián)盟期初聯(lián)考,11,2分)某對(duì)分查找算法的 VB 程序段如下:L = 1: R = 10: Key = 21Do While L <= R m = (L + R) \ 2 If a(m) <= Key Then L = m + 1 Else R = m - 1 End IfLoop數(shù)組元素 a(1)到 a(10)的值依次為“3,9,21,21,21,21,27,28,39,40”,執(zhí)行該程序段,變量 R、a(R)的值分別是?( )A.2,9 B.3,21 C.6,21 D.7,27答案????C 本題考查對(duì)分查找。由于數(shù)列中有相同項(xiàng),代碼If a(m) <= Key Then L=m+1,也即往后找相同項(xiàng),直到找到最后一個(gè)相同項(xiàng),因此Key=21時(shí),找到第6項(xiàng)a(6)。例6 有序(非降序)數(shù)組a有n個(gè)元素,用對(duì)分查找算法在數(shù)組a中查找key值所在的位置,如果有重復(fù)的元素,則顯示最早出現(xiàn)該key值的位置。相應(yīng)的VB程序段如下:key =Val(Text1.Text)i=1:j=nDo While i <= j m = (i + j) \2 If a(m) > key Then j = m-1 Elself a(m) < key Then i = m + 1 Else If ???? Then j =m-1 Else s = Str(key) + "的起始位置是"+Str(m) Exit Do End If End IfLoopIf i > j Then s ="找不到"+ Str(key)Label2.Caption=s要使程序?qū)崿F(xiàn)上述算法,劃線處的語(yǔ)句是?( )A.a(m -1) = keyB.a(m) = keyC.m-1 >= 0 And a(m-1) = keyD.m-1 >= 0 And a(m) = key解析 Else這一支隱含的條件是:a(m)=key,因此此處判斷的是當(dāng)a(m)=key時(shí),是否前面有重復(fù)值,同時(shí)要保證m-1>=0,如果成立則繼續(xù)往前找,所以答案為 C。答案????C4.非簡(jiǎn)單有序序列的對(duì)分查找例7 循環(huán)升序數(shù)組指的是將一個(gè)升序數(shù)組循環(huán)向右移動(dòng)若干距離之后變成的數(shù)組。如[1,2,3,4,5]循環(huán)右移1位,就成為[5,1,2,3,4],再右移1位,就成為[4,5,1,2,3],……,其中[5,1,2,3,4]和[4,5,1,2,3]都是循環(huán)升序數(shù)組。該數(shù)組的特點(diǎn)是:將循環(huán)升序數(shù)組從中間分開(kāi),肯定有一邊是有序數(shù)組,另外一邊是循環(huán)有序數(shù)組。小杜研究發(fā)現(xiàn)對(duì)分查找算法適當(dāng)優(yōu)化后也適用于循環(huán)升序數(shù)組。在文本框輸入被查找的數(shù)據(jù)Key,查找循環(huán)升序數(shù)組a中是否有相同的元素存在。編寫(xiě)的VB程序段如下:i=1: j = n ’數(shù)組a下標(biāo)從1到nKey = Val(Text1.Text)Do While i <= j m = (i + j) \ 2 If a(m) = Key Then Exit Do If a(i) < a(m) Then If ????Then j = m -1 Else i = m + 1 Else If Key > a(m) And Key <= a(j) Then i = m + 1 Else j = m - 1 End IfLoopIf i <= j Then Text2.Text ="查找成功" Else Text2.Text ="查找失敗"要使程序?qū)崿F(xiàn)對(duì)分查找過(guò)程,則方框中的語(yǔ)句是?( )A.Key >= a(i) And Key < a(m)B.Key <= a(i) And Key > a(m)C.Key >= a(i) And Key <= a(j)D.Key > a(i) And Key <= a(m)解析 本題考查對(duì)分查找。a(i)如果Key處于這一段,并且Key=a(i) And Key答案????A5.隨機(jī)數(shù)與可能性問(wèn)題例8 有以下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+l If a(m)=Key Then flag=False ElseIf a(m)< Key Then i= m+1 Else j=m-1 End IfLoop數(shù)組元素a(1)到a(10)依次是3,10,17,23,27,30,35,40,45,50,變量cs的值可能是?( )A.1 或 2 B.2或3 C.3或4 D.4或5解析 本題考查對(duì)分查找。Key = Int(Rnd() * 10) + 28 即產(chǎn)生[28,37]的隨機(jī)整數(shù),cs表示查找次數(shù),10個(gè)數(shù),最多查找4次,D錯(cuò)。第1次查找,m=5,a(5)=27,而Key的范圍是[28,37],因此1次是不可能的,A錯(cuò)。第2次查找,m=8,a(8)=40,因此2次也是不可能的,B錯(cuò)。答案????C考點(diǎn)五????遞歸算法及程序?qū)崿F(xiàn)考向基礎(chǔ)1.遞歸算法的基本思想函數(shù)或過(guò)程調(diào)用它本身,稱為遞歸。遞歸算法的基本思想是把規(guī)模較大的、較難解決的問(wèn)題變成規(guī)模較小的、容易解決的同一問(wèn)題,規(guī)模較小的問(wèn)題又變成規(guī)模更小的問(wèn)題,當(dāng)問(wèn)題小到一定程度時(shí),可以直接得出它的解,從而得到原來(lái)問(wèn)題的解。即采用“大事化小、小事化無(wú)”的基本思想。比如著名的漢諾塔問(wèn)題、八皇后問(wèn)題、斐波那契數(shù)列、猴子吃桃問(wèn)題等。在自定義函數(shù)中調(diào)用自己,這樣的函數(shù)叫遞歸函數(shù)。2.遞歸算法的前提條件(1)每一步解決問(wèn)題的方法要一致;(2)在使用遞歸策略時(shí),必須有一個(gè)明確的結(jié)束條件(也稱邊界條件),稱為遞歸出口。示例:年齡問(wèn)題1有A、B、C、D四個(gè)人,問(wèn)A的年齡,A說(shuō):我的年齡是B的兩倍;問(wèn)B的年齡,B說(shuō):我比C大3歲;問(wèn)C的年齡,C說(shuō):我的年齡是D的兩倍減15歲;問(wèn)D的年齡,D說(shuō):我17歲。請(qǐng)問(wèn)A的年齡是多少?在這個(gè)問(wèn)題中,雖然有遞歸出口(D的年齡),但是每一步解決問(wèn)題的方法不一致,因此不能使用遞歸算法。示例:年齡問(wèn)題2有A、B、C、D四個(gè)人,問(wèn)A的年齡,A說(shuō):我比B大5歲;問(wèn)B的年齡,B說(shuō):我比C大5歲;問(wèn)C的年齡,C說(shuō):我比D大5歲;問(wèn)D的年齡,D說(shuō):我17歲。請(qǐng)問(wèn)A的年齡是多少?在這個(gè)問(wèn)題中,不但有遞歸出口(D的年齡),而且每一步解決問(wèn)題的方法是相同的(前一人比后一個(gè)大5歲),因此可以用遞歸算法。3.遞歸算法的程序?qū)崿F(xiàn)求階乘(n!)的代碼。Private Sub Command1_Click()Dim n As IntegerDim m As Longn = Val(Text1.Text)m = f(n)Text2.Text = Str(m)End SubFunction f(a As Integer)If a = 1 Then ’邊界條件 f = 1 ’遞歸出口Else f = f(a - 1) * a ’遞歸調(diào)用End IfEnd Function注:遞歸算法的代碼通常比較簡(jiǎn)潔,但事實(shí)上遞歸算法的運(yùn)行效率較低。4.遞歸算法的設(shè)計(jì)難點(diǎn)(1)找到邊界條件,設(shè)置遞歸出口。(2)推導(dǎo)遞歸公式。如階乘問(wèn)題的遞歸公式是:n!=(n-1)!*n。斐波那契數(shù)列的遞歸公式是:f(n)=f(n-1)+f(n-2)。5.遞歸算法的調(diào)用過(guò)程例 有以下程序段:Dim a(4) As IntegerPrivate Sub Command1_Click() Dim s As String a(1)= 10:a(2)= 30:a(3)= 20:a(4)= 40 s = doit(4) Label1.Caption = sEnd SubFunction doit(k As Integer) As StringIf k = 1 Then doit = Str(a(1))Else doit = doit(k - 1) & Str(a(k))End IfEnd Function程序運(yùn)行后,標(biāo)簽Label1 中顯示的內(nèi)容是?( )A.10 20 30 40 B.10 30 20 40C.40 30 20 10 D.40 20 30 10解析 本題的遞歸調(diào)用過(guò)程如下:? 答案????B考點(diǎn)六????算法在數(shù)據(jù)管理中的應(yīng)用考向基礎(chǔ) 在VB程序中使用ADO對(duì)象,必須先引用ADO的對(duì)象庫(kù)。方法是點(diǎn)擊“工程”菜單中的 “引用”命令,彈出“引用”對(duì)話框,勾選ADO選項(xiàng),如圖所示。?說(shuō)明:不同環(huán)境下ADO的版本號(hào)可能不同。1.通過(guò)Connection對(duì)象連接數(shù)據(jù)庫(kù)的一般過(guò)程(右邊是對(duì)應(yīng)的代碼):?說(shuō)明:①conn是定義的Connection對(duì)象的名字,取名規(guī)則同變量名。②ConnectionString是連接字符串,它主要有兩個(gè)參數(shù):provider是數(shù)據(jù)庫(kù)引擎的名稱;data source指定連接的數(shù)據(jù)庫(kù)文件, "& App.Path &"表示相對(duì)路徑,"mydb.accdb"是數(shù)據(jù)庫(kù)文件名。因此該程序連接的是跟工程文件同一個(gè)文件夾下的名為mydb.accdb的一個(gè)數(shù)據(jù)庫(kù)文件。③Open和Close是Connection對(duì)象的方法,表示打開(kāi)數(shù)據(jù)庫(kù)連接和關(guān)閉數(shù)據(jù)庫(kù)連接,使用數(shù)據(jù)庫(kù)應(yīng)該在打開(kāi)數(shù)據(jù)庫(kù)連接后,關(guān)閉數(shù)據(jù)庫(kù)連接前。2.通過(guò)Recordset對(duì)象獲取數(shù)據(jù)表中的數(shù)據(jù),步驟如下(右邊是對(duì)應(yīng)的代碼):?說(shuō)明:①rs是定義的Recordset對(duì)象的名字。②SELECT語(yǔ)句是結(jié)構(gòu)化查詢語(yǔ)言 SQL 中常見(jiàn)的語(yǔ)句,主要用于從數(shù)據(jù)表中查詢數(shù)據(jù)?!癝ELECT*FROM info”表示從“info”這張表中讀取所有的記錄(通配符“*”表示所有,即All)。③“info”是表名。④打開(kāi) Recordset 時(shí),若 Recordset 非空,則默認(rèn)指向第一條記錄。⑤EOF 屬性:若當(dāng)前記錄的位置在最后的記錄之后,則返回True,否則返回False。 EOF 相當(dāng)于讀取記錄的結(jié)束標(biāo)志。⑥r(nóng)s.Fields(“xh”)返回當(dāng)前記錄中“xh”字段的值。 rs.Fields(0)返回當(dāng)前記錄中第一個(gè)字段的值,如果第一個(gè)字段名為“xh”,則 rs.Fields(0) 與rs.Fields(“xh”) 返回值相同。依此類(lèi)推,rs.Fields(1)表示返回第2個(gè)字段的值。⑦M(jìn)oveNext 方法:指針移到下一條記錄。⑧本段代碼應(yīng)該在連接數(shù)據(jù)庫(kù)后,關(guān)閉數(shù)據(jù)庫(kù)前。下表是Recordset對(duì)象的常用方法和屬性。方法 例 說(shuō)明 Open rs.open 打開(kāi)記錄集 Close rs.close 關(guān)閉記錄集 Move rs.MoveFirst 移到第一條記錄 rs.MoveLast 移到最后一條記錄 rs.MoveNext 移到下一條記錄 rs.MovePrevious 移到上一條記錄 屬性 例 說(shuō)明 BOF If rs.BOF=True 若當(dāng)前位置在第一條記錄之前,則BOF值為T(mén)rue,否則為False EOF Do While Not rs.EOF 若當(dāng)前位置在最后一條記錄之后,則EOF值為T(mén)rue,否則為False 3.數(shù)據(jù)庫(kù)訪問(wèn)的標(biāo)準(zhǔn)代碼如下:?Dim conn As New ADODB.ConnectionDim rs As New ADODB.Recordsetconn.ConnectionString="provider=Microsoft.ACE.OLEDB.12.0;data source="& App.Path & "\computer.accdb "’數(shù)據(jù)庫(kù)文件名為computer.accdbconn.Openset rs.ActiveConnection=connrs.Open "SELECT * FROM info" ’數(shù)據(jù)表名為infon=0Do While Not rs.EOFn=n+1 a(n)=rs.Fields(“xh”) ’Fields(“xh”)表示讀取“xh”字段的值,此處等同于Fields(0) b(n)=rs.Fields(“jg”) ’Fields(“jg”)表示讀取“jg”字段的值,此處等同于Fields(2)rs.MoveNextLooprs.Closeconn.closeset rs=nothingset conn=nothing說(shuō)明:此段代碼連接了數(shù)據(jù)庫(kù)文件computer.accdb,并從該數(shù)據(jù)庫(kù)的info表中讀取了第1個(gè)字段“xh”和第3個(gè)字段“jg”的值,依次存儲(chǔ)在數(shù)組a和數(shù)組b中,變量n是info表的記錄數(shù)。讀取數(shù)據(jù)后,關(guān)閉數(shù)據(jù)庫(kù)連接,接下來(lái)程序?qū)?br/>數(shù)組a和數(shù)組b進(jìn)行后續(xù)的處理,如排序、查找等,目前考綱對(duì)數(shù)據(jù)庫(kù)的操作只要求連接數(shù)據(jù)庫(kù)和讀取表中數(shù)據(jù)并存儲(chǔ)到數(shù)組中,接下來(lái)的數(shù)據(jù)處理跟數(shù)據(jù)庫(kù)無(wú)關(guān),也不要求處理后的數(shù)據(jù)重新寫(xiě)回?cái)?shù)據(jù)庫(kù)中。由于讀取數(shù)據(jù)庫(kù)的代碼較長(zhǎng),而后續(xù)的算法與數(shù)據(jù)庫(kù)又毫無(wú)關(guān)系,限于篇幅關(guān)系,考查數(shù)據(jù)庫(kù)的概率較低,到目前為止,只在2016浙江10月選考中考過(guò)一次。考生務(wù)必要掌握讀取數(shù)據(jù)的標(biāo)準(zhǔn)代碼,以及幾個(gè)容易考到的考點(diǎn):從代碼中分析數(shù)據(jù)庫(kù)文件名、表名;讀取記錄時(shí),循環(huán)結(jié)束條件的設(shè)置;讀完一條記錄后,如何指向下一條記錄;關(guān)閉數(shù)據(jù)庫(kù)連接等。目前一種新的考法,可能是用選擇題形式考本段代碼。專題六 算法的程序?qū)崿F(xiàn)探考情 悟真題【考情探究】考點(diǎn) 考試內(nèi)容 考試要求 5年考情 預(yù)測(cè)熱度 考題示例 考向 難度 解析算 法及程 序?qū)崿F(xiàn) 解析算法的思想方法 c 2016浙江4月選考,14,5分; 2017浙江4月選考,14,5分; 2019浙江1月學(xué)考,11,5分; 2019浙江6月學(xué)考,11,5分 進(jìn)制轉(zhuǎn)換、質(zhì)數(shù)問(wèn)題及其他數(shù)論問(wèn)題、數(shù)學(xué)猜想等 ★☆☆ ★★☆ 解析算法的程序?qū)崿F(xiàn) 枚舉算 法及程 序?qū)崿F(xiàn) 枚舉算法的思想方法 c 2016浙江10月選考,14,5分; 2017浙江11月選考,14,5分; 2018浙江4月選考,14,5分; 2018浙江11月選考,14,5分 字符串處理問(wèn)題是考試熱點(diǎn),如在字符串中利用逗號(hào)、空格、數(shù)字等特殊符號(hào),完成一些統(tǒng)計(jì)或計(jì)算功能 ★★☆ ★★★ 枚舉算法的程序?qū)崿F(xiàn) 排序算 法及程 序?qū)崿F(xiàn) 冒泡排序的思想方法 c 2015浙江10月選考,16,4分; 2016浙江4月選考,11,2分; 2016浙江10月選考,16,3分; 2017浙江11月選考,16,3分; 2019浙江4月選考,16,3分 排序算法優(yōu)化;冒泡排序變形,如雙向排序、奇偶分開(kāi)排序、素?cái)?shù)合數(shù)分開(kāi)排序、去重復(fù)數(shù)排序等 ★★★ ★★★ 冒泡排序的程序?qū)崿F(xiàn) 選擇排序的思想方法 c 2017浙江4月選考,12,2分; 2018浙江4月選考,16,3分 排序變形,如雙向排序、奇偶分開(kāi)排序、素?cái)?shù)合數(shù)分開(kāi)排序等 ★★☆ ★★☆ 選擇排序的程序?qū)崿F(xiàn) 查找算 法及程 序?qū)崿F(xiàn) 順序查找的思想方法 c 2017浙江4月選考,16,3分 順序查找比較簡(jiǎn)單,一般不單獨(dú)考,會(huì)結(jié)合其他知識(shí)點(diǎn),比如在數(shù)列中插入數(shù)、刪除數(shù)列中的重復(fù)數(shù)、查找替換等 ★★☆ ★★☆ 順序查找的程序?qū)崿F(xiàn) 查找算 法及程 序?qū)崿F(xiàn) 對(duì)分查找的思想方法 c 2015浙江10月選考,11,2分; 2016浙江4月選考,12,2分; 2016浙江10月選考,12,2分; 2017浙江4月選考,11,2分; 2017浙江11月選考,12,2分; 2018浙江4月選考,12,2分; 2018浙江11月選考,16,3分; 2019浙江4月選考,12,2分 一類(lèi)題是考查對(duì)分查找的運(yùn)用:如查找次數(shù)、查找中各個(gè)變量值的變化;另一類(lèi)題是將數(shù)據(jù)源序列由單一的從小到大變成如奇偶分開(kāi)數(shù)列、循環(huán)有序數(shù)列、左右交替上升序列等,此類(lèi)數(shù)列往往是分成前后兩個(gè)有序數(shù)列,查找過(guò)程中,對(duì)分的主要思想不變,無(wú)非是增加了一些條件設(shè)置 ★★★ ★★★ 對(duì)分查找的程序?qū)崿F(xiàn) 遞歸算 法及程 序?qū)崿F(xiàn) 遞歸算法的思想方法 b 遞歸算法本質(zhì)上是自定義函數(shù)的應(yīng)用,到目前為止,未在真題中出現(xiàn) ★☆☆ ☆☆☆ 遞歸算法的程序?qū)崿F(xiàn) 算法在 數(shù)據(jù)管 理中的 應(yīng)用 通過(guò)Connection對(duì)象連接數(shù)據(jù)庫(kù) a 2016浙江10月選考,17,6分 目前關(guān)于數(shù)據(jù)庫(kù)一種新的考法是選擇題形式,只要掌握連接數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)代碼即可。此外要學(xué)會(huì)分析數(shù)組變量中存儲(chǔ)的數(shù)據(jù)內(nèi)容和類(lèi)型,并掌握數(shù)組下標(biāo)的靈活運(yùn)用 ★★☆ ★☆☆ 通過(guò)Recordset對(duì)象讀取數(shù)據(jù)表中的數(shù)據(jù) a 算法在數(shù)據(jù)管理中的應(yīng)用 c 分析解讀 本專題主要考查幾大算法的思想方法和程序?qū)崿F(xiàn),包括枚舉、解析、排序、查找、遞歸,題型有選擇題和非選擇題。選擇題為第11和12題、非選擇題為第15和16題,這幾題考查排序算法與對(duì)分查找的頻度較高,難度為中等或較難。縱觀幾次真題,程序題有逐年加難的趨勢(shì)。試題中對(duì)于算法的考查不再局限于算法的基本形,而是在基本形的基礎(chǔ)上做了許多變形,比如冒泡排序的幾種變式,對(duì)分查找的變式等。還有一種變化是,在基本形的基礎(chǔ)上增加程序的功能,比如對(duì)排序算法進(jìn)行改進(jìn)從而提高排序的效率、記錄排序中數(shù)據(jù)的移動(dòng)過(guò)程,利用查找算法查找并刪除數(shù)列中的重復(fù)數(shù)據(jù)等。還有一個(gè)重要變化是,最近幾次的真題對(duì)幾個(gè)經(jīng)典算法的考查相對(duì)弱化,開(kāi)始加強(qiáng)對(duì)數(shù)組的考查。往往在選擇題最后2個(gè)題中有一個(gè)是考查數(shù)組的綜合運(yùn)用,該題往往難度較大。一般選擇題中保留一題考查排序或?qū)Ψ植檎?考對(duì)分查找的概率較高。數(shù)據(jù)庫(kù)程序題一般難度不大,可能是篇幅太長(zhǎng)的緣故,大題中考數(shù)據(jù)庫(kù)的概率并不高,有很多題都是一句話帶過(guò):從數(shù)據(jù)庫(kù)中讀取了什么數(shù)據(jù)存儲(chǔ)到什么數(shù)組變量中。讀取數(shù)據(jù)并存儲(chǔ)到數(shù)組變量中后,對(duì)數(shù)組的綜合運(yùn)用相對(duì)難度大一些,要學(xué)會(huì)分析題中各數(shù)組變量的作用,分別存儲(chǔ)了什么類(lèi)型的數(shù)據(jù),以及數(shù)組下標(biāo)的靈活運(yùn)用。目前數(shù)據(jù)庫(kù)可能會(huì)有一種新的考法,以選擇題的形式,考查連接數(shù)據(jù)庫(kù)和讀取數(shù)據(jù)庫(kù)的基本方法和代碼。要掌握從代碼中分析數(shù)據(jù)庫(kù)文件的名稱、數(shù)據(jù)表的名稱,以及數(shù)據(jù)表中字段的讀取方法、記錄集的移動(dòng)方法等基礎(chǔ)知識(shí)。破考點(diǎn) 練考向【考點(diǎn)集訓(xùn)】考點(diǎn)一 解析算法及程序?qū)崿F(xiàn)1.(2018寧波“十校聯(lián)考”,16,3分)在VB的算術(shù)運(yùn)算中,最大的實(shí)數(shù)類(lèi)型Double有效位數(shù)也只有15位。為了實(shí)現(xiàn)除法運(yùn)算保留任意位數(shù),小明根據(jù)除法原理,編寫(xiě)了如下程序,功能如下:在文本框Text1中輸入被除數(shù)(正整數(shù)),在文本框Text2中輸入除數(shù)(正整數(shù)),在文本框Text3中輸入保留小數(shù)位數(shù),單擊按鈕Command1,在標(biāo)簽Label1中顯示除法運(yùn)算的商。程序運(yùn)行界面如圖所示,但加框處代碼有錯(cuò),請(qǐng)改正。Private Sub Command1_Click()Dim x, y As IntegerDim n As IntegerDim s As Stringx= Val(Text1.Text): y = Val(Text2.Text)n= Val(Text3.Text)s = s + Str(x \ y)s = s + "."k = x Mod yFor i = 1 To n x =x+k * 10 ’(1) s=Str(x \ y) ’(2) k = x Mod yNext iLabel1.Caption = "商為:" + sEnd Sub答案 (1) x=k*10 (2) s=s+Str(x\y)2.(2018浙江十校聯(lián)盟選考適應(yīng)性考試,14,5分)編寫(xiě)“二進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)”程序,實(shí)現(xiàn)如下功能:在文本框 Text1中輸入一個(gè)二進(jìn)制數(shù),單擊“轉(zhuǎn)換”按鈕 Command1,將二進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)并在文本框 Text2 中顯示。程序運(yùn)行界面如圖所示。(1)設(shè)計(jì)如圖所示的程序界面,至少要使用 個(gè)類(lèi)(填數(shù)字)。?(2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Command1_Click()Dim s1 As String, s2 As StringDim i As Integer, x As IntegerConst code = "0123456789ABCDEF"s1 = Text1.Text : s2 = ""Do While Len(s1) Mod 4 <> 0 s1 = "0" + s1Loopx = 0: i =1Do While i <= Len(s1) x = x*2+Val(Mid(s1,i,1)) i=i+1 If ?、佟 ?Then? s2 = s2 +Mid(code,x+1,1) ?、凇 ? End IfLoopText2.Text = s2End Sub(3)若文本框 Text1 中輸入的內(nèi)容為“101101”,單擊“轉(zhuǎn)換”按鈕后,文本框 Text2 中顯示的內(nèi)容是 。?答案 (1)4 (2)① i Mod 4=1 或(i-1) Mod 4=0 (或其他等價(jià)答案) ② x=0 (3)2D考點(diǎn)二 枚舉算法及程序?qū)崿F(xiàn)1.(2019寧波新高考適應(yīng)性考試)得分問(wèn)題:給出一個(gè)由A和X組成的字符串,統(tǒng)計(jì)字符的得分之和。每個(gè)A的得分為已經(jīng)連續(xù)出現(xiàn)的A的個(gè)數(shù),X得分為0。例如,AAXXAXXAAA的得分為1+2+0+0+1+0+0+1+2+3?,F(xiàn)編寫(xiě)一個(gè)程序,功能如下:在文本框Text1中輸入字符串,單擊“統(tǒng)計(jì)”按鈕Cmd_Sta后,程序計(jì)算得分,結(jié)果顯示在Text2中。(1)Cmd_Sta對(duì)象屬于 類(lèi)(單選,填字母:A.Form / B.Label / C.TextBox /D.CommandButton)。?(2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)诔绦騽澗€處填入合適的代碼。Private Sub Cmd_Sta_Click()Dim sum As Integer, i As Integer, cnt As IntegerDim c As String, sz As Stringsz = Text1.Text cnt = 0: sum = 0For i = 1 To Len(sz) ?、佟? If c = "A" Then ?、凇? sum = sum + cnt Else cnt = 0 End IfNext iText2.Text = Str(sum)End Sub(3)運(yùn)行該程序,輸入數(shù)據(jù)如上圖所示,程序執(zhí)行到循環(huán)結(jié)束時(shí),變量cnt的值為 。?答案 (1) D (2)① c = Mid(sz,i,1) 或 c=Mid(Text1.Text,i,1) ②cnt = cnt + 1 (3)32.珠心算是在大腦中以算盤(pán)表象作為載體,運(yùn)用珠算法則所進(jìn)行的計(jì)算。某學(xué)校的珠心算老師采用一種快速考查珠心算加法能力的測(cè)驗(yàn)方法。他隨機(jī)給出一個(gè)正整數(shù)集合,集合中的數(shù)各不相同,然后要求學(xué)生回答:其中共有多少個(gè)數(shù)恰好等于集合中另外兩個(gè)(不同的)數(shù)之和?例如對(duì)于集合{1,2,3,4},一共有2個(gè)數(shù)等于集合中另外兩個(gè)數(shù)之和,它們是3、4(4=3+1,3=2+1)。將上述算法編寫(xiě)成程序,其功能如下:程序運(yùn)行時(shí)產(chǎn)生n個(gè)范圍在[1,100]內(nèi)的不同的隨機(jī)整數(shù)存儲(chǔ)在數(shù)組a中,并在列表框List1中顯示。單擊按鈕Command1后,在標(biāo)簽Label1上輸出結(jié)果,如圖所示。(1)對(duì)于集合{1,2,3,4,5,6},一共有 個(gè)數(shù)等于集合中另外兩個(gè)數(shù)之和。?(2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)趧澗€處填入合適代碼。Const n=12Dim a(1 To n) As IntegerDim flag(1 To 100) As BooleanPrivate Sub Form_Load()Dim i As Integer, t As IntegerFor i=1 To 100 flag(i)=FalseNext ii=1Do While i <=n t=Int(Rnd * 100)+1 If Not flag(t) Then ?、佟 ? List1.AddItem Str(t) flag(t)=True i=i+1 End IfLoopEnd SubPrivate Sub Command1_Click()Dim i As Integer, j As Integer, ans As Integerans=0For i=1 To n For j=i+1 To n If a(i)+a(j) <=100 Then If ② Then ? ans=ans+1 flag(a(i)+a(j))=False End If ?、邸 ? Next jNext iLabel1.Caption="共有"+Str(ans)+"個(gè)數(shù)!"End Sub答案 (1)4 (2)①a(i)=t ②flag(a(i)+a(j))或flag(a(i)+a(j))=True?、跡nd If考點(diǎn)三 排序算法及程序?qū)崿F(xiàn)1.(2019金華十校第一學(xué)期調(diào)研考試,11,2分)有一個(gè)數(shù)組,采用冒泡排序,第一遍排序后的結(jié)果為3,18,5,35,8,9,11,13,32,那么該數(shù)組的原始順序不可能是( )A.18,5,35,8,9,11,13,32,3B.18,5,35,8,9,11,3,13,32C.18,5,35,3,8,9,11,13,32D.3,18,5,35,13,11,32,8,9答案 D 2.(2020屆名校協(xié)作體信息技術(shù)試題)某排序算法的VB程序段如下:k = 1For i = 1 To 2 For j = 1 To 6 - 2 * i If k * a(j) < k * a(j + 2) Then t = a(j): a(j) = a(j + 2): a(j + 2) = t End If k = -k Next jNext i 數(shù)組元素a(1)到a(6)的初始值依次為“15,11,58,38,26,9”,該程序段執(zhí)行后,數(shù)組元素a(1)到a(6) 的值分別為 ( )A.58,9,26,11,15,38 B.58,38,26,11,15,9C.15,38,26,11,58,9 D.58,38,26,15,11,9答案 A 3.(2018溫州新力量聯(lián)盟期末)有如下 VB 程序段:Const n = 8Dim a(1 To n) As IntegerFor i = 1 To n a(i) = Int(Rnd * 20)Next ix = n \ 2For i = x To 2 Step -1 For j = 1 To i - 1 If a(j) < a(i) Then t = a(j): a(j) = a(i): a(i) = t End If Next jNext ii = nDo While i > x + 1 k = i For j = i - 1 To x + 1 Step -1 If a(j) > a(k) Then k = j Next j If k <> i Then t = a(k): a(k) = a(i): a(i) = t End If i = i - 1Loop執(zhí)行完這段代碼后,數(shù)組 a 中各個(gè)元素的值可能的是( )A.2,8,9,11,16,16,7,3 B.19,19,18,12,9,8,6,6C.20,17,10,10,5,11,13,16 D.14,11,10,5,0,6,15,15答案 D 4.(2018寧波“十校聯(lián)考”期末)若有以下數(shù)據(jù):64, 57, 22, 96, 71,分別存儲(chǔ)在a(1)至a(5)中,經(jīng)過(guò)以下程序段處理后的數(shù)據(jù)依次為( )Dim a(1 To 6) As Integers = 0For i = 1 To 5 If a(i) Mod 2 = 1 Then s = s + 1Next iFor i = 1 To 4 If a(i) Mod 2 = 0 Then For j = 5 To i + 1 Step -1 If a(j) Mod 2 = 1 Then a(6) = a(i): a(i) = a(j): a(j) = a(6): Exit For End If Next j End IfNext iFor i = s + 2 To 5 k = i - 1 For j = i To 5 If a(k) > a(j) Then k = j Next j If k <> i - 1 Then a(6) = a(i - 1): a(i - 1) = a(k): a(k) = a(6) End IfNext iA.22, 57, 64, 71, 96 B.71, 57, 22, 96, 64C.71, 57, 22, 64, 96 D.57, 71, 22, 64, 96答案 C 考點(diǎn)四 查找算法及程序?qū)崿F(xiàn)1.(2019浙江“七彩陽(yáng)光”聯(lián)盟期初聯(lián)考)某對(duì)分查找算法部分代碼如下:i = 1: j = 1000: flag = True: p = 0key = Val(Text1.Text)Do While i <= j And flag m = (i + j) \2 p = p + 1 If a(m) = key Then flag = False If a(m) > key Then j = m -1 Else i = m + 1Loop數(shù)組元素a(1)到a(1000)中存放著升序排列的數(shù)據(jù)。下列說(shuō)法正確的是( )A.若key的值小于a(1),則執(zhí)行該段程序后,變量j的值等于1B.若key的值等于a(1),則執(zhí)行該段程序后,變量p的值等于10C.若key的值等于a(1000),則執(zhí)行該段程序后,變量i的值等于1001D.無(wú)論key的值是否在數(shù)組a中,執(zhí)行該段程序后,變量i的值均不可能等于m答案 C 2.(2018溫州九校聯(lián)考,12,2分)有如下 VB 程序段:i=1:j=10:p=0f=Falsek=Int(Rnd*100)+0.5Do While i<=j And Not fm=Fix((i+j)/2+0.5)If k=a(m) Then f=TrueElseIf k j=m-1:p=p+1Else i=m+1:p=p-1 End IfLoopLabel1.Caption=Str(p)數(shù)組元素a(1)到a(10)的值依次為“5,16,22,28,35,43,52,67,78,89”,執(zhí)行該程序段后,Label1的值不可能是( )A.-3 B.-1 C.1 D.3答案 D 3.某對(duì)分查找算法的VB程序段如下:k=Val(Text1.Text)i=1: j=6: Label1.Caption="": f=FalseDo While i <=j And Not f m=(i+j) \ 2 If a(m)=k Then f=True If a(m) > a(i) Then If a(i) <=k And k < a(m) Then j=m-1 Else i=i+1 Else If a(m) < k And k <=a(j) Then i=i+1 Else j=j-1 End If Label1.Caption=Label1.Caption+Str(a(m))Loop數(shù)組元素a(1)到a(6)的值依次為“58,66,72,24,35,40”,在文本框Text1中輸入的值為35,執(zhí)行該程序段,標(biāo)簽Label1中顯示的值是( )A.72 35 B.24 35C.72 24 35 D.72 24 24 35答案 D 4.(2019五校聯(lián)考)某對(duì)分查找算法的 VB 程序段如下:Key = Int(Rnd * 49) * 2 + 1s = 0: i = 1: j = 10Do While i <= j m = (i + j) \ 2 If Key = a(m) Then Exit Do If Key < a(m) Then j = m - 1: s = 2 * s Else i = m + 1: s = 2 * s + 1 End IfLoop數(shù)組 a(1)到 a(10)的值依次為“2,6,7,15,20,24,27,43,52,63”,執(zhí)行該程序段后,s 的值不可能為( )A.2 B.3 C.5 D.15答案 A 考點(diǎn)五 遞歸算法及程序?qū)崿F(xiàn)1.某同學(xué)用VB編碼如下程序:Private Sub Command1_Click()Dim k As Integer, a As Integer, b As Integera = Val (Text1.Text) : b = Val (Text2.Text)Label1.Caption = trans(a, b)End SubFunction trans(m As Integer, n As Integer) As String If m<> 0 Then r =m Mod n trans = trans (m \ n, n) + Str(r)Else trans="0"End IfEnd Function程序運(yùn)行時(shí),在文本框Text1和Text2中分別輸入11和2,則Label1中的輸出結(jié)果是( )A.01011 B.1011 C.01101 D.11010答案 A 2. 樓梯有n階臺(tái)階,上樓可以一步上1階,也可以一步上2階, 探究共有多少種不同的走法。(1)完善程序:Private Sub Command1_Click()Dim n As Integern = Val(Text1.Text)Text2.Text = Str(f(n))End SubFunction f(a As Integer)If a = 1 Then f = 1ElseIf a = 2 Then f = ?、佟 ?Else f = ?、凇 ?End IfEnd Function(2)若有10階臺(tái)階,共有 種走法。?答案 (1)①2?、趂(a - 1) + f(a - 2) (2)89考點(diǎn)六 算法在數(shù)據(jù)管理中的應(yīng)用 小林編寫(xiě)了一個(gè)統(tǒng)計(jì)高三16個(gè)班級(jí)選考技術(shù)人數(shù)占比的VB程序。運(yùn)行界面如圖所示,窗體加載時(shí),從數(shù)據(jù)庫(kù)中(其中“選考三”字段中存儲(chǔ)了“技術(shù)”選考信息)調(diào)用數(shù)據(jù),統(tǒng)計(jì)各班選考技術(shù)的人數(shù)占比,并在列表框List1中顯示“班級(jí)”和“選技術(shù)占比”。單擊“排序”按鈕Command1,數(shù)據(jù)按選技術(shù)占比降序排序,在List2中顯示排序結(jié)果。實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)回答下列問(wèn)題:(1)分析程序,可知調(diào)用的數(shù)據(jù)表的名稱為 。?(2)請(qǐng)?jiān)趧澗€處填入合適的代碼。Dim n As Integer, i As Integer, j As Integer’變量n用于統(tǒng)計(jì)學(xué)生總數(shù) Dim rate(1 To 16) As Integer, num(1 To 16) As Integer, class (1 To 16) As IntegerDim tech(1 To 50) As Integer, cinfo(1 To 5000) As Integer, subj(1 To 5000) As StringPrivate Sub Form_Load()Dim conn As New ADODB.Connection, rs As New ADODB.Recordsetconn.Connectionstring = "Provider = Microsoft.ACE.OLEDB.12.0;DATA Source="& App.Path &"\stuimfo.accdb"conn.OpenSet rs.ActiveConnection = connrs.Open "SELECT * FROM xkqk"’此處代碼略,實(shí)現(xiàn)將每個(gè)學(xué)生班級(jí)存儲(chǔ)到數(shù)組cinfo中,選考三科目存儲(chǔ)到數(shù)組subj中For i = 1 To n ?、佟 ?’統(tǒng)計(jì)各班人數(shù)存儲(chǔ)到數(shù)組num中,num(1)存儲(chǔ)1班的人數(shù)?Next iFor i = 1 To 16class(i) = iFor j = 1 To n If class(cinfo(j)) = i Then If subj(j)="技術(shù)"Then ?、凇 ? End IfNext jrate(i) = tech(i) / num(i) * 100List1.AddItem ads(class(i), 3) +" "+ ads(rate(i), 7) + "%"Next iEnd SubPrivate Sub Command1_Click()Dim i As Integer, t As Integer, s As IntegerFor i = 1 To 15For j = 16 To i + 1 Step -1 If ?、邸 ?Then? t=rate(j) : rate(j) = rate(j-1) : rate(j-1) = t s=class(j): class(j)=class(j-1):class(j-1)=s End IfNext jNext iList2.AddItem "班級(jí)" + " " + "選技術(shù)占比"For i = 1 To 16List2.AddItem Str(class(i))+ " " + Str(rate(i)) + "%"Next iEnd Sub答案 (1)xkqk (2)①num(cinfo(i))=num(cinfo(i))+1② tech(i)=tech(i)+1 ③ rate(j)>rate(j - 1)【五年高考】考點(diǎn)一 解析算法及程序?qū)崿F(xiàn)2015—2019年真題·提升題組1.(2019浙江6月學(xué)考,11,5分)小宇為選定班級(jí)參賽作品編了一個(gè)VB程序,設(shè)計(jì)如下:在文本框Text1中輸入5位評(píng)委對(duì)3個(gè)作品的評(píng)分依據(jù)(評(píng)委對(duì)作品的評(píng)分?jǐn)?shù)據(jù)由3位十進(jìn)制數(shù)組成,第1位對(duì)應(yīng)作品編號(hào),第2、3位對(duì)應(yīng)作品得分,分值范圍為[60,99]。如“275”表示2號(hào)作品得分75)。單擊“計(jì)分”按鈕后,在標(biāo)簽Label1中輸出3個(gè)作品的平均分,在Label2中輸出參賽的作品(選擇最高平均分作品參賽,若最高平均分存在并列,則從并列作品中隨機(jī)抽取)。程序運(yùn)行界面如圖所示。(1)“計(jì)分”按鈕的對(duì)象名為 。?(2)程序部分代碼如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub jf_Click()Dim s As String, d As String, i As IntegerDim f1 As Single, f2 As Single, f3 As Singles = Text1.Texti = 1Do While ① ? d = Mid(s, i, 3) If Mid(d, 1, 1) = "1" Then f1 = f1 + Val(Mid(d, 2, 2)) ElseIf Mid(d, 1, 1) = "2" Then f2 = f2 + Val(Mid(d, 2, 2)) Else f3 = f3 + Val(Mid(d, 2, 2)) End If ?、凇 ?LoopLabel1.Caption = "作品1平均分為:"+Str(f1/5)+"作品2平均分為:"+Str(f2/5)+"作品3平均分為:"+Str(f3/5)’以下省略“處理并列最高平均分,并在 Label2 中輸出選取的參賽作品”的代碼End Sub(3)運(yùn)行該程序時(shí),在文本框 Text1 中以不同的順序輸入原評(píng)分?jǐn)?shù)據(jù):380/295/283/170/180/385/372/285/190/180/390/384/272/170/276,單擊“計(jì)分”按鈕,則 Label1中顯示的結(jié)果 (選填:會(huì)/不會(huì))發(fā)生改變。?答案 (1)jf (2)①i<=Len(s) 或 i2.(2019浙江1月學(xué)考,11,5分)小紅編寫(xiě)了一個(gè)將 5 位以內(nèi)的十六進(jìn)制正整數(shù)轉(zhuǎn)化成十進(jìn)制數(shù)的 VB 程序,功能如下:在文本框 Text1 中輸入一個(gè)十六進(jìn)制正整數(shù),單擊“轉(zhuǎn)換”按鈕 Command1,在標(biāo)簽 Label3 中顯示結(jié)果。程序運(yùn)行界面如圖所示。(1)要使窗體 Form1 標(biāo)題顯示“數(shù)制轉(zhuǎn)換”,則需修改窗體的 (單選,填字母:A.Font/B.Caption/C.BackColor)屬性。?(2)實(shí)現(xiàn)上述功能的 VB 程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Command1_Click()Dim x As String, ch As StringDim flag As Boolean, i As Integer, result As Longx =?、佟?i = 1result = 0flag = Truech = Mid(x, 1, 1)Do While i <= Len(x) And flag = True If ch >= "0" And ch <= "9" Then result = result * 16 + Val(ch) ElseIf ch >= "A" And ch <= "Z" Then result = result * 16 + (Asc(ch) - Asc("A") + 10) ElseIf ch >= "a" And ch <= "z" Then result = result * 16 + (Asc(ch) - Asc("a") + 10) Else flag = False End If i = i + 1 ch =?、凇?LoopIf flag = True Then Label3.Caption = Str(result)Else Label3.Caption = "輸入錯(cuò)誤"End IfEnd Sub(3)若在文本框 Text1 中輸入 5+9,單擊“轉(zhuǎn)換”按鈕后,標(biāo)簽Label3 中顯示的內(nèi)容是 (單選,填字母:A.14 / B.E / C.輸入錯(cuò)誤)。?答案 (1)B (2)①Text1.Text或其他等價(jià)表達(dá)式?、贛id (x,i,1)或 Mid(Text1.Text,i,1)或其他等價(jià)表達(dá)式 (3)C3.(2017浙江4月選考,14,5分)奇偶校驗(yàn)是一種校驗(yàn)數(shù)據(jù)傳輸正確性的方法。其中奇校驗(yàn)方法:統(tǒng)計(jì)二進(jìn)制數(shù)據(jù)的數(shù)位中“1”的個(gè)數(shù),若個(gè)數(shù)為奇數(shù),則校驗(yàn)位值為0,否則校驗(yàn)位值為1。小李編寫(xiě)了一個(gè)計(jì)算奇校驗(yàn)位值的VB程序,功能如下:在文本框Text1中輸入1~255間的十進(jìn)制待校驗(yàn)數(shù),單擊“計(jì)算”按鈕Command1后,在文本框Text2中顯示該數(shù)對(duì)應(yīng)的二進(jìn)制值,并在標(biāo)簽Label3中顯示該數(shù)的校驗(yàn)位值。程序運(yùn)行界面如圖所示。(1)在設(shè)計(jì)程序界面時(shí),要清空文本框中的顯示內(nèi)容,應(yīng)修改該文本框中的 屬性。?(2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Command1_Click() Dim a As Integer, s As String Dim n As Integer, t As Integer, v As Integer n = Val(Text1.Text) t = 0 s = "" Do While n > 0 a = n Mod 2 n = n \ 2 t = ?、佟 ? s = Str(a) + s Loop v = t Mod 2 Text2.Text = s Label3.Caption = "校驗(yàn)位值:" + ?、凇 ?End Sub(3)運(yùn)行該程序,在文本框Text1中輸入22,單擊“計(jì)算”按鈕,則顯示的校驗(yàn)位值是 。?答案 (1)Text (2)①t+a?、赟tr(1-v) (3)0考點(diǎn)二 枚舉算法及程序?qū)崿F(xiàn)2015—2019年真題·提升題組1.(2018 浙江 11 月選考,14,5 分)在平面坐標(biāo)系中,給定一組有序的點(diǎn)。從原點(diǎn)出發(fā),依次用線段連接這些點(diǎn),構(gòu)成一條折線。要求編寫(xiě)一個(gè)“計(jì)算折線長(zhǎng)度”的程序,功能如下:在文本框Text1中依次輸入這些點(diǎn)的坐標(biāo)值(數(shù)據(jù)都用逗號(hào)分隔并以逗號(hào)結(jié)尾),單擊“計(jì)算”按鈕Cmd后,程序計(jì)算這條折線的長(zhǎng)度,結(jié)果顯示在Label1中。例如,三個(gè)點(diǎn)的坐標(biāo)為(5,10),(8,12),(6,17),輸入格式如圖所示。(1)Cmd對(duì)象屬于 類(lèi)(單選,填字母:A.Form / B.Label/C.TextBox/D.CommandButton)。?(2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Cmd_Click()Dim i As Integer,j As Integer,k As IntegerDim x1 As Single,y1 As Single,x2 As Single,y2 As SingleDim d As Single,Totald As Single,v As Single,s As Strings= ?、佟 ?x1=0∶y1=0 ’出發(fā)點(diǎn)為坐標(biāo)原點(diǎn)k=1∶j=1∶Totald=0For i=1 To Len(s) If Mid(s,i,1)="," Then v=Val(Mid(s,j,i-j))’提取坐標(biāo)值,保存在變量v中 j=i+1 If ② Then? x2=v Else y2=v d=Sqr((x2-x1)^2+(y2-y1)^2) Totald=Totald+d x1=x2:y1=y2 End If k=k+1 End IfNext iLabel1.Caption=Str(Totald)End Sub(3)運(yùn)行該程序,輸入題干中的數(shù)據(jù),程序執(zhí)行到循環(huán)結(jié)束時(shí),變量k為 。?答案 (1)D (2)①Text1.Text?、趉 Mod 2=1 (3)72.(2018浙江4月選考,14,5分)某種編碼以4位二進(jìn)制碼為一組,每組前兩位表示方向,后兩位表示距離。編寫(xiě)一個(gè)程序,將編碼翻譯成方向和距離,距離值為每組編碼后兩位二進(jìn)制碼轉(zhuǎn)換為十進(jìn)制數(shù)的值。具體功能如下:在文本框Text1中輸入連續(xù)多組編碼,單擊“翻譯”按鈕Command1,結(jié)果顯示在列表框List1中。程序運(yùn)行界面如圖所示。(1)要使程序運(yùn)行時(shí),文本框Text1的Width屬性值為2018,可在Form_Load事件過(guò)程中添加語(yǔ)句 (單選,填字母:A.Width=2018/B.Text1.Width=2018/C.Width.Text1=2018)。?(2)實(shí)現(xiàn)上述功能的 VB 程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Command1_Click()Dim s As String, c As String, d As StringDim n As Integer, b1 As Integer, b2 As Integer, v As Integer, i As Integers = Text1.Text: n = Len(s): i = 1Do While i <= nc = Mid(s, i, 2)If c = "00" Then d = "東"ElseIf c = "01" Then d = "南"ElseIf c = "10" Then d = "西"Else d = "北"End Ifb1 = Val(Mid(s, i + 2, 1))b2 = Val(Mid(s, i + 3, 1))v= ① ?List1.AddItem d + " " + Str(v) ② ?LoopEnd Sub(3)若文本框 Text1 中輸入的內(nèi)容為“1111”,單擊“翻譯”按鈕,列表框 List1 中顯示的內(nèi)容是 。?答案 (1)B (2)①b1*2+b2?、趇=i+4 (3)北 33.(2017 浙江 11 月選考,14,5 分)編寫(xiě)“字符串生成”程序,實(shí)現(xiàn)如下功能:在文本框Text1 中(字符位置)輸入多個(gè)正整數(shù)(以“,”為分隔符和結(jié)束符),單擊“生成”按鈕 Command1,程序以這些整數(shù)為位置信息,依次從文本框 Text2 中(字典內(nèi)容)提取字符并連接成字符串,最后將字符串顯示在標(biāo)簽 Label1 中(生成內(nèi)容)。程序運(yùn)行界面如圖所示。(1)要使程序運(yùn)行時(shí),窗體Form1標(biāo)題顯示“字符串生成”,可在Form_Load事件過(guò)程中添加語(yǔ)句 (單選,填字母:A.Form1="字符串生成"/ B.Form1.Text="字符串生成"/ C.Form1.Caption="字符串生成")。?(2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Command1_Click()Dim s As String, t As String, c As StringDim i As Integer, p As Integers="":t=""For i=1 To Len(Text1.Text) c=Mid(Text1.Text, i, 1) If c="," Then p=Val(t) s=s+Mid(Text2.Text, p, 1) t="" Else t= ① ? End IfNext iLabel1.Caption= ② ?End Sub(3)若文本框Text1中輸入內(nèi)容的結(jié)束符缺失(即輸入內(nèi)容為1,18,9,9),單擊“生成”按鈕后,標(biāo)簽Label1中顯示的內(nèi)容是 。?答案 (1)C (2)①t+c(或 t&c)?、趕 (3)pas (2)①變量t(字符串類(lèi)型)存儲(chǔ)字符位置。程序通過(guò)Mid函數(shù)將文本框Text1中的字符逐個(gè)讀取并判斷,如果所取字符是逗號(hào),則表示一個(gè)字符位置已經(jīng)讀取完整,將變量t轉(zhuǎn)換成數(shù)值,然后去字典里取對(duì)應(yīng)字符,把它連接到s后面;如果所取字符不是逗號(hào),表示字符位置尚未結(jié)束,則將該字符連接到t后面。②在Label1中輸出最后的結(jié)果s。(3)由于程序中將位置轉(zhuǎn)換成字典中字符的指令是在條件c=“,”的情況下才執(zhí)行的,因此輸入“1,18,9,9”,前三個(gè)位置會(huì)從字典中取出字符“pas”。由于最后一個(gè)“9”缺失了“,”,因此不會(huì)從字典中取字符。考點(diǎn)三 排序算法及程序?qū)崿F(xiàn)2015—2019年真題·提升題組1.(2017浙江4月選考,12,2分)小趙對(duì)選擇排序算法進(jìn)行了如下改進(jìn):在數(shù)組的所有元素中找出最小和最大數(shù)據(jù)的元素,然后將這兩個(gè)元素分別與第一個(gè)和最后一個(gè)元素交換數(shù)據(jù),在余下的元素中找出最小和最大數(shù)據(jù)的元素,分別與第二個(gè)和倒數(shù)第二個(gè)元素交換數(shù)據(jù),以此類(lèi)推,直到所有元素的數(shù)據(jù)按升序排列。小趙編寫(xiě)的VB程序段如下:p = 1: q = 10Do While p < q iMin = p:iMax = p For i = p + 1 To q If a(i) < a(iMin) Then iMin = i If a(i) > a(iMax) Then iMax = i Next i t = a(iMin): a(iMin) = a(p): a(p) = t t = a(iMax): a(iMax) = a(q): a(q) = t p = p + 1 q = q - 1Loop要使程序?qū)崿F(xiàn)上述算法思想,則方框中的語(yǔ)句是( )A.If iMax = p Then iMax = iMinB.If iMin = p Then iMin = iMaxC.If iMax = p Then iMin = iMaxD.If iMin = p Then iMax = iMin答案 A 2.(2016浙江4月選考,11,2分)有如下程序段:For i = 1 To 2 For j = 5 To i + 1 Step -1 If a(j) > a(i) Then t = a(j): a(j) = a(i): a(i) = t End If Next jNext i數(shù)組元素a(1)到a(5)的值依次為“33,24,45,16,77”,經(jīng)過(guò)該程序段“加工”后,數(shù)組元素a(1)到a(5)的值依次為( )A.77,45,33,16,24 B.77,33,45,16,24C.77,24,45,16,33 D.77,45,33,24,16答案 A 3.(2019浙江4月選考,16,3分)小明基于冒泡排序思想設(shè)計(jì)了一個(gè)改進(jìn)的排序算法。該算法先用冒泡法將數(shù)組a中奇數(shù)位置的元素、偶數(shù)位置的元素分別進(jìn)行排序,然后再進(jìn)行后續(xù)處理。算法的VB程序段如下,但加框處代碼有錯(cuò),請(qǐng)改正。’待排序數(shù)據(jù)存儲(chǔ)在數(shù)組a中(a(1)~ a(n)),要求升序排列For i = 1 To (n - 1) \ 2 For j = 1 To n - i * 2 If a(j) > a(j + 1)Then ’(1) t = a(j): a(j) = a(j + 2): a(j + 2) = t End If Next jNext iFor i = 1 To n \ 2 j = 2 * i - 1 If a(j) > a(j + 1) Then t = a(j): a(j) = a(j + 1): a(j + 1) = tNext iFor i =1 To n Step 2 ’(2) t = a(i): j = i - 1 Do While t < a(j) a(j + 1) = a(j): j = j - 1 Loop a(j + 1) = tNext i答案 (1) a(j)>a(j+2) 或 a(j)>=a(j+2) 或其他等價(jià)表達(dá)式 (2)3 To n4.(2018浙江4月選考,16,3分)有一組正整數(shù),要求僅對(duì)其中的素?cái)?shù)進(jìn)行升序排序。排序后素?cái)?shù)在前,非素?cái)?shù)在后。排序示例如下。排序前 86 71 5 41 81 79 37 89排序后 5 37 41 71 79 89 86 81實(shí)現(xiàn)上述功能的VB代碼如下,但加框處有錯(cuò),請(qǐng)改正。Const n=8Dim a(1 To n) As IntegerPrivate Sub Command1_Click()Dim i As Integer, j As Integer, k As Integer, t As IntegerDim flag As Boolean’讀取一組正整數(shù),存儲(chǔ)在數(shù)組a中,代碼略For i = 1 To n - 1k = 1 ’(1)If IsPrime(a(k)) Then flag = True Else flag = FalseFor j = i + 1 To n If IsPrime(a(j)) Then If a(j) < a(k) Then ’(2) k=j flag = True End If End IfNext jIf k <> i Then t=a(k): a(k) = a(i):a(i) = tEnd IfIf Not flag Then Exit For ’Exit For表示退出循環(huán)Next i’依次輸出排序后的數(shù)據(jù)。代碼略End SubFunction IsPrime(m As Integer) As Boolean’本函數(shù)判斷m 是不是素?cái)?shù):是素?cái)?shù)返回值為T(mén)rue,不是素?cái)?shù)返回值為False’代碼略End Function答案 (1) k=i (2)a(j)5.(2017浙江11月選考,16,3分)小李基于冒泡排序算法編寫(xiě)了一個(gè)VB程序,功能如下:在文本框Text1中顯示排序前的數(shù)據(jù),單擊“排序”按鈕Command1,在文本框Text2中顯示剔除重復(fù)數(shù)據(jù)后的升序排序結(jié)果。程序運(yùn)行界面如圖所示。實(shí)現(xiàn)上述功能的VB程序如下,但加框處代碼有錯(cuò),請(qǐng)改正。Const n = 10Dim a(1 To n) As IntegerPrivate Sub Command1_Click()Dim i As Integer, j As Integer, t As IntegerDim bottom As Integer’獲取排序前數(shù)據(jù)依次存儲(chǔ)在數(shù)組a中,并在文本框Text1中顯示。代碼略bottom = ni = 1Do While i <= bottom - 1 For j = bottom To i + 1 Step -1 If a(j) < a(i) Then ’(1) t = a(j): a(j) = a(j - 1): a(j - 1) = t ElseIf a(j) = a(j - 1) Then ’相鄰兩個(gè)數(shù)據(jù)相等,進(jìn)行剔除處理 a(bottom)=a(j) ’(2) bottom = bottom - 1 End If Next j i = i + 1LoopText2.Text = " "For i = 1 To bottom Text2.Text = Text2.Text + Str(a(i))Next iEnd Sub答案 (1)a(j)a(j))(2)a(j)= a(bottom)6.(2016浙江10月選考,16,3分)小吳為了研究冒泡排序過(guò)程中數(shù)據(jù)的“移動(dòng)”情況,編寫(xiě)了一個(gè)VB程序,功能如下:在列表框List1中顯示排序前數(shù)據(jù)(存儲(chǔ)在數(shù)組a中),在文本框Text1中輸入初始位置(即下標(biāo)值),單擊“排序”按鈕Command1后,在標(biāo)簽Label1中顯示指定初始位置的數(shù)據(jù)在排序過(guò)程中的位置變化情況,排序后的數(shù)據(jù)顯示在列表框List2中。程序運(yùn)行界面如圖所示。實(shí)現(xiàn)上述功能的VB程序如下,但加框處代碼有錯(cuò),請(qǐng)改正。Dim a(1 To 8) As IntegerDim n As IntegerPrivate Sub Form_Load()a(1) = 30: a(2) = 47: a(3) = 30: a(4) = 72a(5) = 70: a(6) = 23: a(7) = 99: a(8) = 24n = 8For i = 1 To 8 List1.AddItem a(i)Next iEnd SubPrivate Sub Command1_Click()Dim i As Integer, j As Integer, k As IntegerDim pos As IntegerDim s As Strings = Text1.Textpos = Val(Text1.Text)For i = 1 To n - 1 For j = n To i + 1 Step -1 If a(j) < a(j - 1) Then k=a(j) ’(1) a(j - 1) = a(j) a(j) = k ’如果pos位置的數(shù)據(jù)參與交換,則更新pos值,記錄pos變化位置 If pos = j Then pos = j - 1 s = s + "→" + Str(pos) Else ’(2) pos = j s = s + "→" + Str(pos) End If End If Next jNext i Label1.Caption = "位置變化情況:" + s For i = 1 To n List2.AddItem Str(a(i))Next iEnd Sub答案 (1) k=a(j-1) (2)ElseIf pos=j-1 Then考點(diǎn)四 查找算法及程序?qū)崿F(xiàn)2015—2019年真題·提升題組1.(2019浙江4月選考,12,2分)有1個(gè)升序排列的數(shù)組a(a(1)~a(n),n≥3),從左到右相鄰兩個(gè)元素的差值(后一個(gè)元素值減去前一個(gè)元素值)先由小到大、再由大到小,且相鄰兩個(gè)差值不相等,為了查找相鄰兩個(gè)元素的最大差值,小李編寫(xiě)的VB程序段如下:i = 1:j = nDo While i + 1 < j m = (i + j) \ 2 If a(m + 1) - a(m) > a(m) - a(m - 1) Then ① Else ?、凇 ?br/> End IfLoopLabel1.Caption="相鄰兩個(gè)元素的最大差值是" + Str(a(j) - a(i)) 上述程序段兩個(gè)方框處的語(yǔ)句分別為( )A.① i = m ?、?j = m B.① i = m ?、?j = m - 1C.① i = m + 1 ② j = m - 1 D.① i = m + 1 ② j = m答案 A 2.(2018浙江4月選考,12,2分)數(shù)組a 為一組正整數(shù),奇數(shù)在前,偶數(shù)在后。奇數(shù)與偶數(shù)已分別按升序排序。依據(jù)對(duì)分查找思想,設(shè)計(jì)一個(gè)在數(shù)組a 中查找數(shù)據(jù)Key 的程序。實(shí)現(xiàn)該功能的VB 程序段如下:i = 1: j = 10Key = Val(Text1.Text)Do While i <= j m = (i + j) \ 2 If a(m) = Key Then Exit Do ’Exit Do表示退出循環(huán) If Key Mod 2 = 1 And a(m) Mod 2 = 0 Then (1) ElseIf Key Mod 2 = 0 And a(m) Mod 2 = 1 Then (2) Else (3) End IfLoopIf i > j Then s = "沒(méi)有找到!" Else s = "位置:" + Str(m)Text2.Text = s上述程序中方框處可選語(yǔ)句為:①i = m + 1②j = m - 1③If Key < a(m) Then j = m - 1 Else i = m + 1則(1)、(2)、(3)處語(yǔ)句依次是( )A.①、②、③ B.①、③、②C.②、①、③ D.③、②、①答案 C 3.(2017浙江11月選考,12,2分)某對(duì)分査找算法的VB程序段如下:i = 1: j = 7: s = ""key = Int(Rnd*100)Do While i <= j m = (i + j) \ 2 If key = a(m) Then s = s + "M": Exit Do ’Exit Do表示退出循環(huán) ElseIf key < a(m) Then j = m - 1: s = s + "L" Else i = m + 1: s = s + "R" End IfLoopText1.Text = s數(shù)組元素a(1)到a(7)的值依次為“24,35,38,41,45,69,78”。該程序段執(zhí)行后,文本框Text1中顯示的內(nèi)容可能是( )A.RL B.LMR C.RLR D.LRLM答案 C 4.(2017浙江4月選考,11,2分)某對(duì)分查找算法的VB程序段如下:key = Val(Text1.Text)i = 1: j = 10Text2.Text = ""Do While i <= j m = Int((i + j) / 2 + 0.5) If key = a(m) Then Exit Do ’Exit Do表示退出循環(huán) If key < a(m) Then j = m - 1 Else i = m + 1 Text2.Text = Text2.Text + Str(a(m))Loop數(shù)組元素a(1)到a(10)的值依次為“8,17,24,30,36,40,55,58,61,66”,文本框Text1中輸入的值是30,執(zhí)行該程序段,文本框Text2中顯示的是( )A.40 24 B.40 24 36 C.36 24 D.36 17 24答案 B 5.(2016浙江10月選考,12,2分)某對(duì)分査找算法的VB程序段如下:i= 1 : j =9 : n =0key=Val(Text1.Text)Do While i<= j n=n+1 m=Fix((i + j) / 2) If key = d(m) Then Exit Do If keyLoop數(shù)組元素d(1)到d(9)的值依次為“7,12,18,25,39,58,61,72,86”。若該程序段運(yùn)行結(jié)束后,n的值為2,則key的值是( )A.39 B.18或61 C.18或72 D.12或61答案 D 6.(2016浙江4月選考,12,2分)已知一無(wú)序數(shù)組a(下標(biāo)1到n),通過(guò)引入數(shù)組b(下標(biāo)1到n),使得a(b(1))≤a(b(2))≤a(b(3))≤……≤a(b(n))(示例如圖所示),對(duì)這些有序數(shù)據(jù)可進(jìn)行對(duì)分查找。則第一次查找時(shí),中點(diǎn)位置m與中點(diǎn)值分別是( )A.m的值是Fix((1+n)/2),中點(diǎn)值是 a(m)B.m的值是Fix((1+n)/2),中點(diǎn)值是 a(b(m))C.m的值是Fix((b(1))+b(n))/2),中點(diǎn)值是 a(m)D.m的值是Fix((b(1))+b(n))/2),中點(diǎn)值是 a(b(m))答案 B 7.(2018浙江11月選考,16,3分)數(shù)組a中存儲(chǔ)的是左右交替上升的n個(gè)正整數(shù),如下表所示:a(1) a(2) a(3) …… a(n-2) a(n-1) a(n)3 25 38 …… 55 31 12依據(jù)對(duì)分查找思想,設(shè)計(jì)一個(gè)在數(shù)組a中查找數(shù)據(jù)key的程序,實(shí)現(xiàn)該功能的VB程序如下,但加框處代碼有錯(cuò),請(qǐng)改正。Private Sub Command1_Click()Const n = 6Dim a(1 To n) As Integer, flag As BooleanDim i As Integer, j As Integer, m As Integer, key As Integer’讀取一組正整數(shù),按上述規(guī)則存入數(shù)組a中,代碼略key = Val(Text1.Text)i = 1j = (n + 1) \ 2flag = FalseDo While i < j And Not flag ’(1) m = (i + j) \ 2 If key = a(m) Then flag = True ElseIf key < a(m) Then j = m - 1 Else i = m + 1 End IfLoopIf Not flag And j > 0 Then m = n-i ’(2) If key = a(m) Then flag = TrueEnd IfIf flag Then Text2.Text = Str(m)Else Text2.Text = "找不到"End IfEnd Sub答案 (1)i<=j (2)n-i+2 或 n-j+1考點(diǎn)五 遞歸算法及程序?qū)崿F(xiàn)考點(diǎn)六 算法在數(shù)據(jù)管理中的應(yīng)用2015—2019年真題·提升題組 (2016浙江10月選考,17,6分)小王與小李合作編寫(xiě)一個(gè)成績(jī)統(tǒng)計(jì)的VB程序:小王編寫(xiě)一個(gè)過(guò)程,該過(guò)程從數(shù)據(jù)庫(kù)讀取某一指定科目的相關(guān)數(shù)據(jù),存儲(chǔ)在數(shù)組a中;小李編寫(xiě)一個(gè)過(guò)程,該過(guò)程依據(jù)數(shù)組a中的相關(guān)數(shù)據(jù)統(tǒng)計(jì)各班級(jí)平均分,小王與小李約定的數(shù)組a各元素含義如下表所示。數(shù)組元素 數(shù)組元素的含義a(1) 存儲(chǔ)班級(jí)數(shù)na(2) 從a(2)到a(n+1)依次存儲(chǔ)第1、第2、……、第n個(gè)班級(jí)的人數(shù)… a(n+1) a(n+2) 從a(n+2)開(kāi)始依次存儲(chǔ)第1個(gè)班級(jí)每個(gè)學(xué)生的單科成績(jī)、第2個(gè)班級(jí)每個(gè)學(xué)生的單科成績(jī)、……、第n個(gè)班級(jí)每個(gè)學(xué)生的單科成績(jī)… … 程序功能如下:在文本框Text1中輸入科目名稱,單擊“讀數(shù)據(jù)庫(kù)”按鈕Command1,程序從數(shù)據(jù)庫(kù)讀取數(shù)據(jù);單擊“開(kāi)始統(tǒng)計(jì)”按鈕Command2,程序進(jìn)行統(tǒng)計(jì)處理,結(jié)果輸出在列表框List1中。程序運(yùn)行界面如圖所示。實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)回答下列問(wèn)題:(1)根據(jù)程序運(yùn)行界面中的數(shù)據(jù)及數(shù)組a各元素的含義進(jìn)行分析,數(shù)組元素a(5)的值為 (填寫(xiě)數(shù)值)。?(2)分析程序,可知數(shù)據(jù)庫(kù)的文件名為 。?(3)請(qǐng)?jiān)趧澗€處填入合適的代碼。Dim a(1 To 600)As Integer ’數(shù)組大小滿足處理要求Private Sub Command1_Click() ’本過(guò)程由小王完成,從數(shù)據(jù)庫(kù)讀取指定科目的各相關(guān)數(shù)據(jù),存儲(chǔ)在數(shù)組a中 Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset conn.ConnectionString="provider = Microsoft.ACE.OLEDB.12.0;datasource="+"Score.accdb" conn.Open Set rs.ActiveConnection=conn ’本過(guò)程的其他語(yǔ)句略End SubPrivate Sub Command2_Click() ’本過(guò)程由小李完成,依據(jù)數(shù)組a中的相關(guān)數(shù)據(jù)統(tǒng)計(jì)各班級(jí)平均分 Dim i As Integer,j As Integer,n As Integer Dim p As Integer,sum As Integer,aver As Single ?、佟 ? p=n+2 For i=1 To n sum=0 For j=1 To a(i+1) ② ? p=p+1 Next j aver=sum/a(i+1) List1.AddItem Str(i)+" "+Str(a(i+1))+" "+Str(aver) Next iEnd Sub答案 (1)33 (2)Score.accdb(3)①n=a(1)?、趕um=sum+a(p) 教師專用題組1.采用如下對(duì)分查找算法對(duì)數(shù)組a中7個(gè)有序數(shù)據(jù)“about、count、end、fly、high、jack、month”進(jìn)行查找。i=1:j=7:x=“high”Do While i <=j m=(i+j)\2 If a(m)=x Then Exit Do If a(m) > x Then j=m-1 Else i=m+1 End IfLoop執(zhí)行完上述代碼后,根據(jù)最終變量值判斷下列表達(dá)式,其中成立的是( )A.i=j B.i=m-1 C.j>m+1 D.j答案 A 2.(2015浙江10月選考,11,2分)已知單調(diào)函數(shù)f(x)在[0,1]區(qū)間存在一個(gè)x0,使f(x0)=0?,F(xiàn)用對(duì)分查找法搜索x0的值,開(kāi)始搜索區(qū)間為[0,1],若經(jīng)過(guò)10次對(duì)分查找后還需繼續(xù)搜索,則第11次搜索區(qū)間的長(zhǎng)度為( )A.1/2 B.1/10 C.1/102 D.1/210答案 D 3.“角谷猜想”規(guī)則:對(duì)任意一個(gè)大于1的正整數(shù)n,若n 是奇數(shù),則n的值改為3n+1;若n是偶數(shù),則n的值改為n/2,重復(fù)以上操作,n 的值最終會(huì)變?yōu)?。使用VB驗(yàn)證這個(gè)猜想。程序界面如圖所示,在文本框Text1中輸入一個(gè)大于1的正整數(shù),單擊“驗(yàn)證”按鈕Command1,在列表框List1中輸出每一步的運(yùn)算過(guò)程。(1)在界面設(shè)計(jì)時(shí),沒(méi)有使用到的控件為 (填字母)。 ?(2)為實(shí)現(xiàn)上述功能,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Command1_Click()Dim n As Integer, i As IntegerList1.Clear ?、佟 ?If n > 1 Then List1.AddItem "步數(shù)對(duì)應(yīng)值" i=1 Do While ?、凇 ? If n Mod 2=1 Then n=n * 3+1 Else n= ③ ? End If List1.AddItem Str(i)+" "+Str(n) i=i+1 LoopElse List1.AddItem "輸入有誤!"End IfEnd Sub答案 (1)C (2)①n=Val(Text1.Text) ②n<>1③n/2或n\24.小明編寫(xiě)了一個(gè)簡(jiǎn)易加法器VB程序,運(yùn)行界面如圖a所示。在文本框Text1中輸入一個(gè)數(shù)字后再輸入空格表示一個(gè)加數(shù)輸入完畢,連續(xù)不斷輸入不同的加數(shù),待所有需要相加的數(shù)輸入完畢后,單擊“求和”按鈕Command1后,在標(biāo)簽Label1中顯示加數(shù)的個(gè)數(shù)以及總和。 圖a 圖b(1)該界面中除了窗體外,還使用了 個(gè)對(duì)象,界面中用于輸出結(jié)果的標(biāo)簽Label1,是使用了圖b控件工具箱中的 (填數(shù)字)控件添加的。?(2)實(shí)現(xiàn)上述功能的VB程序如下,在劃線處填入合適的代碼。Private Sub Command1_Click()Dim s As String,t As String,c As StringDim n As IntegerDim k As Integer ’記錄加數(shù)的個(gè)數(shù)Dim sum As Integer ’記錄和s=Text1.Textt="" ?、佟 ?For i =1 To n c =Mid(s, i, 1) If c= " " Then ’如果是空格的情況 sum=sum + Val(t) k=k + 1 t= "" Else t= ?、凇 ? End IfNextLabel1.Caption="這" + ?、邸 ? "個(gè)數(shù)的和為:"+ Str(sum)?End Sub(3)如果輸入“5 4 6 8”,則得到的和為 。?答案 (1)3;① (2)①n=Len(s)②t+c或t+mid(s,i,1)?、踫tr(k) (3)155.(2016溫州3月選考模擬,16,4分)如果兩個(gè)質(zhì)數(shù)的差為2,則這兩個(gè)質(zhì)數(shù)稱為孿生質(zhì)數(shù)對(duì)。編寫(xiě)VB程序,實(shí)現(xiàn)如下功能:單擊“顯示孿生質(zhì)數(shù)對(duì)”按鈕Command1,在列表框List1中顯示100以內(nèi)的所有孿生質(zhì)數(shù)對(duì)(運(yùn)行效果如圖所示)。實(shí)現(xiàn)上述功能的VB代碼如下,但加框處代碼有錯(cuò),請(qǐng)改正。Dim a(1 To 50)As IntegerPrivate Sub Command1_Click()Dim i As Integerk=0:i=3Do While i<=100 If prime(i) Then ’(1) k=k+1 a(k)=i End If i=i+2LoopFor i=2 To k If a(i)=a(i+1)+2 Then ’(2) List1.AddItem Str(a(i-1))+"和"+Str(a(i)) End IfNext iEnd SubFunction prime(x As Integer)As Booleanprime=FalseFor i=2 To Int(Sqr(x)) If x Mod i=0 Then prime=True Exit For End IfNext iEnd Function答案 (1)Not prime(i)或 prime(i)=False (2)a(i)=a(i-1)+26.(2017浙江4月選考,16,3分)小王編寫(xiě)了一個(gè)實(shí)現(xiàn)文字查找替換功能的VB程序,運(yùn)行界面如圖所示。文本框Text1顯示原文內(nèi)容,Text2中輸入查找內(nèi)容,Text3中輸入替換內(nèi)容,單擊“全部替換”按鈕Command1后,Text4顯示查找替換的結(jié)果,Text5顯示替換的次數(shù),Text6顯示“查找內(nèi)容”在原文中的起始位置。實(shí)現(xiàn)上述功能的VB程序如下,但加框處代碼有錯(cuò),請(qǐng)改正。Private Sub Command1_Click()Dim s As String, resule As String, pos As StringDim count As Integer, i As Integeri = 1: count = 0result = "": pos = ""Do While i <= Len(Text1.Text) s = Mid(Text1.Text, i, Len(Text2.Text)) If s = Text2.Text Then result = result + Text3.Text count = count + 1 pos = pos + Str(count) ’(1) i = i + Len(Text2.Text) Else result = result + Text2.Text ’(2) i = i + 1 End If LoopText4.Text = resultText5.Text = Str(count) Text6.Text = posEnd Sub答案 (1)pos+Str(i)(2)result=result+Mid(Text1.Text,i,1)7.(2015浙江10月選考,14,5分)編寫(xiě)VB程序,實(shí)現(xiàn)如下功能:在文本框Text1和Text2中分別輸入一個(gè)整數(shù),單擊命令按鈕Command1,在列表框List1中顯示結(jié)果,運(yùn)行效果如圖a所示。結(jié)果包含兩列數(shù)據(jù),第1列為相鄰兩數(shù)之間的攝氏溫度值(間隔1攝氏度、升序),第2列為對(duì)應(yīng)的華氏溫度值。圖a圖b(1)要使命令按鈕Command1上顯示的文本改為“轉(zhuǎn)換”,可在其屬性窗口(圖b)中將 屬性的屬性值修改為“轉(zhuǎn)換”。?(2)為實(shí)現(xiàn)上述功能,請(qǐng)?jiān)趧澗€處填入合適代碼或選項(xiàng)。Private Sub Command1_Click( )Dim t1 As Integer,t2 As IntegerDim i As Integer,t As IntegerDim f As Single ’f存儲(chǔ)華氏溫度值List1.Cleart1=Val(Text1.Text)t2=Val(Text2.Text)If ?、佟 hen ’(選填字母,從下面A、B、C、D四個(gè)選項(xiàng)中選取一項(xiàng))? t=t1:t1=t2:t2=tEnd Ifi=t1Do While ② ? ’(選填字母,從下面A、B、C、D四個(gè)選項(xiàng)中選取一項(xiàng))? f=i*9/5+32 ’攝氏溫度轉(zhuǎn)換為華氏溫度 List1.AddItem Str(i)+“ ”+Str(f) i= ?、邸? ’(填程序代碼)?LoopEnd Sub劃線①、②處的選項(xiàng): A.i<=t2 B.f<=t2 C.t1>t2 D.i答案 (1)Caption (2)①C ②A?、踚+18.合唱隊(duì)列是按隊(duì)員的身高進(jìn)行排列,形成中間高兩邊有序降低的隊(duì)形。例如有六個(gè)隊(duì)員“己、戊、丁、丙、乙、甲”身高依次由低到高,則排列后的順序?yàn)椤拔?、丙、甲、乙、丁、己”。小李用VB編寫(xiě)模擬“合唱隊(duì)列”程序,功能如下:在文本框Text1中輸入各隊(duì)員身高,輸入結(jié)束后回車(chē),則輸入的各隊(duì)員身高分別存入數(shù)組a中;單擊“合唱隊(duì)列”按鈕Command1,對(duì)數(shù)組a的元素進(jìn)行有序排列后,將各元素存入數(shù)組c中形成合唱隊(duì)列,并將結(jié)果顯示在文本框Text2中。程序運(yùn)行界面如圖所示。(1)如果輸入各隊(duì)員身高為“190,191,194,179,166”,則合唱隊(duì)列的結(jié)果為 。?(2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Dim a(1 To 20) As IntegerDim n As IntegerPrivate Sub Text1_KeyPress(KeyAscii As Integer)’輸入各隊(duì)員身高分別存入數(shù)組a中,隊(duì)員個(gè)數(shù)為n,代碼略End SubPrivate Sub Command1_Click()Dim c(1 To 20) As IntegerDim right As Integer,left As Integer,i As IntegerFor i = 1 To n-1 For j = 1 To n-i If ?、佟 hen? t = a(j):a(j)= a(j + 1) :a(j + 1)= t End If Next jNext i’下列程序段實(shí)現(xiàn)數(shù)組c的合唱隊(duì)列 m=(1+n) \2left=m:right = mc(m)=a(n)i = 2Do While i< = n If i Mod 2 = 0 Then right = right +1 c(right) = a(n-i+l) Else ?、凇 ? c(left)= a(n-i+l) End If i = i+lLoops= ?、邸 ?For i = 2 To n s = s+","+Str(c(i))Next iText2.Text = sEnd Sub答案 (1)166,190,194,191,179(2)①a(j)>a(j+1)?、趌eft=left-1 ③Str(c(1))9.有一組正整數(shù),要求僅對(duì)其中的偶數(shù)進(jìn)行降序排序。排序后偶數(shù)在前,奇數(shù)在后。排序示例如圖所示。排序前 75 78 60 86 61 75 36 88排序后 88 86 78 60 36 75 61 75實(shí)現(xiàn)上述功能的VB程序如下,但加框處代碼有錯(cuò),請(qǐng)改正。Const n = 8Dim a(1 To n) As IntegerPrivate Sub Form_Load()’排序前數(shù)據(jù)存儲(chǔ)在數(shù)組a中,并在文本框Text1中顯示End SubPrivate Sub Command1_Click()Dim k As Integer, i As Integer, j As Integer, t As Integeri = 1Do While i <= n -1 k = i For j = i + 1 To n If a(i) Mod 2 = 1 And a(k)Mod 2 = 0 Then ’① k = j ElseIf a(k) Mod 2 = 0 And a(j) Mod 2 = 0 And a(j) > a(k) Then k = j End If Next j If k <> i Then t = a(k): a(k) = a(i): a(i) = t End If i=j+k ’②Loop’依次輸出排序后的數(shù)據(jù),代碼略End Sub答案?、賏(k) Mod 2=1 And a(j) Mod 2=0 ②i=i+110.編寫(xiě)一個(gè)成績(jī)查找程序,只要輸入成績(jī),即可輸出其排名、同分?jǐn)?shù)的人數(shù)以及比此分高的人數(shù)。具體算法思路如下:(1)預(yù)處理。用數(shù)組a存放不同的分值,數(shù)組b存放相同分?jǐn)?shù)的人數(shù),數(shù)組s存放高于此分?jǐn)?shù)的人數(shù),數(shù)組下標(biāo)表示名次。依次從數(shù)據(jù)庫(kù)讀取每個(gè)學(xué)生的成績(jī)(數(shù)據(jù)庫(kù)中每個(gè)學(xué)生的成績(jī)已降序存儲(chǔ),即從高到低排列),當(dāng)讀入數(shù)與前一個(gè)數(shù)相同時(shí),該名次的人數(shù)加1,當(dāng)讀入數(shù)與前一個(gè)數(shù)不同時(shí),名次加1,即數(shù)組下標(biāo)加1,存儲(chǔ)當(dāng)前分?jǐn)?shù),求高于本分?jǐn)?shù)的人數(shù)并存儲(chǔ)。舉例:如果數(shù)據(jù)庫(kù)中有一組成績(jī)(降序):95,95,93,93,92,91,90,按上述算法處理,三個(gè)數(shù)組的最終結(jié)果如下: 下標(biāo) 數(shù)組 1 2 3 4 5a 95 93 92 91 90b 2 2 1 1 1s 0 2 4 5 6(2)對(duì)需要查找的成績(jī)進(jìn)行二分查找。讀入需要查找的成績(jī)x,在數(shù)組a中二分查找成績(jī),若找到,輸出名次、相同分?jǐn)?shù)的人數(shù)和高于本分?jǐn)?shù)的人數(shù);若找不到,輸出“查無(wú)此分”。程序代碼如下,在橫線處填入合適的代碼。Dim rank As IntegerDim a(1 to 1000) As Integer ’存放不同的分?jǐn)?shù)值Dim b(1 to 1000) As Integer ’存放相同分?jǐn)?shù)的人數(shù)Dim s(1 to 1000) As Integer ’存放高于此分?jǐn)?shù)的人數(shù)rank=0Private Sub Form_Load() Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim tmp As Integer, n As Integer tmp=-1: n=0 conn.ConnectionString="provider=Microsoft.ACE.OLEDB.12.0;data source="App.Path+"Score.accdb" conn.open Set rs.ActiveConnection=conn rs.open "Select * from score" n=0 Do While Not rs.EOF n=n+1 mark=rs.fields("成績(jī)") If mark=tmp Then ’當(dāng)前讀入分?jǐn)?shù)與上一個(gè)分?jǐn)?shù)相同時(shí),對(duì)應(yīng)名次的人數(shù)增加1 b(rank)=b(rank)+1 Else ’當(dāng)前讀入分?jǐn)?shù)與上一個(gè)分?jǐn)?shù)不同時(shí) rank= ?、佟 卧黾? ? a(rank)= ?、凇 ?’存儲(chǔ)當(dāng)前分?jǐn)?shù)到數(shù)組a中? s(rank)= ?、邸 蟾哂诒痉?jǐn)?shù)的人數(shù)并存儲(chǔ)至數(shù)組s? b(rank)=1 ’將自身統(tǒng)計(jì)入同分人數(shù) End If ④ ’更新上一個(gè)分?jǐn)?shù) ? rs.Movenext LoopEnd SubPrivate Sub Command1_Click() Dim x As Integer,low As Integer,high As Integer,mid As Integer x=Val(Text1.Text) low=1: high=rank mid=(low+high)\ 2 Do While low <=high And ?、荨 ? mid=(low+high)\ 2 If a(mid) < x Then high=mid-1 Else low=mid+1 End If Loop If a(mid)=x Then Label1.Caption="名次:"+mid+"同分人數(shù):"+b(mid)+"高于此分人數(shù):"+s(mid) Else Label1.Caption="查無(wú)此分" End IfEnd Sub答案?、賠ank+1 ②mark ③n-1 或b(rank-1)+s(rank-1) ④tmp=mark?、輆(mid)<>x11.活動(dòng)課上,n個(gè)學(xué)生要兩兩組隊(duì)進(jìn)行拔河比賽,要求每個(gè)小組總體重不超過(guò)120 kg,小林想知道最多可以組成多少個(gè)隊(duì)伍,并希望得到可行的組隊(duì)方案。于是設(shè)計(jì)了如下界面的程序,在文本框Text1中輸入n 個(gè)學(xué)生的體重(數(shù)字之間用逗號(hào)隔開(kāi)),單擊“隊(duì)伍”按鈕Command1后在標(biāo)簽Label1上顯示最多可組隊(duì)數(shù)量,同時(shí)在列表框List1輸出方案。實(shí)現(xiàn)上述功能程序如下,在劃線處填入合適的代碼。Dim n As IntegerDim a(1 To 50) As IntegerSub makedata(s As String)’該過(guò)程實(shí)現(xiàn)將輸入的體重分別存入數(shù)組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= ?、佟 ? 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.TextCall makedata(s) ’調(diào)用過(guò)程For i=1 To n-1 ’實(shí)現(xiàn)降序排序 For j=n To i+1 Step -1 If ?、凇 hen ? a(j)=a(j)+a(j-1):a(j-1)=a(j)-a(j-1):?、邸? End If Next jNext i’下列程序段實(shí)現(xiàn)計(jì)算最多可組隊(duì)伍cnt=0: st=1: ed=nDo While st < ed If a(st)+a(ed) <=120 Then List1. AddItem Str(a(st))+"和"+Str(a(ed))+"組隊(duì)" cnt=cnt+1 st=st+1 ④ ? Else st=st+1 End IfLoopLabel2. Caption="最多可以組"+Str (cnt)+"組隊(duì)伍"End Sub答案 ① x * 10+Asc(c)-Asc(“0”) ② a(j) > a(j-1) ③ a(j)=a(j)-a(j-1) ④ ed=ed-112.(2016浙江4月選考,14,5分)編寫(xiě)VB程序,實(shí)現(xiàn)如下功能:在文本框Text1中輸入某一年份,單擊“天干地支與生肖”按鈕Command1,在列表框List1中輸出該年份開(kāi)始的12個(gè)年份及對(duì)應(yīng)的“天干地支”與“生肖”,運(yùn)行界面如圖所示,程序代碼如下。(1)代碼“Private Sub Command1_Click()”中的Click是 (單選,填字母:A.對(duì)象名/B.屬性名/C.事件名)。?(2)為實(shí)現(xiàn)上述功能,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Command1_Click()Dim a As Integer, b As IntegerDim i As Integer, n As IntegerDim c1 As String, s1 As StringDim c2 As String, s2 As StringDim c3 As String, s3 As StringList1.Clears1="甲乙丙丁戊己庚辛壬癸"s2="子丑寅卯辰巳午未申酉戌亥"s3="鼠牛虎兔龍蛇馬羊猴雞狗豬"n=Val(Text1.Text)For i=n To ?、佟 ? a=(i+6) Mod 10 b=(i+8) Mod 12 c1=Mid(s1, a+1, 1) c2=Mid(s2, b+1, 1) c3=Mid(s3, b+1, 1) List1.AddItem ?、凇 ? "年" +c1+c2+" "+c3?Next iEnd Sub(3)由上述算法可知,2024年對(duì)應(yīng)的“天干地支”為 。?答案 (1)C (2)①n+11?、赟tr(i) (3)甲辰13.(2016浙江10月選考,14,5分)編寫(xiě)“加法練習(xí)題生成器”程序,實(shí)現(xiàn)如下功能:在文本框Text1中輸入題數(shù)n,單擊“生成”按鈕Command1,在列表框List1中顯示n個(gè)兩數(shù)之和小于100的加法練習(xí)題。程序運(yùn)行界面如圖a所示。(1)在設(shè)計(jì)程序界面時(shí),應(yīng)使用圖b所示“控件工具箱”中的 (填寫(xiě)相應(yīng)編號(hào))添加“生成”按鈕。?(2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Command1_Click() Dim n As Integer, i As Integer, a As Integer, b As Integer Randomize n = Val(Text1.Text) i= ① ? Do While i<= n a = Int(Rnd * 100) b = Int(Rnd * 100) If ?、凇?Then? List1.AddItem "(" + Str(i) + ")" + Str(a) + "+" + Str(b) + "=" i = i + 1 End If LoopEnd Sub(3)運(yùn)行該程序,在文本框中輸入5,單擊“生成”按鈕后,對(duì)語(yǔ)句a = Int(Rnd * 100)執(zhí)行次數(shù)的描述,最合理的是 (單選,填字母:A.執(zhí)行次數(shù)等于5/B.執(zhí)行次數(shù)大于等于5/C.執(zhí)行次數(shù)小于等于5)。?答案 (1)3 (2)①1?、赼+b<100 或其他等價(jià)表達(dá)式(3)B14.(2015浙江10月選考,16,4分)n個(gè)數(shù)據(jù)的冒泡排序需要經(jīng)過(guò)n-1遍加工,每一遍加工自下而上比較相鄰兩個(gè)數(shù)據(jù),把較小者交換到上面。小劉發(fā)現(xiàn):當(dāng)某一遍加工過(guò)程中沒(méi)有數(shù)據(jù)交換,說(shuō)明數(shù)據(jù)已經(jīng)有序,無(wú)需進(jìn)一步加工。為此,小劉對(duì)算法進(jìn)行優(yōu)化,編寫(xiě)了一個(gè)VB程序,功能如下:運(yùn)行程序時(shí),在列表框List1中顯示排序前數(shù)據(jù),單擊“排序”按鈕Command1,在列表框List2 中顯示這些數(shù)據(jù)按升序排序后的結(jié)果,在標(biāo)簽Label3中顯示排序過(guò)程的加工遍數(shù)。運(yùn)行效果如圖所示。實(shí)現(xiàn)上述功能的VB代碼如下,但加框處代碼有錯(cuò),請(qǐng)改正。Dim a(1 To 8) As IntegerDim n As IntegerPrivate Sub Form_Load()’n=8,排序前數(shù)據(jù)存儲(chǔ)在數(shù)組a中,并在列表框List1中顯示’代碼略End SubPrivate Sub Command1_Click()Dim flag As Boolean ’flag值為T(mén)rue表示一遍加工中發(fā)生過(guò)交換i = 1flag = TrueDo While i <= n - 1 Or flag = True ’(1) flag= False For j= n To i + 1 Step -1 If a(j) < a(j - 1) Then k = a(j): a(j) = a(j - 1): a(j - 1) = k flag = True End If Next j i = i + 1LoopLabel3.Caption = "排序過(guò)程的加工遍數(shù)為" +Str(i) ’(2)For i = 1 To n List2.AddItem Str(a(i))Next iEnd Sub答案 (1)i <=n - 1 And flag=True (2)Str(i-1)【三年模擬】A組 2018—2020年模擬·考點(diǎn)題組考點(diǎn)一 解析算法及程序?qū)崿F(xiàn)1.基姆拉爾森公式可根據(jù)日期判斷是星期幾?;防瓲柹皆赩B中的計(jì)算式如下:week= (d + 2 * m + 3 * (m + 1) \ 5 + y + y \ 4 - y \ 100 + y \ 400 + 1) Mod 7。在公式中d表示日期中的日數(shù),m表示月份數(shù),y表示年數(shù)。余數(shù)為0表示星期日,余數(shù)為1表示星期一,以此類(lèi)推。在公式中有個(gè)特殊的地方:把一月和二月看成上一年的十三月和十四月,例:如果是2004-1-10,則換算成2003-13-10代入公式計(jì)算。小明編寫(xiě)了VB程序,運(yùn)行界面如圖所示,程序代碼如下。 Private Sub Command1_Click() Dim y As Integer,m As Integer,d As Integer,week As Integer Dim ss As String,weekday As String ss = "日一二三四五六" y = Val(Text1.Text) m = Val(Text2.Text) d = Val(Text3.Text) If ?、佟 hen? m = m + 12 y = y - 1 End If week = (d + 2 * m + 3 * (m + 1) \ 5 + y + y \ 4 - y \ 100 + y \ 400 + 1) Mod 7 weekday = ② ? Label1.Caption = "星期" & weekdayEnd Sub(1)代碼“Private Sub Command1_Click()”中的Command1_Click()是 (單選,填字母:A.對(duì)象名/B.事件/C.事件處理過(guò)程)。?(2)為實(shí)現(xiàn)上述功能,請(qǐng)?jiān)趧澗€處填入合適的代碼。(3)由上述算法可知,2010年2月5日應(yīng)為星期 。?答案 (1)C (2)①m=1 Or m=2或m<3或m<=2②Mid(ss,week+1,1) (3)五2.(2019金華十校第一學(xué)期調(diào)研考試,14,5分)趣味數(shù)學(xué)題:n的階乘n!=1×2×3×4×5×…×n,當(dāng)n≥5時(shí),其結(jié)果末尾必然包含1或多個(gè)0,求n!(5≤n≤32726)末尾包含0的個(gè)數(shù)。算法思路:n較大時(shí),n!的值將超出long類(lèi)型范圍,求出n!的結(jié)果再數(shù)0的個(gè)數(shù)不現(xiàn)實(shí)。那么末尾的0到底是從哪里來(lái)的?每一個(gè)因子5與任一偶數(shù)相乘就會(huì)產(chǎn)生一個(gè)0。所以末尾有多少0是由因子5的個(gè)數(shù)決定的,求出因子5的個(gè)數(shù)即是末尾0的個(gè)數(shù)。程序運(yùn)行界面和代碼如下所示。(1)為使窗體加載時(shí),窗體標(biāo)題欄自動(dòng)顯示為“第14題程序”,則可以在 過(guò)程(填寫(xiě)過(guò)程名)中添加代碼:Form1.Caption=“第14題程序”。?(2)實(shí)現(xiàn)上述算法的VB程序如下,請(qǐng)補(bǔ)充程序中劃線處的代碼。Private Sub Command1_Click()Dim n As Integern = Val(Text1.Text)i = 1Do While ① ? s = s + n \ 5 ^ i i = i + 1LoopList1.AddItem Str(n) + "!末尾包含 0 的個(gè)數(shù):" + ?、凇?End Sub(3)根據(jù)上述算法,2018!末尾包含 0 的個(gè)數(shù)是 。?答案 (1)Form_load (2)①5 ^ i <= n 或其他等價(jià)表達(dá)式②Str(s) (3)5023.(2018浙南名校聯(lián)盟期末)Base64 編碼是將待轉(zhuǎn)換的字符串以每 3 個(gè)字節(jié)分為一組轉(zhuǎn)換為 24 位二進(jìn)制數(shù),再以每 6 位二進(jìn)制數(shù)一組分為 4 組,轉(zhuǎn)換為 4 個(gè)字節(jié)。對(duì)照下面的 Base64 編碼表,根據(jù)每個(gè)字節(jié)的十進(jìn)制值轉(zhuǎn)換為對(duì)應(yīng)的加密字符。十進(jìn) 制值 0 1 … 24 25 26 27 … 50 51 52 … 61 62 63加密 字符 A B … Y Z a b … y z 0 … 9 + -現(xiàn)設(shè)計(jì)一個(gè)程序,在文本框 Text1 輸入字符串(長(zhǎng)度為 3 的倍數(shù)),在文本框 Text2輸出對(duì)應(yīng)的 Base64 加密字符,運(yùn)行效果如圖所示,實(shí)現(xiàn)上述功能的 VB 代碼如下:Private Sub Command1_Click()Dim s As String, txt As StringDim s1 As String, t As StringDim tmp As Integer, n As IntegerDim i As Integer, j As IntegerDim ans As Stringtxt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-"s1 = Text1.TextFor i = 1 To Len(s1) n = Mid(s1, i, 1) t = "" For j = 1 To 8 t = n Mod 2 & t ?、佟 ? Next j s = s & tNext iFor i = 1 To Len(s) ’二進(jìn)制編碼轉(zhuǎn)換為加密字符 tmp = ?、凇 ? If i Mod 6 = 0 Then ans = ans & Mid(txt, tmp + 1, 1) tmp = 0 End IfNext iText2.Text = ansEnd Sub(1)代碼“Private Sub Command1_Click ()”中的 Command1_Click 是 (單選,填字母:A.屬性名 / B.事件名 / C.事件過(guò)程 / D.方法名)。?(2)程序代碼加框處有錯(cuò),請(qǐng)改正。(3)請(qǐng)將程序代碼劃線處語(yǔ)句補(bǔ)充完整。(4)根據(jù)圖中數(shù)據(jù),結(jié)合程序代碼,最終 i 的值是 。?答案 (1)C (2)Asc(Mid(s1,i,1))(3)①n=n\2 ②tmp * 2 + Val(Mid(s,i,1)) (4)49考點(diǎn)二 枚舉算法及程序?qū)崿F(xiàn)1.一個(gè)十進(jìn)制整數(shù)的二進(jìn)制表示中,如果數(shù)字“1”的個(gè)數(shù)多于數(shù)字“0”的個(gè)數(shù),則稱該整數(shù)為A 類(lèi)數(shù)。如十進(jìn)制整數(shù)26 的二進(jìn)制表示為11010,26 是一個(gè)A 類(lèi)數(shù)。下列VB程序的功能是:尋找前1000 個(gè)自然數(shù)中所有A 類(lèi)數(shù),在List1中輸出,并統(tǒng)計(jì)個(gè)數(shù),在Text1中輸出。請(qǐng)?jiān)谙旅鎰澗€處填入合適的代碼。Private Sub Command1_Click() Dim i, n ,s ,t, k As Integer ’s 為A 類(lèi)數(shù)的個(gè)數(shù),t 為二進(jìn)制數(shù)中“1”的個(gè)數(shù),k 為“0”的個(gè)數(shù) s = 0 For i = 1 To 1000 n = i: t = 0: k = 0 Do While n > 0 If ① Then t=t+1 Else k=k+1? ?、凇 ? Loop If t>k Then List1.AddItem Str(i) s = s + 1 End If Next i Text1.Text = Str(s)End Sub答案?、賜 Mod 2 <>0 或n Mod 2=1?、趎=n\22. (2019浙江十校聯(lián)盟適應(yīng)性考試)某密碼強(qiáng)度判斷程序功能如下:在文本框Text1中輸入由大寫(xiě)字母、小寫(xiě)字母、數(shù)字和其他字符 4種不同類(lèi)型字符組成的密碼字符串,單擊“判斷”按鈕Cmd1,在標(biāo)簽框Label3中顯示判斷結(jié)果。程序運(yùn)行界面如圖所示。密碼強(qiáng)度判斷條件如下:密碼長(zhǎng)度小于6,則強(qiáng)度為“弱”。在密碼長(zhǎng)度大于等于6的情況下,若只出現(xiàn)一種字符,則密碼強(qiáng)度為“弱”;若出現(xiàn)兩種不同字符,則密碼強(qiáng)度為“中”,出現(xiàn)3種以上不同字符,則密碼強(qiáng)度為“強(qiáng)”。(1)Cmd1對(duì)象屬于 類(lèi)。(單選,填字母:A.Label /B.TextBox /C.CommandButton)?(2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼。Private Sub Cmd1_Click()Dim n As Integer, i As Integer, m As Integer, s As String, c As String ① ?If n<6 Then Label3.Caption ="弱"Else s = "0000" For i = 1 To n c = Mid(Text1.Text, i, 1) If c >= "0" And c<="9" Then Mid(s,4,1) ="1"’將字符串s第4位上的字符替換為"1" Elself c >= "A" And c<= "Z" Then Mid(s,3,1) = "1" Elself c>= "a" And c <= "z" Then ② ? Else Mid (s,1,1) = "1" End If Next i m = 0 For i = 1 To 4 If Mid(s,i,1) = "1" Then ?、邸? Next i If m< 2 Then Label3.Caption="弱" Elself m = 2 Then Label3.Caption="中" Else Label3.Caption="強(qiáng)" End IfEnd IfEnd Sub(3)若文本框Text1中輸入的內(nèi)容為“a26$gh2!”,單擊判斷按鈕Cmd1,事件過(guò)程運(yùn)行結(jié)束時(shí),變量s的值為 。?答案 (1)C (2)①n = Len(Text1.Text)?、贛id(s, 2, 1) = "1" ③m = m + 1 (3)1101考點(diǎn)三 排序算法及程序?qū)崿F(xiàn)1.(2020屆浙江名校新高考研究聯(lián)盟(Z20聯(lián)盟)聯(lián)考)下列程序段運(yùn)行后,數(shù)組元素a(3)的值是( )a(1) = 55:a(2) = 44:a(3) = 11a(4) = 22:a(5) = 33For i = 1 To 2 For j = 1 To 4 - i If a(j) > a(j + 1) Then t = a(j):a(j) = a(j + 1):a(j + 1) =t End If Next jNext iA.44 B.33 C.22 D.11答案 A 2.(2018浙江“五校聯(lián)考”第一次考試,11,2分)有如下VB程序段: Dim a(1 To 6) As StringText1.Text = ""For i = 1 To 3For j = 1 To 6 - i If a(j) < a(j + 1) Then t = a(j): a(j) = a(j + 1): a(j + 1) = t Next j Text1.Text = Text1.Text + a(j)Next i數(shù)組元素a(1)到a(6)的值依次是“231”“123”“12”“59”“41”“33”。該程序段執(zhí)行后,文本框Text1中顯示的內(nèi)容是( )A.123341 B.23112359C.12123231 D.594133答案 C 3.有以下VB程序段:For i=1 To 3 For j=i To 5 If a(j) > a(j+1) Then t=a(j): a(j)=a(j+1): a(j+1)=t End If Next j List1.AddItem Str(a(i))Next ia(1)到a(6)的初始值依次為“8 6 5 7 9 3 ”,經(jīng)過(guò)該程序段“加工”后,列表框List1中顯示的是( )A.8 7 6 B.8 7 9 C.6 5 3 D.5 6 7答案 C 4.某算法的部分程序段如下:For i=1 To 7 k=i For j=i+1 To 8 If a(j)>a(k) And a(j)>85 Then k=j Next j If k<>i Then t=a(i): a(i)=a(k): a(k)=tNext i數(shù)組元素a(1)到a(8)的原始數(shù)據(jù)依次為“89,70,79,85,99,80,82,74”,則第3遍“加工”后數(shù)組元素a(1)到a(8)的數(shù)據(jù)依次是( )A.99,89,79,85,80,70,82,74B.99,89,85,79,70,80,82,74C.99,89,79,85,70,80,82,74D.99,89,85,82,80,79,74,70答案 C 5.(2019寧波新高考選考適應(yīng)性考試)下列VB程序段的功能為:對(duì)數(shù)組a中的n個(gè)元素進(jìn)行排序,生成左右交替上升的數(shù)據(jù)序列。如排序前a中元素依次為:48,34,86,46,85,100,程序運(yùn)行后a中元素依次為:34,48,86,100,85,46。For i = 1 To (1) k=i For j=i+1 To n-i+1 If a(k) > a(j) Then k = (2) Next j If k <> i Then t = a(k): a(k) = a(i): a(i) = t For j = (3) If a(j) < a(j + 1) Then t = a(j): a(j) = a(j + 1): a(j + 1) = t Next jNext i上述程序段3個(gè)方框處的表達(dá)式分別為( )A.(1)n-1 (2)j+1 (3)i To n-i+1B.(1)n-1 (2)j+1 (3)i To n-iC.(1)n\2 (2)j (3)i+1 To n-i+1D.(1)n\2 (2)j (3)i+1 To n-i答案 D 6.(2019浙江十校聯(lián)盟適應(yīng)性考試)有如下VB程序段:n = 8For i = 1 To n d(i) = Int(Rnd * 10) + 1Next iFor i = 2 To n - 1 k = 1 For j = 1 To n - i If d(j) * k > d(j + 2) * k Then Temp= d(j): d(j)=d(j + 2): d(j + 2)= temp End If Next jNext i執(zhí)行該程序段后,d數(shù)組各元素可能是( )A.3,10,3,5,4,4,10,1 B.0,3,4,5,6,6,7,8C.2,1,3,4,5,6,8,7 D.6,4,5,6,5,7,1,10答案 A 7.(2020屆浙江名校新高考研究聯(lián)盟(Z20聯(lián)盟)聯(lián)考)食堂排隊(duì)買(mǎi)菜問(wèn)題。在食堂排隊(duì)買(mǎi)菜時(shí),每個(gè)同學(xué)都有一個(gè)窗口買(mǎi)菜時(shí)間,如果某同學(xué)的等待時(shí)間超過(guò)他在窗口買(mǎi)菜時(shí)間的 3 倍,他就會(huì)不愉快,并且不參與排隊(duì),反之是愉快的。等待時(shí)間是指排在該同學(xué)之前的所有人的買(mǎi)菜時(shí)間之和。 已知每個(gè)同學(xué)在窗口的買(mǎi)菜時(shí)間,請(qǐng)確定如何排隊(duì)才能使愉快的人數(shù)最多,并輸出最多的人數(shù)。例如: 10 個(gè)同學(xué)的買(mǎi)菜時(shí)間如下表所示,則最多有 8 個(gè)人是愉快的。學(xué)生 編號(hào) 1 2 3 4 5 6 7 8 9 10買(mǎi)菜 時(shí)間 3 2 5 5 6 7 1 8 1 3最終是 否參與 排隊(duì) 是 是 是 是 否 是 是 否 是 是Const n = 10Dim a(1 To n) As IntegerPrivate Sub Command1_Click()Dim i As Integer,s As Integer,ans As Integer,t As Integer’讀取每個(gè)學(xué)生的買(mǎi)菜時(shí)間,依次存儲(chǔ)在數(shù)組 a 中,代碼略For i = 1 To n -1 k = i For j = n To i + 1 Step -1 If (2) Then k = j? Next j If a(i)<>a(k) Then t=a(i):a(i)=a(k):a(k)=tNext is = 0:ans = 0For i = 1 To n If s < ans Then s = s + a(i):ans = ans + 1Next iLabel1.Caption = "共有" + Str(ans) + " 個(gè)人是愉快的,且參與排隊(duì)買(mǎi)菜。 "(1)代碼“Private Sub Command1_Click()”中的 Command1 是 (單選,填字母: A.對(duì)象名/B.事件名/C.事件處理過(guò)程名)。?(2)請(qǐng)?jiān)趧澗€處填入合適代碼。(3)程序代碼的加框處有錯(cuò),請(qǐng)改正。(4)若 10 個(gè)同學(xué)的買(mǎi)菜時(shí)間都相同,則有 個(gè)人是愉快的,且參與排隊(duì)。?答案 (1)A (2)a(j) < a(k) (3)a(i)*3 >= s (4)48.(2020屆浙江十校聯(lián)盟聯(lián)考)紀(jì)念品分組問(wèn)題。某教師節(jié)晚會(huì)的紀(jì)念品分組規(guī)則如下:按紀(jì)念品價(jià)值進(jìn)行分組,每組總價(jià)值不超過(guò)限定值w且最多包含兩件,要求分組數(shù)最少。編寫(xiě)VB程序解決該問(wèn)題,程序運(yùn)行時(shí),在文本框Text1中依次輸入每件紀(jì)念品的價(jià)格(不超過(guò)w),以逗號(hào)分隔,在文本框Text2中輸入限定值w,單擊“分組”按鈕,在標(biāo)簽Label2上輸出最少的分組數(shù)。程序運(yùn)行界面如圖所示。(1)要使程序啟動(dòng)后,窗體的標(biāo)題欄顯示“紀(jì)念品分組”文字,可在Form_Load事件過(guò)程中添加語(yǔ)句 (單選,填字母:A.Form1="紀(jì)念品分組" / B.Form1.Name="紀(jì)念品分組" C.Form1.Caption="紀(jì)念品分組"/ D.Form1.Text="紀(jì)念品分組")。?(2)實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)?jiān)趧澗€處填入合適的代碼;并且加框處代碼有錯(cuò),請(qǐng)改正。Private Sub Command1_Click()Dim a(1 To 1000),n As Integer,w As Integer,t As IntegerDim i As Integer,j As Integer,cnt As IntegerDim s As String,ch As StringDim p As Integer,q As Integers=Text1.Text:w=Val(Text2.Text):n=0For i = 1 To Len(s) ch = Mid(s, i, 1) If ch ="," Then n = n +1: a(n) = t: t = 0 Else t =?、佟? End IfNext iFor i = n To 2 Step -1 For j = 1 To n-i’② If a(j) < a(j + 1) Then t = a(j): a(j) = a(j + 1): a(j + 1) = t End If Next jNext icnt=0p = 1: q = nDo While p < qcnt = cnt + 1 If?、邸?Then? p=p+1:q=q-1 Else p=p+1 End IfLoopIf p = q Then cnt = cnt + 1Label2.Caption = Str(cnt)End Sub(3)若在文本框 Text1中輸入 “50,30,100,70,80,40,50,20,”,文本框 Text2 中輸入 “110” , 單擊“分組”按鈕,標(biāo)簽Label2中顯示的內(nèi)容是 。?答案 (1)C (2)①t*10 + Val(ch) 或其他等價(jià)答案②i-1 或其他等價(jià)答案?、踑(p)+a(q)<=w 或其他等價(jià)答案(3)5考點(diǎn)四 查找算法及程序?qū)崿F(xiàn)1.某數(shù)組的6個(gè)元素依次為“27,32,57,78,80,90”。若對(duì)該數(shù)組進(jìn)行順序查找,其平均查找次數(shù)為(1+2+3+4+5+6)/6=7/2;若對(duì)該數(shù)組進(jìn)行對(duì)分查找,其平均查找次數(shù)為( )A.7/2 B.7/3 C.5/2 D.2答案 B 2.某對(duì)分查找算法的VB程序段如下:t="": i=0 : j=9 : key=62: f=FalseDo While i <=j And Not f m=Fix((i+j) / 2) t=t+Str(m) If a(m)=key Then f=True Elself a(m) > key Then i=m+1 t=t+"→" Else j=m-1 t=t+"←" End IfLoop數(shù)組元素a(0)到a(9)的值依次為“99, 94, 90, 87, 78,70, 63,56, 45,36”,執(zhí)行該程序段,t的值是( )A.“4→7←5→” B.“4→ 7← 5→ 6→”C.“4→7←5→6” D.“4→ 7← 5”答案 B 3.(2018浙南名校聯(lián)盟期末)有如下 VB 程序段:i=1 : j=8 : n=0Do While i <= j n = n + 1 m = (i + j) \ 2 If key < a(m) Then j=m-1 Else i=m+1Loop數(shù)組元素 a(1)到 a(8)的值依次為“22,32,39,48,71,82,96,106”。若該程序段運(yùn)行結(jié)束后,n 的值為 3,則 key 的值不可能是( )A.110 B.82 C.39 D.10答案 A 4.(2018浙江“五校聯(lián)考”,12,2分)有如下VB程序段:i = 1: j = 10:n = 0: Key = Val(Text1.Text) Do While i <= j m = (i + j) \ 2 If a(m) < Key Then i = m + 1: n = n + 1 Else j = m - 1: n = n - 1 End IfLoop數(shù)組元素a(1)到a(10)依次是33,42,48,57,69,71,75,89,91,96,在文本框Text1中輸入89,則變量n的最終值為( )A.2 B.1 C.0 D.-2答案 A 5.(2019衢州教學(xué)質(zhì)量檢測(cè))有 VB 程序段如下:a(1) = 2: a(2) = 2: a(3) = 5: a(4) = 6: a(5) = 7Key = 2i = 1: j = 5: flag = FalseDo While i <= j And Not flag m = (i + j) \ 2 If Key = a(m) Then s = "找到第" + Str(m) + "個(gè)" flag = True: Exit Do ElseIf Key < a(m) Then j = m - 1 Else i = m + 1 End If s = Str(m) + sLoopLabel1.Caption = s執(zhí)行該程序段后,在標(biāo)簽 Label1 中顯示的內(nèi)容是( )A.1 3 B.3 1 C.找到第 1 個(gè) D.找到第 2 個(gè)答案 C 6.(2018稽陽(yáng)聯(lián)誼學(xué)校聯(lián)考,12,2分)有如下程序段:Dim a(1 To 10) As IntegerDim i As Integer, j As Integer, m As IntegerDim key As Integeri = 1: j = 10: key = Val(Text1.Text)Do While i <= jm = (i + j) \ 2If key < a(m) Then j = m - 1ElseIf key > a(m) Then i = m + 1Else Do While m > 1 If a(m - 1) = key Then m = m - 1 Else Exit Do End If Loop Exit DoEnd IfLoop數(shù)組中a(1)到a(10)依次為“1,1,2,3,3,3,3,4,4,4”,若在文本框Text1中輸入3,經(jīng)上述程序段執(zhí)行后,變量m的值為( )A.7 B.6 C.5 D.4答案 D 7.(2020屆浙江十校聯(lián)盟聯(lián)考)某對(duì)分查找算法的部分VB程序如下:i = 1 : j = 12 : k = 0 : s =""key = Val(Text1.Text) : c ="N": flag = FalseDo While i <= j And flag = False m=(i + j +1) \ 2:k = k + 1 If key = a(m) Then c ="Y" : flag = True If key > a(m) Then j = m - 1 Else i = m + 1 s = s & Str(a(m))LoopText2.Text = s : Text3.Text = c數(shù)組 a(1)到a(12)的值依次為“99,91,85,76,68,61,53,42,34,27,20,13”,執(zhí)行該程序段后,下列說(shuō)法正確的是( )A.該程序段只能進(jìn)行兩位正整數(shù)的查找B.在文本框Text1中輸入兩位任意正整數(shù),則k的值介于1和3之間C.在文本框Text1中輸入76,程序執(zhí)行后變量i和j的值分別為1和6D.若文本框Text2中顯示了兩個(gè)正整數(shù),則文本框Text3中顯示的內(nèi)容一定是Y答案 D 8.(2019浙江十校聯(lián)盟適應(yīng)性考試)某對(duì)分查找算法的程序如下:Dim d(1 To 63) As IntegerFor i=1 To 63 d(i)=iNext is=0:i=1:j=63Key=Int(Rnd*63)+1Do While i<=j m=(i+j)\2 If Key=d(m) Then Exit Do If Key j=m-1:s=2*s Else i=m+1:s=2*s+1 End IfLoopLabel1.Caption=Str(s)若運(yùn)行該程序段后,標(biāo)簽Label1中顯示的結(jié)果是28,則查找的Key值是( )A.28 B.29 C.57 D.58答案 C 9.(2019浙江名校新高考研究聯(lián)盟(Z20聯(lián)盟)聯(lián)考)對(duì)于一組升序不重復(fù)的正整數(shù),在任意數(shù)字位置分成兩段,并交換前后兩段的位置,存入數(shù)組a。例如6、17、25、36、44、58,在數(shù)字6處分成兩段,交換位置后為:a(1) a(2) a(3) a(4) a(5) a(6)6 17 25 36 44 58在數(shù)字 44 處分成兩段, 交換位置后為:a(1) a(2) a(3) a(4) a(5) a(6)44 58 6 17 25 36依據(jù)對(duì)分查找思想,設(shè)計(jì)一個(gè)在數(shù)組a中查找最小值,并輸出在Text1中的程序,實(shí)現(xiàn)該功能的VB程序如下,但加框處代碼有錯(cuò),請(qǐng)改正。Private Sub Command1_Click()Const n = 6Dim a(1 To n) As IntegerDim i As Integer, j As Integer, m As Integer’讀取數(shù)據(jù), 按上述規(guī)則存入數(shù)組 a 中, 代碼略i = 1: j = nIf a(i) > a(j) Then Text1.Text = Str(a(i)) ’(1) Do While i <= j m = (i + j) \ 2 If a(m) < a(j) Then j = m - 1 ’(2) Else i = m + 1 End IfLoopText1.Text = a(j)End Sub答案 (1)a(i)10.(2019浙江普通高中學(xué)考選考模擬)數(shù)組a中存儲(chǔ)的是一組正整數(shù),特征是:以三個(gè)數(shù)為一組,每組中任意一個(gè)數(shù)都比前面一組中的任意一個(gè)數(shù)要大;②每組中三個(gè)數(shù)依次遞減;③數(shù)組中數(shù)的總個(gè)數(shù)為3的倍數(shù)。依據(jù)對(duì)分查找思想,設(shè)計(jì)一個(gè)在數(shù)組a中查找數(shù)據(jù)key的程序。實(shí)現(xiàn)該功能的VB程序如下,但加框處代碼有錯(cuò),請(qǐng)改正。8 5 3 17 15 10 32 23 18 53 43 37 82 72 63 ……Private Sub Command1_Click() Const n = 15 Dim a(1 To n) As Integer, search As Integer, key As Integer Dim i As Integer, j As Integer, m As Integer ’讀取一組正整數(shù),按上述規(guī)則存入數(shù)組a中,代碼略 key = Val(Text1.Text) i = 1: j = n: search = 0 Do While i <= j m = (i + j) \ 2 If m Mod 3 <> 0 Then m=m -2 ’(1) 把m調(diào)整到三個(gè)數(shù)一組的最后一個(gè)數(shù)的位置 If key = a(m) Then search = m : Exit Do ElseIf key < a(m) Then j = m - 3 ElseIf key <= a(m - 2) Then ’(2) i = m + 1 ElseIf key = a(m - 2) Then search = m - 2 : Exit Do ElseIf key = a(m - 1) Then search = m - 1 : Exit Do Else search = 0 : Exit Do End If Loop If search <> 0 Then Text2.Text = Str(search) Else Text2.Text = "找不到" End IfEnd Sub答案 (1)m + 3 - m Mod 3 (2)key > a(m - 2)考點(diǎn)五 遞歸算法及程序?qū)崿F(xiàn)1.某VB程序使用了遞歸函數(shù),代碼如下:Private Sub Command1_Click() Text1.Text = f(3)End SubFunction f(x As Integer) As String If x = 1 Then f = 1 Else f = f(x-1) + 2End Function運(yùn)行程序并點(diǎn)擊按鈕Command1后,文本框Text1中顯示的內(nèi)容是( ) A.1 B.3 C.5 D.7答案 C 2.執(zhí)行以下代碼,單擊命令按鈕Command1后,顯示在窗體第二行的內(nèi)容是 ( )Private Sub Command1_Click()Dim n As Integer,m As Integern=2:m=0Do While m < 3 n=n+2 If fun(n) Then Print n m=m+1 End IfLoopEnd SubFunction fun(x As Integer) As Booleanfun=falseIf x/2=Int(x/2) Then fun=fun(x/2)Else If x=1 Then fun=TrueEnd IfEnd FunctionA.4 B.6 C.8 D.16答案 C 3.(2018溫州六校期末聯(lián)考)小明設(shè)計(jì)了如下一個(gè)查找數(shù)據(jù)的程序: 在一組升序的數(shù)列當(dāng)中, 查找不小于 k 的最小數(shù)的位置, 如果該值存在, 則返回其第一次出現(xiàn)的位置, 如果不存在則返回 0。程序界面如下:(1)若在 Text1 中輸入“8”,Text2、Text3 輸出的分別為 。?(2)請(qǐng)?jiān)趧澗€處填入合適的代碼。Dim a(1 To 10) As IntegerFunction find(L As Integer, R As Integer, key As Integer)As IntegerIf L > R Then find = 0: Exit FunctionElseIf a(L) >= key Then find = L: Exit FunctionElse ① ? If a(m) < key Then find = find(M + 1, R, key) ElseIf ?、凇hen? find = find(L, M - 1, key) Else find = M End IfEnd IfEnd FunctionPrivate Sub Command1_Click()Dim k As IntegerDim p As Integerk = Val(Text1.Text)?、邸?Text2.Text = a(p)Text3.Text = Str(p)If p = 0 Then Text2.Text = "無(wú)"End IfEnd SubPrivate Sub Form_Load()a(1)=3 : a(2)=3 : a(3)=3 : a(4)=4 : a(5)=7 : a(6)=7 : a(7)=10 : a(8)=13 : a(9)=19 : a(10)=21For i = 1 To 10 List1.AddItem Str(a(i))Next iEnd Sub答案 (1)10,7 (2)①m = (L+ R) \ 2或 m = (L+ R+ 1) \ 2或其他等價(jià)答案 ②a(m - 1) >= key③p = find(1, 10, k)考點(diǎn)六 算法在數(shù)據(jù)管理中的應(yīng)用1.(2020屆浙江名校新高考研究聯(lián)盟(Z20聯(lián)盟)聯(lián)考)有如下 VB 程序段:Dim conn As New ADODB.ConnectionDim rs As New ADODB.Recordsetconn.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;data source ="+ App.Path+"\score.accdb"conn.OpenSet rs.ActiveConnection = connrs.Open "Select * from cj"n=1Do While Not rs.EOF Score(n)=rs.fields("成績(jī)"):Name(n)= rs.fields("姓名") n=n+1:rs.MoveNextLoop下列說(shuō)法中不正確的是( )A.定義的 ADO 的 Connection 對(duì)象實(shí)例名稱是“conn”B.連接的數(shù)據(jù)庫(kù)文件名是“\score.accdb”C.查詢的數(shù)據(jù)表名是“cj”D.該程序段運(yùn)行后, 可知所查詢的數(shù)據(jù)表共有 n-1 條記錄答案 B 2.小王為學(xué)校教務(wù)處編寫(xiě)了一個(gè)排考場(chǎng)座位的VB程序??紙?chǎng)采用“6排5列”共30人的模式。程序執(zhí)行后,考生的考號(hào)與姓名顯示在列表框List1中,單擊“考場(chǎng)座位”按鈕Command1,考場(chǎng)號(hào)與座位顯示在Text1中,程序運(yùn)行界面如圖a所示,考生數(shù)據(jù)存放在數(shù)據(jù)庫(kù)文件“kaochang.accdb”中,數(shù)據(jù)表如圖b所示。 實(shí)現(xiàn)上述功能的VB程序如下,請(qǐng)回答下列問(wèn)題:(1)當(dāng)“Form_Load()”事件處理過(guò)程運(yùn)行結(jié)束時(shí),變量x的值為 。 ?(2)請(qǐng)?jiān)跈M線處填入合適的代碼。Private Sub Command1_Click()Dim y As IntegerDim start As Integer ’考場(chǎng)第1位數(shù)據(jù)元素的下標(biāo)Dim pa As Integer ’數(shù)據(jù)庫(kù)導(dǎo)入VB時(shí)學(xué)生數(shù)據(jù)下標(biāo)Dim pb As Integer ’考場(chǎng)座位數(shù)據(jù)下標(biāo)Dim i As Integer,j As Integer,k As Integer,m As Integerstart=1pa=startrecCount=x-1If recCount Mod 30 <> 0 Then ?、佟 ? For i=1 To y ’將當(dāng)前考生人數(shù)添加到30的整數(shù)倍 recCount=recCount+1 sName(recCount)="" Next iEnd IfFor j=1 To recCount / 30 pa=start pb=start For i=1 To 30 kcsName(pb)=sName(pa) pb=pb+1 If i Mod 5=0 Then pa=start+i \ 5 Else ?、凇 ? End If Next i start=start+30Next jText1.Text="" 展開(kāi)更多...... 收起↑ 資源列表 專題六 算法的程序?qū)崿F(xiàn)(講解部分).pptx 專題六 算法的程序?qū)崿F(xiàn).docx 縮略圖、資源來(lái)源于二一教育資源庫(kù)