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