和持平段(a(i)=a(i-1))。数组a中的n个元素可构成n-1个依次排列的变化段。
●波峰:从上升段转到下降段形成一个波峰。波峰的起点是峰顶前所有连续上升段中的第1个,终点是
峰顶后所有连续下降段中的最后1个。
●对称波峰:上升段与下降段个数相同的波峰称为对称波峰。
下图为一组数据的变化段及波峰示意图。
现要求统计数组a各元素依次变化过程中“对称波峰”的个数。小李依据上述描述设计如下VB程序。请回答下列问题:
(1)数组元素“1,4,3,3,2,6,8,7,9,3,4,7,9,6,3,1”依次变化过程中“对称波峰”的个数为。(2)请在划线处填入合适的代码。
Const n = 20
Dim a(1To n) As Integer
Private Sub Form_Load()
'读取数据,并存储到数组a中,代码略
End Sub
Private Sub Command1_Click()
Dim flag As Integer '存储变化段的状态:1表示升,-1表示降,0表示平
Dim count As Integer '存储对称波峰段的个数
Dim steps As Integer
Dim i As Integer
flag = 0: steps = 0: count = 0
For i = ①To n
If a(i) > a(i - 1) Then
If IsSymPeak(flag, steps) Then count = count + 1
If flag = 0Or flag = -1Then
②
Else
steps = steps + 1
End If
flag = 1
ElseIf a(i) = a(i - 1) Then
If IsSymPeak(flag, steps) Then count = count + 1
steps = 0
flag = 0
Else
steps = steps - 1
flag = -1
End If
Next i
If IsSymPeak(flag, steps) Then count = count + 1
Text1.Text = Str(count)
End Sub
Function IsSymPeak(flag As Integer, steps As Integer) As Boolean
If③Then
IsSymPeak = True
Else
IsSymPeak = False
End If
End Function
【答案】(1)3(2)①2②steps=1③flag=-1And steps=0或其他等价表达式【解析】本题考查算法及其程序实现。
(1)根据题意可知,数组元素“1,4,3,3,2,6,8,7,9,3,4,7,9,6,3,1”中共有3个“对称波峰”。
(2)①根据"Ifa(i)>a(i-1)”知,变量为数组元素在数组a中存放的位置,为了比较所有的数组元素,的值应该从2开始,故答案是2。②分析代码可知,代码中上升段steps值加1,下降段steps值减1。如果是对称波峰,到达对称波峰的终点时steps的值必定为0。如果当前段属于上升段,而前面为下降段或持平段,则当前位置刚好处于拐点,即steps = 1,表示拐点后变量steps重新从1开始计数,故答案是steps=1。③自定义函数IsSymPeak()的主要作用是判断是否属于“对称波峰”,当前面处于下降段且变量steps的值为0时,则说明前面刚好是一个对称波峰,因此函数IsSymPeak的返回值为True,否则为False,故答案是flag=-1 AndsteDs=0。
4.(2017年11月)由数组a生成数组b的方法描述如下:
(1)将数组a中的n个元素依次分割出若干个数据块,每个数据块有m×m个元素,m最大值为8,最小值为2。分割时,按尽可能大的数据块进行分割;
(2)对每个分割出的数据块用“方阵转换法”进行转换,每次转换后得到的数据块依次存储在数据b中;(3)数组a分割后的剩余元素(个数小于4),直接依序存储到数组b中。
例如n=140时,可依次分割出3个数据块,元素的个数分别为64(8×8)、64(8×8)、9(3×3),剩余元素为3个。
“方阵转换法”过程如下:将数据块中m×m个元素按行序排列成一个数字方阵,从该数字方阵中按列序得到转换后元素的次序。以3×3数据块为例,转换过程如下图所示:
小明依据上述描述设计了如下VB程序。请回答下列问题:
(1)当n=120时,分割出的第3个数据块元素个数为。
(2)请在划线处填入合适的代码。
Const n = 120
Dim a(1To n) As Integer
Dim b(1To n) As Integer
Private Sub Command1_Click()
Dim m As Integer, i As Integer
Dim Start As Integer '当前未分割数据的第1个元素下标
Dim Left As Integer '当前未分割数据的个数
Dim pa As Integer '数组a的下标
Dim pb As Integer '数组b的下标
'读取n个转换前的数据,依次存储到a(1)、a(2)、……a(n)中,代码略m = 8
Start = 1
Left = n
Do While Left > 3
If Left < m * m Then
m = ①
Else
pa = Start
pb = Start
For i = 1To m * m
b(pb) = a(pa)
pb = pb + 1
If i Mod m = 0Then
②
Else
pa = pa + m
End If
Next i
③
Start = Start + m * m
End If
Loop
For i = Start To n
b(i) = a(i)
Next i
'依次输出转换后数据b(1)、b(2)、……b(n)中,代码略
End Sub
【答案】(1)4(2)①m-1②pa = Start+i\m③Left=Left—m* m
【解析】本题考查“方阵转换法”算法及其程序实现。
(1)当n=120时,可依次分割出3个数据块,元素的个数分别为64(8 * 8)、49(7 * 7)、4(2 * 2),剩余3个元素。所以第3个数据块为4个元素。
(2)①根据题意可知,如果left无法分割出m*m的数据块,则应该尝试(m-1)* (m-1)的数据块,所以此处应减小m的值,故答案是m-1。
②要在b数组逐个放人a数组中的值,此处必然要确定a数组的下标pa的值。经过分析,在m*m方阵的行列转换过程中,每行的第一项(i Mod m= 0)数组下标为Pa= Start+i\m,则后面的数的下标依次为Pa=Pa+ m。
③一个数据块处理完后,Left的值减少,其值为Left=Left-m*m。
5.(2017年4月)小王编写了一个依据成绩计算名次的VB程序,成绩为0到100之间的整数。算法的基本思想:先统计每个分数的个数,然后按照分数从高到低依次计算每个有效分数(该分数的个数不为0)对应的名次,分数相同时名次并列。最高分为第1名,该分数的名次与个数之和为下一个有效分数的名次,以此类推。程序用数组A存放每个分数对应的个数,数组B存放每个分数对应的名次。例如,下表中最高分100有2个,并列第1名,则分数96的名次为分数100的名次加上分数100的个数,即第3名。
程序运行时,学生数据显示在列表框List1中,单击“计算”按钮Command1,计算结果显示在列表框List2中,程序运行界面如图所示。
实现上述功能的VB程序如下,请回答下列问题:
(1)如表所示,若分数93的个数为2,则该分数对应的名次为__________________________。(2)请在划线处填入合适的代码。
Dim sName(1To50) As String' 存放学生姓名
Dim sScore(1To50) As Integer' 存放学生分数
Dim recCount As Integer' 存放学生人数
Private Sub Form_Load()
'本过程从数据库中读取学生数据,存储在相应的变量中,并在List1中显示
'代码略
End Sub
' 整数转换成长度固定的字符串
Function ads(x As Integer, n As Integer) As String
Dim sx As String, nx As Integer, i As Integer
sx = Str(x): nx = Len(sx)
For i = 1To n - nx
sx = " " + sx
Next i
①
End Function
Private Sub Command1_Click()
Dim A(0To100) As Integer '存放每个分数的个数
Dim B(0To100) As Integer '存放每个分数的名次
Dim mc As Integer, score As Integer, i As Integer
For i = 0To100
A(i) = 0
Next i
For i = 1To recCount '计算每个分数的个数
Next i
mc = 1
For i = 100To0Step -1 '计算每个分数的名次
If A(i) <> 0Then
B(i) = mc
End If
Next i
List2.Clear
List2.AddItem " 姓名分数名次 "
List2.AddItem " ---------------- "
For i = 1To recCount
score = sScore(i)
mc = B(sScore(i))
List2.AddItem sName(i) + ads(score, 5) + "第" + ads(mc, 3) + "名"
Next i
End Sub
【答案】(1)7(2)①ads=sx②A(sScore(i)) = A(sScore(i)) + 1
③mc==mc+A(i) (或mc=B(i) + A(i))
【解析】本题考查算法及其程序实现。
(1)93分的名次是前一位94分的个数和名次之和3 + 4 = 7,因此是第7名。
(2)①函数语句中必须有一个形如“函数名=表达式”的语句,才能将表达式的计算结果作为函数的返回值传回函数调用处,因此答案是ads = sx。
②A 数组存放每个分数的个数,其下标sScore (i )就是分数,因为之前每个分数的个数都初始化为0个,故针对每个人的分数,若有多个人同分则统计同分的人数,不同分则统计为1次,该分数不存在则仍为0个,即初始值,所以答案是A (sScore (i ))=A (sScore (i )) +1。
③B 数组存放的是每个分数的名次,当前分数的名次为mc ,下一个分数的名次为当前分数对应的当前名次加上当则分数的人数个数。故答案为mc = A (i ) + B (i )或 mc =mc +A (i )。
6.(2016年10月)小李与小王合作编写一个成绩统计的VB 程序:小王编写一个过程,该过程从数据库读取某一指定科目的相关数据,存储在数组a 中;小李编写一个过程,该过程依据数组a 中的相关数据统计各班平均分。小李与小王约定的数组a 各元素含义如图所示。
程序功能如下:在文本框text1中输入科目名称,单击“读取数据库”按钮command1,程序从数据库读取数据;单击“开始统计”按钮command2,程序进行统计处理,结果输出在列表框list1中。程序运行界面如下图所示。
数组元素 数组元素的含义 a (1) 存储班级数n
a (2) 从a (2)到a (n +1) 依次存储第1、2、…第n 个班级人数
… a (n +1) a (n +2) 从a (n +2) 依次存储第1班每个学生的单科成绩、第2班每个学生的单科成绩、…第n 班每个学生的单科成绩
… …
实现上述功能的VB 程序如下,请回答下列问题:
(1)根据程序运行界面中的数据及数组a 各元素的含义,数组元素a (5)的值为 (填写数值)。
(2)分析程序,可知数据库的文件名为
(3)请在划线处填入合适的代码。
Dim a(1to600) as integer‘数组大小满足处理要求
Private sub command1_click()
‘本过程由小王完成,从数据库读取指定科目的各相关数据,存储在数组a中
Dim conn As New ADODB.Conncction
Dim rs As New ADODB.Recordset
Conn ConncctionString=”provider=Microsoft.ACE.OLEDB.12.0;data source=”+”Score.accdb”
Conn.Open
Set rs.ActiveConnection=conn
‘本过程的其他语句略
End sub
Private sub command2_click()
‘依据数组a中的相关数据统计各班级平均分
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 = 1To n
sum = 0
For j = 1To a(i + 1)
p = p + 1
Next j
aver = sum / a(i + 1)
list1.additemstr(i)+" "+str(a(i+1))+" "+str(aver)
Next i
End sub
【答案】(1)33(2)Score.accdb(3)①n=a(1) ②sum =sum+ a(p)(或其他等价代码)
【解析】本题考查创建ADO对象,建立数据库连接和用VB访问数据库中的数据,用二重循环对数据库中取出存放在数组中的元素进行运算的思路和方法。
(1)a(1)存放班级数n,a(2)到a(n+1)依次存放每班人数,则a(2)放1班人数,a(3)放2班人数,a(4)放3班人数,a(5)放4班人数,所以a(5)=33。
(2)“Dimconn As New ADODB. Connection”为定义ADO的Connection对象实例conn,“Dim rs As New ADODB. Recordset”为定义ADO的Recordset对象实例rs,conn. ConnectionString= "provider =Microsoft. ACE. OLEDB.12.0; data source= " +"Score. accdb"”中的Score. accdb即是连接的数据库文件。
(3)①首先要获取班级的个数,班级个数存放在a(1)中,n为存放班级个数的变量,所以n赋值为a(1),即n=a(1)。②第一重循环“Fori=1Ton”,即从第一个班循环到最后一个班级,当循环到第一个班级时,i=1,Forj=1 Toa(2),而a(2)存放的为1班的人数,即可将1班的学生单科成绩不断循环的加到sum变量中,而单科成绩是从数组a(n+2)开始的,n+2赋值给p,所以sum应该不断的加上a(p)赋值给sum,同时p不断地增加1,从而获得这”个班学生的单科总成绩;当循环到第二个班级时,i= 2,For j=1To a(3),sum清零后加第二个班的成绩,加的成绩是从上一个班结束时的p值加1开始,以此循环直到求出所有班级为止。
7.(2016年4月)某数据压缩方法描述如下:
1)原始数据中,某数不为0且相邻无重复,压缩数据用该数据表示;
2)原始数据中,某数为0且相邻无重复,压缩数据用两个数表示,第1个位0,第2个为0;
3)原始数据中,某数据相邻有重复,压缩数据用3个数表示:第1个位0,第2个为重复数的个数,第3个为该数本身;
根据上述压缩方法,对应的解压缩方法示例如图a所示。
图a
小明编写了一个解压送VB程序,功能如下:窗体加载时,自动读取压缩数据,依次存储在数组元素a(1)、a(2)、a(3)……中,压缩数据的个数存储在变量n中,压缩数据显示咋文本框Text1中。单击“解压缩”按钮Command1,程序对压缩数据依次进行解压缩处理,解压缩数据显示在文本框Text2中。程序运行界面如
图b所示。
图b
(1)如果压缩数据为“23,0,21,66,0,0,77,0,5,0”,则解压缩数据的个数是。(2)实现上述功能的VB程序如下。请在划线处填入合适代码。
Dim a(1To100) As Integer '存储压缩数据,最大处理个数为100
Dim b(1To1000) As Integer '存储解压缩数据,最大处理个数为1000
Dim n As Integer '存储压缩数据的个数
Private Sub Form_Load()
'压缩数据由上述压缩方法生成
'本过程用于读取压缩数据并存储在数组a,压缩数据个数存储在变量n中
'代码略
End Sub
Private Sub Command1_Click()
Dim pa As Integer '存储压缩数组当前处理位置
Dim pb As Integer '存储解压缩数组当前处理位置
Dim firstdata As Integer, count As Integer, i As Integer
pa = 1: pb = 1
Do While pa <= n
firstdata = a(pa)
If firstdata <> 0Then '示例1情况处理
b(pb) = firstdata
pa = pa + 1: pb = pb + 1
Else
count = a(pa + 1)
If count = 0Then'示例2情况处理
b(pb) = 0
pa = : pb = pb + 1
Else'示例3情况处理
For i = 1To count
Next i
pa = pa + 3: pb = pb + count
End If
End If
Loop
Text2.Text = Str(b(1))
For i = 2To
Text2.Text = Text2.Text + "," + Str(b(i))
Next i
End Sub
【答案】(1) 29(2)①pa+2②b(pb+i-1)=a(pa+2) ③pb-1
【解析】(1)如表所示。
(2)①压缩数组a中对应的是00这种情况下的数据处理。因此,当数据处理完毕后,变量pa应移动到数组a中下一个待处理的数据位置上pa=pa+2,此时pa将指向下一个待处理的数据。②压缩数组a对应的是07 78这种情况下的数据处理。此时要做的是操作是要将数组b中存储count个解压后的数据,解压后的数据值是来自数组a中的元素值,即是pa后移动2个位置指向的元素值a(pa+2),这count个元素将依次填入到数组元素b中(存放位置是pa下标开始,一直到pb+ count一1,共计n个位置)。③将数组b中的所有元素全
部输出,数组b中下标pb指向的是待存放元素的位置,因此在数组b中实际情况存储的元素个数自然数是pb-1个元素。
8.(2015年10月)某数据加密方法描述如下:
(1)以字节为单位进行加密处理;
(2)将1个字节的8位二进制数分割成前4位与后4位两个二进制数;
(3)分别将上述两个4位二进制数转换为十进制数;
(4)将每个十进制数转换为1个加密字符,对应的“密码表”如下:
值(十进制) 0123456789101112131415
加密字符I l i k e C H N P0s t c a r d
小明按照上述方法,设计了一个字符串(仅包含ASCII字符)加密的VB程序,功能如下:单击“加密”按钮Command1,程序依次将文本框Text1中每个字符的ASCII码值作为1个字节转换为两个加密字符,连接这些加密字符,最后在文本框Text2中输出加密结果。下表显示了字符串中一个字符的加密过程:
程序运行效果如下图所示。
实现上述功能的VB程序如下:
(1)请在划线处填入合适代码。
Private Sub Command1_Click()
Dim n As Integer, s As String, i As Integer, ss As String
Dim a As Integer '存储加密前字符的ASCII码
Dim b1As Integer, b2As Integer '分别存储分割、转换后的两个十进制数
s = Text1.Text
①
For i = 1To n
a = Asc(Mid(s, i, 1))
b1 = a \ 16
b2 = a Mod16
ss = ss + Code2Char(b1) + Code2Char(b2)
Text2.Text = ss
Next i
End Sub
'十进制值转换为加密字符的函数
Function Code2Char(c As Integer) As String
Dim s As String
s = "IlikeCHNpostcard"
Code2Char = ②
End Function
(2)若将“密码表”中值为“0”对应的加密字符“I”改成“i”,加密后的密文可能无法解密,原因是。
【答案】(1)n = Len(s) Mid(s,c+1,1) (2)加密字符i对应两个值0,2
【解析】本题考查过程和自定义函数,常用标准函数等。
(1)根据题意,对文本框Text1中输人的字符串逐个字符加密,需算出字符串的长度n,作为循环变量的终值,即n=Len(s)。加密后的字符串(密文)存储于字符串变量ss中。②自定义函数Code2Char()中,根据密码表对应的每个十进制数转换为1个加密字符,第一个加密字符对应十进制值为0,故当十进制数值为6时,对应的字符H是第6+1个字符位置,即当十进制数值为c时,对应的字符是第c+1个字符位置,用取子串函数Mid(s,c+1,1)。
(2)若密码表中值为0对应的加密字符I改为i,造成同时对应加密字符i,当解密时,加密字符i对应的十进制有两个值0和2,不唯一而出错,从而无法解密。