相关试卷
-
1、有如下VB程序段:
bottom =7
i=2
Do While i <= bottom -1
If i Mod 2=0 And a(i)=a(i-1)+a(i+1)Then
For j=i To bottom-1
a(j)=a(j+1)
Next j
bottom= botton-1
End If
i=i+1
Loop
For i= 1 To bottom
Text1. Text=Text1. Text+Str(a(i))
Next i
数组元素a(1)到a(7)的值依次为“26,94,68,42,69,27,132”。若该程序段执行后,文本框Text1中显示的内容是( )。
A、26 42 27 132 B、26 68 42 27 132 C、26 42 69 27 132 D、26 68 42 69 27 132 -
2、对某数组a中的n个元素随机赋0、1或2这三种值之,现按如下算法对数组a从小到大升序排序,设置两个变量:Left记录第一个1的位置,其左侧全是0,Right记录第一个2的前一位置,其右侧全是2。使用i从头到尾查询一遍,根据a(i)的值决定其是否与a(Left)或a(Right)交换,直至i与 Right相遇。
left=1: right =n: i=1
Do While i <=right
If a(i)=0 Then
tmp= a(left): a(left)=a(i): a(i)= tmp
left=left+1
i=i+1
ElseIf a(i)= 1 Then
i=i+1
Else
①
End If
Loop
要实现上述排序算法思想,则横线处代码应该是( )。
A、tmp=a(i): a(i)=a(right): a(right)=tmp: right=right -1 B、tmp=a(i): a(i)=a(right): a(right)=tmp: right=right-1: i=i+1 C、i=i-1 D、right=right-1: i=1-1 -
3、小刘在玩一个数字游戏,给定一个n位正整数(n<=20),根据设定的保留位数,舍去一部分数字,剩下的数字按原次序组成一个最大的新数。例如原数38265083,保留4位,最大数为8683。算法如下:
⑴在左边第1位至最后第n个数(从右向左的第n个数)之间,找出最大值,确定新数的最高位;
⑵从最大值的下个位置到第n-1个数之间查找最大值,确定新数的第二位。
⑶依次类推,确定最终的最大数。
设计了一个VB程序,在文本框Text1中输入一个n位正整数,在文本框Text2中输入保留的位数,点击“确定”按钮,在文本框Text3中输出保留的最大新数。程序运行界面如图所示。
(1)、如果输入的原数是3635132,保留4位数字,则输出的新数是。(2)、实现上述功能的VB代码如下,请在划线处填入合适代码。Private Sub Command1_Click()
Dim a(1 To 20)As String
Dim ys As String, xs As String 'xs 记录最大的新数
Dim k As Integer, h As Integer, n As Integer
Dim i As Integer,j As Integer
Dim F as Boolean
xs=" "
ys=Text1. Text
n=Len(ys)
k=Val(Text2. Text)
F=True
If ys=" " Or n>20 Or k=0 Or k>n Then
Label4. Caption="输入的原数或保留位数不符,请重输!"
F=False
End If
For i=1 To n
①
If a(i)<0" Or a(i)>9" Then
Label4. Caption="输人的原数不是数字,请重输!"
Text1. Text=" "
F= False
End If
Next i
If F= True Then
h=1
For i= 1 To k
For j= h To ②
If a(j)>a(h)Then h=j
Next j
③
h=h+1
Next i
Text3. Text=xs
End If
End Sub
① ② ③
-
4、把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
数组元素a(1)至a(5)依次为5,22,28,42,55,在a(3)处分成两段,交换位置后为:
a(1)
a(2)
a(3)
a(4)
a(5)
28
42
55
5
22
旋转数组a的最小元素是5。
数组d(1)至d(5)依次为0,1,1,1,1,在d(5)处分成两段,交换位置后为:
d(1)
d(2)
d(3)
d(4)
d(5)
1
0
1
1
1
旋转数组d的最小元素是0。
小明依据查找算法思想,设计一个查找旋转数组d最小元素的程序,功能如下:运行程序时,利用“添加”按钮Command1和文本框Text1依次输入旋转数组d的值,在列表List1中显示旋转数组,单击“求解”按钮Command2,在标签Label2中显示旋转数组d最小元素值。运行效果图所示,实现该功能的VB程序如下。
(1)、要使程序运行时,文本框Text1无显示内容,下列方法不能实现该要求的是(单选,填字母:A .在Form_Load事件处理过程中添加语句“Text1.Text="" ”/B .在Command1_Click事件处理过程中添加语句“Text1.Text=""”/C .设计程序界面时,在属性面板设置文本框Text1的Text属性值为空)(2)、程序代码中,加框处有错,请改正。Dim n As Integer
Dim d(1 To 100) As Integer '数组d存储待排序数据
Private Sub Command1_Click()
'按旋转数组规则将数据存入数组d中,代码略
End Sub
Private Sub Command2_Click()
Dim mid As Integer, L As Integer, R As Integer
L = 1: R = n
mid = L
Do While d(L) >= d(R)
If L=R Then'改错
mid = R
Exit Do
End If
mid = (L + R) \ 2
If d(L)=d(R) And d(mid)=d(R) Then
mid = ⑶ '填空
Exit Do
End If
If d(L) < d(mid) Then
L = mid
ElseIf d(mid) < d(R) Then
R = mid
End If
Loop
Label2.Caption = "最小值为" + Str(d(mid))
End Sub
End If
Next i
End Function
(3)、程序代码中,将划线处代码补充完整。(4)、程序代码中,虚线框内自定义函数中主要采用的算法是(单选,填字母:A .冒泡排序/B .选择排序/C .顺序查找/D .对分查找)。 -
5、“旋转数组”过程是指将数组中的元素向右移动k个位置,其中k是非负数。以数组a向右移动3个位置为例,其移动过程有如下两种方法:
原始数据:
a(1)
a(2)
a(3)
a(4)
1
2
3
4
方法一:
①向右旋转1步:
a(1)
a(2)
a(3)
a(4)
4
1
2
3
②向右旋转2步:
a(1)
a(2)
a(3)
a(4)
3
4
1
2
③向右旋转3步:
a(1)
a(2)
a(3)
a(4)
2
3
4
1
方法二:
①将a(1)值放至旋转3个位置后位置a(4):
a(1)
a(2)
a(3)
a(4)
1
2
3
1
②将原a(4)值放至旋转3个位置后位置a(3):
a(1)
a(2)
a(3)
a(4)
1
2
4
1
③将原a(3)值放至旋转3个位置后位置a(2):
a(1)
a(2)
a(3)
a(4)
1
3
4
1
④将原a(2)值放至旋转3个位置后位置a(1):
a(1)
a(2)
a(3)
a(4)
2
3
4
1
有n个数存储在数组a中,给定一个整数p(1≤p≤n),将数组a的前p个数与后n-p个数分别向右旋转k次。例如数组a的各个数值分别是1,2,3,4,5,6,7,当p=4,k=1时,旋转后的结果为4,1,2,3,7,5,6。小明为此编写了VB程序,功能如下:在文本框Text2、Text3中依次输入p和k的值,单击“旋转数组”按钮Command1后,数组旋转后结果显示在Text4中。程序运行界面如下图所示,请回答下列问题:
(1)、当文本框Text3中输入内容修改为3时,执行该程序后,a(3)的值为。(2)、请在划线处填入合适的代码。Dim a(20) As Integer
Const n = 20
Private Sub Form_Load()
'随机产生n个[1,100]之间的随机整数,依次存储到a(1)、a(2)、…a(n)中,并在文本框Text1显示,代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, p As Integer, k As Integer, cnt As Integer, c As Integer, t As Integer
p = Val(Text2.Text)
k = Val(Text3.Text)
i = 1: start = 1:c = a(i): cnt = 1
Do While cnt<= p '方法二
i = ①
t = a(i)
a(i) = c
If ② Then
start = start + 1
i = i + 1
c = a(i)
Else
c = t
End If
cnt = cnt + 1
Loop
For i = 1 To k '方法一
temp = a(n)
For j = ③
a(j) = a(j - 1)
Next j
a(p + 1) = temp
Next i
For i = 1 To n
s = s + Str(a(i))
Next i
Text4.Text = s
End Sub
① ② ③
-
6、(加试题)数字个数统计。编写VB程序,实现如下功能:在文本框Text1中输入仅由ASCII码字符组成的字符串(长度不超过100),单击“数字统计”按钮Command1,在列表框List1中输出字符串中包含的不同数字及其相应的个数,程序运行效果如下图所示。
(1)、为方便调试,要让程序每次运行时文本框Text1中的初始内容为“ab12*{}78ab12()778ab34”,应修改文本框Text1的属性。(2)、实现上述功能的VB程序如下,请在划线处填入合适代码。Private sub command1_click()
Dim a(0 to 9) as integer ‘数组元素a(i)中存放数字i的个数
Dim s as string, ch as string
Dim t as integer
For i=0 to 9
a(i)=0
next i
s=text1.text
for i=1 to len(s)
①
if ch>=“0”and ch<=“9” then
t= ②
a(t)= a(t)+1
end if
next i
list1.clear
for i=1 to 9
if a(i)<>0 then
list1.additem “数字:”+str(i)+ “,共有”+ str(a(i))+ “个”
end if
next i
end sub
① ②
(3)、与上述程序中加框处代码运行效果等价的条件表达式可以是。 -
7、(加试题)编写一个成绩查询程序,输入要查找的分数,输出该分数的名次及同分人数,其算法是:用数组a存放不同的分值,数组m存储相同分数的人数,数组mc存储不同分数的名次。例如,数据库中有一组成绩(已按降序排列):98,95,95,92,90,90,87,按该算法,各数组值如下表所示:
i
1
2
3
4
5
a
98
95
92
90
87
m
1
2
1
2
1
mc
1
2
4
5
7
程序界面如下图所示,在文本框Text1中输入查询成绩,点击“查找”按钮,若找到,则输出该分数的名次和同分数的人数,若找不到,则输出“查无此分”。

程序代码如下,请在划线处填入合适的代码。
Dim n As Integer
Dim a(1 To 1000) As Integer ‘存放不同的分数值
Dim m(0 To 1000) As Integer ‘存放相同分数的人数
Dim mc (0 To 1000) As Integer ‘存放此分数的名次
Private Sub Form_Load()
Dim conn As New ADODB. Connection
Dim rs As New ADODB. Recordset
Dim tmp As Integer
Dim s As Integer
tmp = -1: n = 0
conn. Connectionstring = “provider=Microsoft. ACE.OLEDB. 12. 0; data source=”& App. Path & “\mydb. accdb”
conn. Open
Set rs. ActiveConnection = conn
rs.Open "Select * from score"
mc(0) = 1: m(0) = 0
Do While Not rs. EOF
s = rs. Fields (“成绩”)
If s = tmp Then ‘当前读入分数与上一个分数相同
m(n) = ①
Else
n = n + 1
a(n) = s
m(n) = 1
mc(n) = ②
End If
③
rs. MoveNext
Loop
End Sub
Private Sub Command1_Click0
Dim key As Integer, i As Integer, j As Integer, mid As Integer
key = Val (Text1.Text)
i = 1: j = n
mid = (i + j) \ 2
Do While i <= j And ④
mid = (i + j) \ 2
If a(mid) < key Then
j = mid – 1
Else
i = mid + 1
End If
Loop
If a(mid) = key Then
Label2. Caption = “名次: ”+ Str(mc (mid)) + “同分人数: ”+ Str(m(mid))
Else
Label2. Caption =“查无此分”
End If
End Sub
① ② ③ ④
-
8、数组d中存放了一组数据如表所示,采用对分查找数组元素值86。第一次查找的数组元素是d[4],第二组查找的数组元素是( )
d[1]
d[2]
d[3]
d[4]
d[5]
d[6]
d[7]
65
73
75
82
85
91
95
A、d[2] B、d[3] C、d[5] D、d[6] -
9、某对分查找算法的部分VB程序如下:
i=1: j=12: k=0: S=""
key=Val(Text1.Text) : c= "N" : flag= False
Do 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))
Loop
Text2.Text = s : Text3.Text = c
数组a(1)到a(12)的值依次为“99,91,85,76,68,61,53,42,34,27,20,13”,执行该程序段后,下列说法正确的是( )
A、该程序段只能进行两位正整数的查找 B、在文本框Text1中输入两位任意正整数,则k的值介于1和3之间 C、在文本根Text1中输入76,程序执行后变量i和j的值分别为1和6 D、若文本框Text2中显示了两个正整数,则文本框Text3中显示的内容一定是Y -
10、关于对分查找,下列说法正确的是( )A、对分查找的数据必须是有序排列的 B、对分查找的数据类型必须是数值型的 C、顺序查找比对分查找的查找速度快 D、使用对分查找对未排序数据查找时速度较慢
-
11、某学籍管理系统软件有2万个学生的电子档案(已按学籍号排序),假设从中取出一条记录并与待查项进行比较所花时间为10毫秒,则用对分法在该系统中查找任意一位学生档案最多花费的时间约( )A、10万毫秒 B、20万毫秒 C、130毫秒 D、150毫秒
-
12、酒店房间管理问题:某酒店房间(房间数小于1000)编号按1、2、3……连续编号,客房经理对没有入住的房间使用如下方法来登记管理。连续的空房间,登记第一个房间的编号和连续的空房间数,比如空房间1,2,6,7,8,10,则登记3条记录,分别为1_2,6_3,10_1。某旅客如果退房,需要把这个房间号也登记进去,共有4中情况需要处理:
⑴上靠:若退的房间号为3,则原来登记的记录变为1_3,6_3,10_1;
⑵下靠:若退的房间号为5,则原来登记的记录变为1_2,5_4,10_1;
⑶上下靠:若退的房间号为9,则原来登记的记录变为1_2,6_5;
⑷上下都不靠:若退的房间号为4,则原来登记的记录变为1_2,4_1,6_3,10_1
根据上述规则,小明编写了相应的VB程序,程序启动时读入空房间数据,并在列表框List1中显示,在文本框Text1中输入退房号,单击“退房”按钮后更新列表框List1中的数据。
程序界面如下图所示,请回答下列问题:
(1)、当前登记的记录有3条,分别为2_3,6_2,9_4。某旅客退掉8号房间,则登记的记录将变为。(2)、实现上述功能的VB程序如下,请将划线处的代码补充完整。Const n=1000
Dim a(0 To n)As Integer ‘a(i)保存第i条记录的开始房间号
Dim b(0 To n)As Integer ‘b(i)保存第i条记录的房间数
Dim c As Integer, k As Integer, sp As Integer ‘k为原始记录数
Private Sub Form_Load()
‘程序启动时从数据库中读取原始k条记录,依次存入a(1),b(1),a(2),b(2),…,a(k),b(k),代码略
‘为了程序处理方便,虚设下面两条记录
A(0)=0: b(0)=0: sp=k+1: a(sp )=1000: b(sp)=0
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer
c=Val(Text1.Text)
i=1
Do While a(i)<c
i=i+1
Loop
i=i-1
‘以下处理退房登记问题
If a(i)+b(i)=c Then
If a(i+1)=c+1Then ‘处理第3种情况
①
For j=i+1 To sp-1
a(j)=a(j+1):b(j)=b(j+1)
Next j
sp = sp-1
Else ‘处理第1种情况
b(i)=b(i)+1
End If
ElseIf c+1=a(i+1)Then ‘处理第2种情况
a(i+1)=c: b(i+1)=b(i+1)+1
Else ‘处理第4种情况
For j= ②
a(j)=a(j-1): b(j)=b(j-1)
Next j
a(i+1)=c: b(i+1)=1: ③
End If
List1.Clear
For i=1 To sp-1
List1.Addltem"第" & CStr(i) & "条记录" & CStr(a(i)) & "_" & CStr(b(i))
‘CStr函数的作用是将数字转成字符串
Next i
End Sub
① ② ③
-
13、二分查找又称折半查找,是一种应用于有序数列的高效查找算法。下列数列中适合二分查找算法的是( )
⑴11 99 5 17 2 39
⑵30 52 63 71 78 81
⑶67 62 68 6 15 15
⑷85 78 59 53 19 18
A、(3)(4) B、(2)(3) C、(1)(2) D、(2)(4) -
14、有如下程序段:
For i =2 To 3
For j= 10 To i +1 Step -1
If a(j)<a(j-1) Then
t= a(j): a(j) = a(j-1): a(j-1) =t
End If
Next j
Next i
数组元素a(1)到a(10)的值依次为“66,34,12,59,21,26,18,45,20,16”,经过该程序段“加工”后,数组元素a(1)到a(10)的值依次为( )
A、66,12,16,34,18,59,21,26,20,45 B、12,16,18,20,21,26,34,45,59,66 C、66,59,45,34,12,26,21,20,18,16 D、12,16,18,66,34,20,59,21,26,45 -
15、某查找算法的VB 程序如下:
Private Sub Command1_Click()
Dim a(1 To 9) As Integer, key As Integer, i As Integer, j As Integer
Dim mid1 As Integer, mid2 As Integer
a(1)=4: a(2)=22: a(3)=27: a(4)=32: a(5)=35: a(6)=44: a(7)=56: a(8)=59: a(9)=78
key=Val(Text1.Text)
i=1: j=9
flag=False
Do While i<=j And Not flag
Mid1=i+(j-i)\3
mid2=j-(j-i)\3
If key=a(mid1) Then
flag=True
ElseIf key<a(mid1) Then
j=mid1-1
ElseIf key=a(mid2) Then
flag=True
ElseIf key>a(mid2) Then
i=mid2+1
Else
i=mid1+1
j=mid2-1
End If
Loop
If flag Then Label1.Caption=″查找成功!″Else Label1.Caption=″查找失败!″
End Sub
该程序段执行时,在文本框Text1中输入36,单击命令按钮Command1,程序运行结束后,i和j的值为( )
A、4,5 B、6,5 C、5,6 D、6,4 -
16、下列关于程序设计中查找算法的描述,正确的是( )A、顺序查找和二分法查找都是常用的查找算法 B、二分法查找一定优于顺序查找 C、顺序查找一定优于二分法查找 D、当数据有序时,不适用二分法查找
-
17、有如下VB程序段:
Dim a(1 To 10)As Integer
Private Sub Form_Load()
a(1)=2: a(2)=3: a(3)=3: a(4)=3: a(5)=3
a(6)=6: a(7)=7: a(8)=7: a(9)=8: a(10)=9
End Sub
Private Sub Command1_Click()
Dim key As Integer, i As Integer, j As Integer
Dim m As Integer, p As Integer
key=Val(Text1.Text)
i=1: j=10
Do While i<=j
m=(i+j)\2
If a(m)= key Then
p=m
j=m-1
ElseIf key<a(m)Then
j=m-1
Else
i=m+1
End If
Loop
Text2.Text=Str(p)
End Sub
程序运行时,在文本框 Text1中输入3,单击按钮,文本框Text2中显示的内容是( )
A、2 B、3 C、4 D、5 -
18、有如下VB程序段:
a(1)=2: a(2)=6: a(3)=8: a(4)=9: a(5)=12
a(6)=15: a(7)=17: a(8)=18: a(9)=22: a(10)=30
k=Val(Text1.Text)
i=1: j=10
Do While i<=j
m=(i+j)\2
If a(m)<=k Then
i=m+1
Else
j=m-1
End If
Loop
Text2.Text=Str(a(i))+"←→"+Str(a(j))
程序运行时,若在文本框Text1中输入5,则文本框Text2中显示的内容是( )
A、2←→1 B、6←→8 C、2←→6 D、6←→2 -
19、有序(非降序)数组A有n个元素,用对分查找算法在数组A中查找key值所在的位置,如果有重复的元素,则显示最早出现该key值的位置。相应的VB程序段如下:
key = Val(Text1.Text)
i = 1: j = n
Do While i <= j
m = (i + j) \ 2
If a(m) > key Then
j = m - 1
ElseIf a(m) < key Then
i = m + 1
Else
If
Thenj = m - 1
Else
Label2.Caption = Str(key) + "的起始位置是" + Str(m)
Exit Do
End If
End If
Loop
If i > j Then
Label2.Caption = "找不到" + Str(key)
End If
要使程序实现上述算法思想,则方框中的语句是( )
A、a(m - 1) = key B、a(m) = key C、m - 1 >= 0 And a(m - 1) = key D、m - 1 >= 0 And a(m) = key -
20、(加试题)有1个升序排列的数组a(a(1)~a(n),n≥3),从左到右相邻两个元素的差值(后一个元素值减去前一个元素值)先由小到大、再由大到小,且相邻两个差值不相等,为了查找相邻两个元素的最大差值,小李编写的VB程序段如下:
i = 1 :j = n
Do While i + 1 < j
m = (i + j) \ 2
If a(m + 1) - a(m) > a(m) - a(m - 1) Then
Else
End if
Loop
Label1.Caption="相邻两个元素的最大差值是" + Str(a(j) - a(i))
上述程序段两个方框处的语句分别为( )
A、① i = m ② j = m B、① i = m② j = m - 1 C、① i = m + 1② j = m – 1 D、① i = m + 1② j = m