.
VB选考填空题
【201509】编写VB程序,实现如下功能:在文本框Text1中输入一个整数,单击按钮Command1,采用对分查找法在数组A(从小到大排序,并显示在标签Label1中)中查找该数。若找到,则从数组A中删除该数(该数后面的数组元素都前移一位),并在标签Label2中显示删除后的结果,运行效果如图所示;否则,在标签Label2中显示“该数没有找到”。
实现上述功能的VB代码如下,但加粗加下划线部分代码有错,请改正。 Dim A(1 to 10) as Integer
Form_Load事件过程产生10个整数,按升序保存在数组A中,并在标签Label1中显示 Private Sub Command1_click( )
Dim I as integer, j as integer, m as integer, k as integer
Dim x as integer, f as boolean ‘变量f用于标记是否在数组中找到x X=val(Text1.text) I=1 : j =10 F=false
Do while (i<=j) and (f=false) M=int((i+j)/2)
If a(m)=x then f=true
If a(m)>x then I =m+1 else j=m-1 Loop
If f=true then For k=m to 9 A(k+1)=a(k) Next
Label2.caption=”” For k=1 to 9
Label2.caption=label2.caption+str(a(k))+”” Next k Else
Label2.caption=”该数没有找到” End if End sub
【201509】用VB编写一个字符串分行程序,功能如下:单击“分行”按钮Command1,将文本框Text1中的英文文本在列表框List1中分行显示(分行时单词不得跨行,每行字符尽可能多但不超过40个),并在标签Label1中输出总行数,运行效果如第17题图所示。分行算法如下:
.
.
(1)将文本框中的字符串保存到变量s中;
(2)当s中字符个数超过40时,循环执行下列①、②、③步,否则跳转到(3): ①如果第41个字符不是英文字母,则分行位置p=40;否则,向左逐个查找,直至找到第一个非英文字母,将其位置作为分行位置p;
②截取s的前p个字符,作为新增行显示在列表框List1中,同时总行数加1;③将s中未分行部分重新赋值给变量s。
(3)将s作为新增行显示在列表框List1中,同时总行数加1。 实现上述功能的VB程序如下,请在划线处填入合适代码。
Private Sub Command1_click( ) Dim s as string, c as string
Dim r as integer, total as integer, p as integer Total = 0
S= _______________ Do While len(s) > 40 R=41
C=mid(s,r,1)
If not((c>=”a” and c<=”z”) or (c>=”A” and c<=”Z”)) then P=40 Else
‘从第41个字符开始向左找到第1个非英文字母,并将其位置值赋给p Do While ((c>=”a” and c<=”z”) or (c>=”A” and c<=”Z”)) r=_________________ c=mid(s,r,1) Loop P=r End if
List1.additem mid(s,1,p) Total=total+1
S=__________________
.
.
Loop
List1.additem s Total= total +1
Label1.caption= “共” + str(total) + “行” End Sub
【201510】n个数据的冒泡排序需要经过n-1遍加工,每一遍加工自下而上比较相邻两个数据,把较小者交换到上面。小发现:当某一遍加工过程中没有数据交换,说明数据已经有序,无需进一步加工。为此,小对算法进行优化,编写了一个VB程序,功能如下:运行程序时,在列表框List1中显示排序前数据,单击“排序”按钮Commaiid1,在列表框List2 中显示这些数据按升序排序后的结果,在标签Label3中显示排序过程的加工遍数。运行效果如图所示。
实现上述功能的VB代码如下,但加框处代码有错,请改正。 Dim a(1 To 8) As Integer Dim n As Integer
Private Sub Form_Load()
'n=8,排序前数据存储在数组a中,并在列表框Listl中显示 '代码略
End Sub
Private Sub Command1_Click()
Dim flag As Boolean 'flag值为True表示一遍加工中发生过交换 i = 1
flag = True
Do 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 + 1
.
.
Loop
Label3.Caption = \排序过程的加工遍数为\ Str(i) '(2) For i = 1 To n
List2.AddItem Str(a(i)) Next i End Sub
4.【201510】某数据加密方法描述如下: (1)以字节为单位进行加密处理;
(2)将1个字节的8位二进制数分割成前4位与后4位两个二进制数; (3)分别将上述两个4位二进制数转换为十进制数;
(4)将每个十进制数转换为1个加密字符,对应的“密码表”如下: 值(十进制) 加密字符 0 I 1 l 2 i 3 k 4 e 5 C 6 H 7 N 8 P 9 0 10 11 12 13 14 15 s t c a r d 小明按照上述方法,设计了一个字符串(仅包含ASCII字符)加密的VB程序,功能如下:单击“加密”按钮Commandl,程序依次将文本框Textl中每个字符的ASCII码值作为1个字节转换为两个加密字符,连接这些加密字符,最后在文本框Text2中输出加密结果。下表显示了字符串中一个字符的加密过程:
程序运行效果如第17题图所示。
实现上述功能的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 b1 As Integer, b2 As Integer '分别存储分割、转换后的两个十进制数 s = Text1.Text
① For i = 1 To n
a = Asc(Mid(s, i, 1)) b1 = a \\ 16
.
.
b2 = a Mod 16
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 = \
Code2Char = ② End Function
(2)若将“密码表”中值为“0”对应的加密字符“I”改成“i”,加密后的密文可能无法解密,原因是 。
5.【201604】某地1900-1999年的平均降水量数据保存在数据库中。现要求找出相邻两年年平均降水量变化(即本年度与上年度“年平均降水量”差值的绝对值)最大的年份区间。如果多个符合要求的年份区间,只输入距今最近的。小吴为此编写了VB程序,程序运行时,单击按钮Command1后,在文本框Text1中输出运行结果。实现上述功能的VB代码如下,但加框处代码有错,请改正。
Dim w(1 To 100) As Single '依次存储1900-1999年的年平均降水量数据 Const n = 100
Private Sub Form_Load()
'本过程从数据库中按19000-1999年依次读取年平均降水量数据,并存储在数组w中 '代码略 End Sub
Private Sub Command1_Click() Dim i As Integer, imax As Integer imax = 1 For i = 3 To n If Abs(w(i) - w(i - 1)) >= Then imax = i Abs(w(i - 1) - w(i - 2)) Next i
Text1.Text = \年平均降水量变化最大的年份区间是\1899) End Sub
6.【201604】某数据压缩方法描述如下:
1)原始数据中,某数不为0且相邻无重复,压缩数据用该数据表示;
2)原始数据中,某数为0且相邻无重复,压缩数据用两个数表示,第1个位0,第2个为0;
3)原始数据中,某数据相邻有重复,压缩数据用3个数表示:第1个位0,第2个为重复数的个数,第3个为该数本身;
根据上述压缩方法,对应的解压缩方法示例如图a所示。
.