vb中mschart利用数组作图_选考VB算法解析之2019年4月高考真题卷第17题
在對數(shù)組排序時(shí),我們常把數(shù)組分成已排序區(qū)域和待排序區(qū)域,并使用左右邊界來劃分待排序區(qū)域的范圍;對分查找時(shí)我們也引入了左右邊界的概念。可見左右邊界在數(shù)組中是一個(gè)非常重要的概念,它在分段處理數(shù)組時(shí)可以幫助我們清晰地描述某個(gè)區(qū)間的數(shù)組元素,從而正確理解相關(guān)處理過程。
2019年4月信息技術(shù)選考真題卷第17題
一題目17.【加試題】給定m個(gè)區(qū)間和1個(gè)數(shù)組(有n個(gè)元素),現(xiàn)要求根據(jù)各區(qū)間限定的取值范圍,將數(shù)組依次分隔成m+1個(gè)段。具體分割方法如下:
第1段是從數(shù)組首個(gè)元素開始、元素值都屬于第1區(qū)間的最長連續(xù)元素段。如果首個(gè)元素不屬于第1區(qū)間,則第1段元素個(gè)數(shù)為0;
第1段分割后的剩余元素,用同樣的方法來依次分割第2段、第3段、…、第m段;
第m段分割后的剩余元素分割到第m+1段(剩余段)。
若第p(1≤p≤m-1)段末尾連續(xù)元素的值也同時(shí)屬于第p+1區(qū)間,則這塊連續(xù)元素稱為第p段“重疊塊”,該段其余部分稱為第p段“非重疊塊”。由于不存在第m+1區(qū)間,這里特別規(guī)定:第m段的全部元素都分割到m段“非重疊塊”,第m段“重疊塊”的元素個(gè)數(shù)為0,一個(gè)數(shù)組分段示例如下圖。圖中數(shù)組第1個(gè)元素10不屬于第1區(qū)間[0,5],因此第1段的元素個(gè)數(shù)為0。10和20屬于第2區(qū)間,而33不屬于第2區(qū)間,因此第2段只包含10和20兩個(gè)元素。第3段末尾連續(xù)3個(gè)元素的值也同時(shí)屬于第4區(qū)間,因此,第3段“非重疊塊”包含33,58,46,第3段“重疊塊”包含55,62,69。
(1)給定2個(gè)區(qū)間依次為[10,50]、[30,80],數(shù)組各元素為“12,44,34,45,66,50,45,70”,則第1段“重疊塊”中的元素個(gè)數(shù)為? ???個(gè)。
(2)小李根據(jù)上述描述,設(shè)計(jì)了一個(gè)統(tǒng)計(jì)各段“非重疊塊”、“重疊塊”和剩余段中元素個(gè)數(shù)的算法。算法的VB程序如下,請?jiān)趧澗€處填入合適的代碼。
Const n = 18, m = 6
Dim a(1 To n) As Integer
Dim b(1 To 2 * m) As Integer
'b(1)、b(2)為第1區(qū)間的下限和上限, b(3)、b(4)為第2區(qū)間的下限和上限,…
Dim c(1 To 2 * m + 1) As Integer
'數(shù)組c用于保存統(tǒng)計(jì)結(jié)果:
'c(1)、c(2)分別存儲第1段“非重疊塊”和“重疊塊”的元素個(gè)數(shù),
'c(3)、c(4)分別存儲第2段“非重疊塊”和“重疊塊”的元素個(gè)數(shù),…
'c(2m-1)存儲第m段"非重疊塊"元素個(gè)數(shù),c(2m)存儲第m段"重疊塊"元素個(gè)數(shù)(值為0)
'c(2m+1)存儲剩余段元素個(gè)數(shù)
Private Sub Command1_Click()
Dim i As Integer, p As Integer, L As Integer, LL As Integer
'讀取n個(gè)數(shù)據(jù)并保存在數(shù)組a中,代碼略
'讀取m個(gè)區(qū)間的下限和上限并保存在數(shù)組b中,代碼略
For i = 1 To 2 * m + 1
?? c(i) = 0
Next i
i = 1: p = 1
L = 0: LL = 0
Do While ?????①????
?If IsIn(i, p) Then
??? If IsIn(i, p + 1) Then
?????? LL = LL + 1
??? Else
?? ??②?????
?????? LL = 0
??? End If
??? i = i + 1
?Else
?? c(2 * p - 1) = L
?? c(2 * p) = LL
?? L = 0: LL = 0
?? p = p + 1
?End If
Loop
If i <= n Then
?? c(2 * p - 1) = n - i + 1
Else
? c(2 * p - 1) = L
? c(2 * p) = LL
End If
'輸出統(tǒng)計(jì)結(jié)果,代碼略
End Sub
'函數(shù)IsIn用來判斷a(i)值是否屬于第p區(qū)間
Function IsIn(i As Integer, p As Integer) As Boolean
? If p > m Then
??? IsIn = False
? Else
???? If ? ?③????Then IsIn = True Else IsIn = False
? End If
End Function
二考查知識點(diǎn)數(shù)組分段處理、子序列左右邊界的概念、自定義函數(shù)功能分析。要求學(xué)生熟練掌握數(shù)組的基本操作,能根據(jù)題意分析各個(gè)變量的含義,能用左右邊界的概念來劃分子序列的范圍,并熟悉自定義函數(shù)的語法。三解析此題背景信息繁復(fù),數(shù)據(jù)結(jié)構(gòu)復(fù)雜,涉及變量較多,很考驗(yàn)學(xué)生的閱讀理解能力。但算法說明清晰,示例數(shù)據(jù)也很恰當(dāng),如果有足夠時(shí)間,應(yīng)該不難理解題意,尤其是第3空,根據(jù)題目說明和注釋信息,不難填出此空。我們先采用在代碼中添加注釋的方法解析算法如下:題目中的代碼分別用變量L和LL來表示第p段元素中“非重疊塊”和“重疊塊”的元素個(gè)數(shù),只使用一重循環(huán),通過遍歷數(shù)組a,判斷a(i)是否屬于第p段元素,利用一個(gè)嵌套If語句,分別計(jì)算出L和LL的值。其中LL遞增和清零的表達(dá)式容易理解,但L的計(jì)算式有一定難度,容易錯(cuò)填為L = L + 1,若是這樣,則L的含義變成了統(tǒng)計(jì)第p段中屬于區(qū)間p但不屬于區(qū)間p+1的元素?cái)?shù)量。
因?yàn)椤爸丿B塊”的特征是第p段末尾的連續(xù)元素,故一旦出現(xiàn)不屬于區(qū)間p+1的元素,則LL必須歸零,同時(shí)把前面累積的LL值累加到L上,即L = L + LL + 1。
我們可以從另一個(gè)角度來理解題意:因?yàn)榈趐段元素的總數(shù)量是“非重疊塊”和“重疊塊”的元素個(gè)數(shù)之和,如果我們能夠把第p段元素的長度(即元素總量)求出來,再減去LL,就得到了“非重疊塊”的元素個(gè)數(shù)。
此外,我們還可以把處理第p段元素的過程放在一個(gè)內(nèi)層do循環(huán)中,這樣便于理解LL的計(jì)算過程,而且代碼更簡潔。
為了充分利用題目的原有代碼,我們只修改了核心代碼,且未定義新的變量,但是變量L不再表示“非重疊塊”的長度,而是指向第p段元素的左邊界,然后使用變量i來遍歷數(shù)組a,使得在內(nèi)層do循環(huán)結(jié)束后(i-1)剛好指向第p段元素的右邊界,這樣第p段元素的長度恰好為i-L,若用LL表示“重疊塊”的長度,則“非重疊塊”的長度為i-L-LL。
相關(guān)代碼如下:
四答案(1) 3
(2) ① i<=n And p<=m? 或其他等價(jià)表達(dá)式
② L=L+LL+1或其他等價(jià)語句
③a(i)>=b(2*p-1) And a(i)<=b(2*p) 或其他等價(jià)表達(dá)式五拓展思考? ?本題給出的“重疊塊”概念很有趣,在很多地方都有應(yīng)用,“字符串消消樂”游戲就是一例。
??? “字符串消消樂”游戲說明:從Text1框輸入一個(gè)字符串,程序會把相鄰的相同字符消除,所有相鄰的相同字符被消除后剩余字符會重新拼接成新的字符串,再按照相同的規(guī)則消除字符,直到所有相鄰的字符都不相同或變成空串為止,輸出最后獲得的字符串。
??? 例如,輸入字符串"aabcdddcd",點(diǎn)擊“運(yùn)行”按鈕后輸出字符串"bd";輸入字符串"aabdcdddcdb",點(diǎn)擊“運(yùn)行”按鈕后輸出空字符串;輸入字符串"aabccbbbca",點(diǎn)擊“運(yùn)行”按鈕后輸出字符串"bca"。
??? 算法的VB程序如下,請?jiān)趧澗€處填入合適的代碼。
參考代碼1:
Private Sub Command1_Click()
??? Dim s1 As String, s2 As String
??? Dim i As Integer, j As Integer
??? s1 = Text1.Text
??? Do While Len(s1) > 1
??????? s2 = ""
??????? i = ????①????
??????? Do While i <= Len(s1) '消除相鄰的相同字符
??????????? For j = i + 1 To Len(s1)
??????????????? If Mid(s1, i, 1) <> Mid(s1, j, 1) Then ???②??
??????????? Next j
??????????? If j = i + 1 Then s2 = ?????③?? ?????????
??????????? i = ?????④??
??????? Loop
??????? If s2 = s1 Then ??⑤ ??????'沒有發(fā)生消除操作,跳出循環(huán)
??????? s1 = s2 '重復(fù)消除過程,直到無法消除為止
??? Loop
??? Label2.Caption = s1
End Sub
參考代碼2:
Private Sub Command2_Click()
??? Dim s1 As String, s2 As String, ch As String
??? Dim i As Integer, flag As Boolean
??? s1 = Text1.Text
??? flag = True
??? Do While flag And Len(s1) > 1
??????? flag = ????⑥??? ?'默認(rèn)沒有消除字符
????????????? '單獨(dú)處理第一個(gè)字符
??????? If Mid(s1, 1, 1) = Mid(s1, 2, 1) Then s2 = "" Else s2 = Mid(s1, 1, 1)
??????? For i = 2 To Len(s1) '最后一個(gè)字符無需單獨(dú)處理,想想為什么?
??????????? ch = Mid(s1, i, 1)
??????????? If ???????????????⑦????????????????????????? ?Then
??????????????? flag = True '發(fā)生了消除操作
??????????? Else
??????????????? s2 = ????????⑧????????????????
??????????? End If
??????? Next i
??????? s1 = s2 '重復(fù)消除過程,直到無法消除為止
??? Loop
??? Label2.Caption = s1
End Sub
六拓展思考答案① 1??? ② Exit For????
③ s2 + Mid(s1, i, 1)????
④ j??? ⑤ Exit Do
⑥ False????
⑦ ?ch = Mid(s1, i - 1, 1) Or ch = Mid(s1, i + 1, 1)???
⑧ s2 + ch
寫在后面為了保證解析的原創(chuàng)性和思維的獨(dú)特性,我都是獨(dú)立解題后,先不看答案(除非題目不會做),直接把解析寫好,再去看答案。
當(dāng)然,如果發(fā)現(xiàn)參考答案有更好的思路,我還是很樂于學(xué)習(xí)和借鑒的。同時(shí),由于本人水平有限,解析中難免出現(xiàn)疏漏甚至錯(cuò)誤之處,敬請諒解。
無論是贊同還是反對我的看法,都請你給我留言。如果你有新的想法,千萬不要憋在心里,請發(fā)出來大家一起討論。讓我們相互學(xué)習(xí),共同進(jìn)步!
需要本文word版的,可以加入“選考VB算法解析”知識星球參與討論和下載文件,“選考VB算法解析”知識星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。
我們專注選考VB算法,感興趣就一起來!
相關(guān)優(yōu)秀文章:
閱讀代碼和寫更好的代碼
最有效的學(xué)習(xí)方式
選考VB算法解析之2018年11月高考真題卷第16題
選考VB算法解析之2018年11月高考真題卷第17題
選考VB算法解析之2019年4月高考真題卷第16題
總結(jié)
以上是生活随笔為你收集整理的vb中mschart利用数组作图_选考VB算法解析之2019年4月高考真题卷第17题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中callable什么意思_
- 下一篇: 无水印pdf编辑器_偷偷告诉你如何编辑P