相关试卷
-
1、小王编写了一个实现文字查找替换功能的VB程序,运行界面如图所示。文本框Text1显示原文内容,Text2中输入查找内容,Text中输入替换内容,单击“全部替换”按钮 Command1后,Text4显示查找替换的结果Text5中显示替换的次数,Text6显示“查找内容”在原文中的起始位置。
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Private Sub Command1_ Click ( )
Dim s As String, result As String, pos As String
Dim count As Integer, i As Integer
i =1: count =0
result = “”: pos =“”
Do While i < = Len(Text1. Text)
s = Mid(Text1.Text, i, Len(Text2. Text))
If s = Text2. Text Then
result = result + Text3. Text
count = count + 1
pos =
‘ ①i = i + Len(Text2. Text)
Else
‘ ②i=i+1
End if
Loop
Text4 Text result
Text5. Text =Str(count)
Text6 Text = pos
End Sub
① ②
-
2、【加密与解密问题】某数据加密方法描述如下:
⑴以字节为单位进行加密处理;
⑵将1个字节的8位二进制数分割成前4位与后4位两个二进制数;
⑶分别将上述两个4位二进制数转换为十进制数;
⑷将每个十进制数转换为1个加密字符,对应的“密码表”如下:
值(十进制)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
加密字符
I
l
i
k
e
C
H
N
p
o
s
t
c
a
r
d
小明按照上述方法,设计了一个字符串(仅包含ASCⅡ字符)加密的VB程序,功能如下:单击“加密”按钮Command1,程序依次将文本框Text1中每个字符的ASCⅡ码值作为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 b1 As Integer, b2 As Integer ‘分别存储分割、转换后的两个十进制数
s = Text1. Text
n = Len (s)
For i = 1 To n
a = ①
b1 = a\16
b2 =a Mod 16
ss= ss + Code2 Char(b1) + Code2 Char(b2)
Text2. Text=ss
Next i
End Sub
‘十进制值转换为加密字符的函数
Function Code 2 Char(c As Integer) As string
Dim s As String
s = “IlikeCHNpostcard”
Code2Char = ②
End Function
① ②
(2)、若将“密码表”中值为“0”对应的加密字符“I”改成“i”,加密后的密文可能无法解密,原因是。 -
3、【约瑟夫问题】猴子选大王。有n(n≤100)猴子举行选大王大会,由于大家谁也不服谁,因此有猴子提议使用玩游戏的方式来选出大王。首先将n只猴子进行随机编号(编号为1到n,猴子编号不重复),然后产生一个随机数k,游戏规则如下n只猴子按编号从小到大的顺序围成一圈,并从编号为1的猴子开始报数(1,2,3…),报到k的猴子出圈(出圈即被淘汰);接着再由出圈的猴子的下一只猴子重新开始报数(1,2,3…),报到k的猴子又出圈,如此继续,直到圈中只剩下一只猴子,它就是猴子大王。要求依次输出出圈的猴子的编号及猴子大王的编号。
例如n=8,k=6,则依次出圈的猴子的编号为6、4、3、5、8、7、2,最后剩下的猴子的编号为1,即猴子大王的编号为1。
程序运行时,在文本框Text1中输入猴子的总数n,单击“产生随机数k”按钮Command1将生成一个随机整数k(1≤k≤n),并在标签 Label3中显示k的值,单击“选大王”按钮Command2后,将在文本框Text2中显示依次出圈的猴子的编号,在标签Label6中显示猴子大王的编号。程序运行结果如图所示。
实现上述功能的VB程序如下,请在划线处填入合适的代码。
Dim k As Integer, n As Integer
Private Sub Command1_Click ( )
Randomize
n= Val(Text1. Text)
k = Int (Rnd n) + 1
Label3. Caption Str(k)
End Sub
Private Sub Command2_Click ( )
Dim a (1 To 100) As Integer ‘a(i) = 1 表示编号为i的猴子在圈上,a(i) = 0表示出圈
Dim b (1 To 100) As Integer ‘ 数组元素b(i)=x,表示第i只出圈的猴子的编号为x
Dim i As Integer, st As String, j As Integer
Dim p As Integer, sum As Integer ‘ p表示出圈的猴子数,sum表示报数的数值
For i = 1 To n
a(i) = 1
Next i
p = 0
j = 0
Do While p <> n-1
①
Do While sum < k ‘ 依次报数,直到报到k为止
j=j+1
If j > n Then j = 1 ‘ 报数至最后时,将重头继续报
sum = sum + a(j)
Loop
a(j) = 0: p =p+1
②
Loop
For i=1 To p
st= st str(b(i)
Next i
Text2. Text = st
i=1
Do While a(i) <> 1
i=i+1
Loop
Label16. Caption = ③
End Sub
① ② ③
-
4、【排名次问题】小王编写了一个依据成绩计算名次的VB程序,成绩为0到100之间的整数。算法的基本思想:先统计每个分数的个数,然后按照分数从高到低依次计算每个有效分数(该分数的个数不为0)对应的名次分数相同时名次并列。最高分为第1名,该分数的名次与个数之和为下一个有效分数的名次,以此类推。程序用数组A存放每个分数对应的个数,数组B存放每个分数对应的名次。例如,下表中最高分100有2个,并列第1名,则分数96的名次为分数100的名次加上分数100的个数,即第3名。
分数
100
99
98
97
96
95
94
…
0
个数
(A数组)
2
0
0
0
1
0
3
…
0
名次
(B数组)
1
3
4
…
程序运行时,学生数据显示在列表框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 =1 To n-nx
sx = “”+ sx
Next i
①
End Function
Private Sub Command1_Click ( )
Dim A (0 To 100) As Integer ‘存放每个分数的个数
Dim B (0 To 100) As Integer ‘存放每个分数的名次
Dim mc As Integer, score As Integer, i As Integer
For i = 0 To 100
A(i) = 0
Next i
For i = 1 To recount ‘ 计算每个分数的个数
②
Next i
mc = 1
For i = 100 To 0 step -1 ‘ 计算每个分数的名次
If A(i) <> 0 Then
B(i) = mc
③
End If
Next i
List2. clear
List2. AddItem “姓名 分数 名次 ”
List2. Additem “------------------------------”
For i = 1 To recCount
score = sScore(i)
mc = B (sScore(i))
List2. AddItem sName(i) + ads ( score,5) + "第" + ads(mc,3) + "名”
Next i
End sub
① ② ③
-
5、【最值,最值区间问题】进入2016年7月以来,浙江省气温连续高热,为了观察气温的变化情况,小明用VB编写了一个连续高温天数的统计软件。小明采集了杭州市7-8月的每日最高气温,并存放在 Access数据中。程序运行时,读取日期和最高气温并显示在列表框List1中,在文本框Text1中输入温度值,单击“统计”按钮Command1,程序自动统计在该温度值及以上的最长连续天数,并显示在Text3中,同时在Text2中显示日期区间,运行界面如图所示。
实现上述功能的VB程序如下,在划线处填入合适的代码。
Dim rq (1 To 100) As String ‘ 存放日期
Dim qw (1 To 100) As Integer ‘ 存放最高气温值
Dim n As Integer ‘ 总天数
Private Sub Form Load ( )
‘ 读取数据库内容,其中日期数据存放在数组rq中,最高气温数据存放在qw中,第i个日期保存在rq(i)中,对应的气温保存在qw(i)中,并显示在列表框List1中
‘代码略
End sub
Private Sub Command1_Click ( )
Dim ntempend As Integer ‘ 记录当前结束日期的下标
Dim max As Integer ‘ 记录最大连续天数
Dim nend As Integer ‘ 记录最大连续天数下的结束日期的下标
Dim ncount As Integer ‘ 统计连续天数
Dim tjqw As Integer ‘ 存放输入的温度
tjqw = Val (Text1. Text)
ncount = 0
max =0
For i = 1 To n
If ① Then
ncount = ncount + 1
ntempend = i
Else
ncount = 0
End If
If max < ncount Then
max = ncount
②
End If
Next i
If max <> 0 Then Text2. Text = ③ &“-” rq(nend)
① ② ③
-
6、【排序算法的应用3】某排序算法思想如下:若有1个桶,编号为0~10,随机产生多个整数,每产生一个整数时,就在以该整数为编号的桶中放一面小旗子,最后只要按顺序数每个桶中有几面小旗子,就能得到这几个整数的有序排列。例如2号桶中有1面小旗子,表示2出现了一次;3号桶中有1面小旗子,表示3出现了一次;5号桶中有2面小旗子,表示5出现了两次;8号桶中有1面小旗子,表示8出现了一次,按桶的编号顺序读出旗子数量,没有旗子的桶略过,得到有序整数“2,3,5,5,8”。
为此,小李编写了一个VB程序,功能如下:运行程序,窗体加载时随机产生6个[0,9]内的随机整数,并在列表框List1中依次显示排序前数据,单击“排序”按钮Command1,在列表框List2中显示经过上述排序算法后的数据。运行结果如图所示。
实现上述功能的VB程序如下,但加框处代码有错,请改正.
Dima (10) As Integer ‘数组a表示桶的编号,如a(0)表示第0号桶
Private Sub Command1_Click ( )
Dim i As Integer, j As Integer
For i = 0 To 10
For j = 1 To
‘①List2. AddItem CStr(i)
Next j
Next i
End Sub
Private Sub Form_Load ( )
Dim i As Integer
Randomize
For i = 0 To1 0 ‘将数组初始化为0
a(i) = 0
Next i
For i = 1 To 6 ‘产生6个[0,9]内的随机数
t = Int (Rnd*10)
a(t) =
‘② 第t号桶中小旗子数量加1List1. AddItem CStr(t)
Next i
End Sub
① ②
-
7、【排序算法的应用2】双关键字排序:在Excel中可采用双关键字排序,即先按主关键字排序,如主关键字相同再按次关键字排序。小王学习了冒泡排序后,编写了一个VB程序模拟该排序过程。功能如下:在列表框List1中显示排序前数据(存储在数组a、b中),单击“排序”按钮 Command1后,按主关键字数组a升序和次关键字数组b升序排序,排序后的数据在列表框Lis2中显示。程序运行界面如图所示。
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Const n = 10
Dim a(l To n) As Integer, b(1 To n) As Integer
Private Sub Form_Load
‘ 各产生10个随机整数存入数组a、b,并在列表框List1中显示
‘ 代码略
End sub
Private Sub Command1_Click ( )
Dim i As Integer, j As Integer
i = 1
Do While i < = n-1
‘①Do While > = i+1
If a(j) < a(j-1) Then
temp = a(j): a(j) = a(j-1): a(j-1) = temp
temp = b(j): b(j) = b(j-1): b(j-1) = temp
‘②temp = a(j): a(j) = a(j-1): a(j-1) = temp
temp = b(j): b(j) = b(j-1): b(j-1) = temp
End if
j = j-1
Loop
i = i+1
Loop
For 1 =1 To n
List2. AddItem Str(a(1)) + “” + str(b(i))
Next i
End sub
① ②
-
8、【排序算法的应用1】小明编写了一个数据插入程序。程序输入一个数字,将该数字插入一列有序数据:-5,3,4,12,20,45,70,并使数据序列保持有序。设计的算法是从前往后找位置插入。
程序运行界面如图所示。
实现上述算法的VB程序如下,在划线处填写恰当的语句。
Private Sub Command1_ Click ( )
Dim a (1 To 8) As Integer
Dim n As Integer, i As Integer, j As Integer, x As Integer
List1. Clear
List2. Clear
a(1) = -5: a(2) = 3: a(3)= 4: a(4) = 12: a(5) = 20: a(6) = 45
a(7) = 70
For j = 1 To 7
List1.AddItem Str (a(j))
Next j
x = Val(Text1. Text)
Do While x > a(i) And i < 8 ‘ 找x的插入位置
①
Loop
For j = 8 To i + 1 step-1 ‘ 移动数据
②
Next j
a(i) = x
For j = 1 To 8
List2. AddItem str (a(3))
Next j
Label1. Caption =“插入的位置是”str(i)
① ②
-
9、【游戏问题】在某打牌游戏中,一开始每个玩家各有17张牌,牌型从小到大分别为“3~10、J、Q、K、A、2”,每种牌最多4张,现在按指定规则的顺序打牌,打完为止。规则如下:
⑴先打顺子牌(顺子指连续的5个及以上牌型如45678,顺子最大到A),若有多个顺子,先长后短,长度相同按先小后大的顺序打出。
⑵然后按4张、3张、2张、1张的顺序出牌,同一个牌型从小到大。
小刘依据上述算法设计了VB程序,其中牌型“1”用数字“0代替表示,运行界面如图所示,程序代码如下,请回答下列问题。
(1)、若初始牌型为344445566790JQKA2,第2次出的牌为。(2)、请在划线处填入合适代码,使程序完整。Private Sub Command1_ Click ( )
Dim i As Integer, j As Integer
Dim aa (1 To 13) As Integer, max As Integer
Dim t As Integer, last As Integer
Dim sa As String, stem As string
Dim flag As Boolean
Const s = “34567890JQKA2” ‘为方便计算,牌10用0代替
‘ 在标签1abe11显示初始牌型,洗牌后数组a各元素分别存储牌型3~2的数量
‘ 代码略
t=17 ‘刚开始牌有17张
Do While t > 0 ‘打牌
flag = True
Do While flag ‘寻找牌中有没有顺子牌
max = 0:k = 1:flag False
For i=1 To 11
If ① Then
k = k+1
If k > max Then
max = k
last = i+1 ‘ 记录连续牌的最后一张
End If
Else
k=1
End If
Next i
If max > = 5 Then ‘ 有顺子牌,把最长的这把顺子打出来
flag = True: sa = “”
For j = ② To last
stem = Mid (s, j, 1)
sa = sa + stem + “”
aa(j)= aa(j)-1
Next j
List1. AddItemsa ‘ 顺子在列表框显示
t = t-max
End If
Loop
For i = 1 To 13 ‘ 出4个一样的牌
If aa(i) = 4 Then
stem = Mid (s, i, 1)
List1. AddItemstem + stem + stem + stem
aa(i) = 0
③
End If
Next i
‘ 3张、2张、单张出牌,具体代码略
Loop
End sub
① ② ③
-
10、如图a所示的“学生信息”数据表中存储着全校学生的“7选3”选课信息杰克同学编写了一个VB程序,用于查询每个同学的选考科目,程序运行界面如图b所示。
程序运行时,在文本框Text1中输入学号,单击“开始查询”按钮(Command1),在“查询结果”区域显示查询到的学生姓名和选考科目数据。
学校共有n名学生,数组a、b分别保存了所有学生的学号和姓名信息。数据库数据按学号从小到大排列,第i个学生的学号保存在a(i),对应的姓名保存在b(i),该学生的选考科目保存在c(i)中。
实现上述算法的VB程序如下,在程序划线处填入适当的代码,把程序补充完整。
Dim n As Integer, a( 1000 ) As String
Dim b ( 1000 ) As String
Private Sub Command1_Click ( )
Dim x As String, pos As Integer
Dim conn As New ADODB Connection, rs As New ADODB. Recordset
conn ConnectionString = “provider = Microsoft. ACE OLEDB. 12.0; data source = “ & App. Path &" \students. accdb”
conn. Open
Set rs. ActiveConnection = conn
rs.Open “学生信息”
n = 0 ‘考生数初始化
Do While Not rs. EOF
n=n+1
a(n) = rs Fields (0): b(n) = rs Fields (1): c(n) = rs Fields(2)
①
Loop
x= Text. Text
②
If pos > 0 Then
Text2 Text = b(pos):Text3 Text = c(pos)
Else
Text2.Text= “找不到” : Text3.Text =“”
End if
End Sub
Function Search(Key As string) As Integer
Dim i As Integer, j As Integer, m As Integer
i = 1: j = n: Search = 0
Do While i < = j
m = Fix((1+j) / 2)
If Key = a(m) Then
③
Exit Function
ElseIf a(m) > Key Then
j = m-1
Else
i=m+1
End If
Loop
End Function
① ② ③
-
11、小张为了处理2015年中国主要城市的GDP数据,他把2015年中国主要城市的GDP数据存储在数据库文件gdp. accdb中。他设计了一个 Visual Basic程序,程序运行效果如图所示。
在界面的左侧列表框List1中显示各城市GDP数值,单击“按人均GDP排序”按钮Command1,在右侧列表框List2中显示排序完成后的结果(按人均GDP值从高到低排序)。
实现上述功能的VB代码如下:
(1)、请在划线处填入合适的代码。Dim conn As New ADODB Connection, rs As New ADODB. Recordset
Dim n As Integer, i As Integer, j As Integer, t As Long
Dim ts As string
Dim a (1 To 200) As Integer, c (1 To 200) As String
Dim g (1 To 200) As Long, p (1 To 200) As Long
Private Sub Form Load ( )
conn ConnectionString = “Provider = Microsoft. ACE OLEDB.12.0; DataSource =“& App. Path &”\gdp. accdb”
conn. Open
Set rs ActiveConnection = ①
rs. Open “SELECT * FROM dGDP”
n = 0 ‘I处代码
Do While Not rs EOF
n = n+1
a(n) = rs. Fields ("GDP排名"). Value
c(n) = rs. Fields ("城市"). Value
g(n) = rs Fields ("GDP"). Value
p(n) = rs, Fields ("人均GDP"). Value
List1 AddItem Str(a(n)) +“”+ c(n)+“”+Str(g(n)) +“”+Str(p(n))
rs.MoveNext
Loop
rs. Close
conn. Close
Set rs = Nothing
Set conn = Nothing
End sub
Private Sub Command1_Click ( )
For i = 1 To n-1
For j = ② To n
If p(i) < p(j) Then
t = a(i): a(i) = a(j): a(j) = t
ts = c(i): c(i) = c(j): c(j) = ts
t = g(i): g(i) = g(j): g(j)=t
t = p(i): p(i) = p(j): p(j)=t
End If
Next j
Next i
List2. Clear
For i =1 To n
List2 AddItem Str(a(1))+” ”+c(i)+” “+ Str(g(1))+” ”+str(p(i))
Next i
End Sub
① ②
(2)、若I处代码n=0改为n=1程序运行结果将不正确,其原因是。 -
12、某老师用VB设计了一个学生7选3的选课查询系统,学生选课信息存储在数据库文件“student. accdb”的“data”表中,数据表及选课查询系统程序运行界面如图所示。
程序功能:在文本框Text1中输入课程名称,单击“查询”按钮Command1,在列表框List1中显示选择该科目的学生信息。如果没找到在列表框List1中显示“该科目没人选择!”。按此要求将程序补充完整。
Private Sub Command1_Click ( )
Dim conn As New ADODB Connection
Dim rs As New ADODB. Recordset
Dim h(1 To 40) As String, m(1 To 40) As String
Dim n As Integer
conn Connectionstring = "provider = microsoft. ACE OLEdB. 12.0; data source ="+ App. Path + “\ ① “
conn. Open
Set rs, ActiveConnection conn
strsql ="select xh, xm from ② where km = ‘ “ & Text1. Text &“ ‘ “
rs Open strsql
List1. Additem "学号" + "姓名”
Do While Not rs EOF
n = n+1
h(n)= rs Fields ("xh")
m(n) = ③
④
Loop
If n=0 Then
List1. AddItem “该科目没人选择!”
Else
For i =1 To n
List1.AddItem h(i) &” ” & m (i)
Next i
End If
rs Close
conn. Close
Set rs = Nothing
Set conn = Nothing
End Sub
① ② ③ ④
-
13、以下VB代码片段用于从数据库中读取数据:
Dim conn As New ADODB Connection
Dim rs As New ADODB. Recordset
conn ConnectionString =“Provider = Microsoft. ACE. OLEDB. 12.0; DATA Source =" & App. Path &"\ data accdb”
Set rs.ActiveConnection = conn
rs. Open “select * from table”
n = 0
Do While Not rs EOF
n=n+1
rs.MoveNext
Loop
下列对于以上代码的理解正确的有( )
①连接的数据库文件名是“data”
②“ConnectionString”是conn对象的属性值
③查询的数据表名称是“table”
④程序运行后,变量n的值表示该数据表中记录的总数
⑤省略语句“rs. MoveNext”,程序也可以正常运行
A、①②③④ B、②③④ C、③④⑤ D、③④ -
14、通过ADO的 Recordset对象实例rs打开的记如图所示。当前是第3条记录,要使用 Fields集合返回第2个字段的值,以下代码正确的是( )
A、a(3) = rs.Fields (2) B、a(3) = rs. Fields (1) C、a(3)= rs. Fields(xh) D、a(3)= rs. Fields(“xm”) -
15、关于Visual Basic程序与数据库的连接,下列法正确的是( )A、“Select * from info” 中的“info”是数据库文件名 B、rs.MoveNext中的MoveNext是记录集对象rs属性 C、rs. Fields (1)读取的是当前记录的第1个字段内容 D、若记录集为空,则该记录集的EOF属性值为true
-
16、VB调Access用数据库一般使用如下程序代码:
Dim conn As New ADODB Connection
Dim rs As New ADODB. Recordset
conn. ConnectionString ="Provider = Microsoft. ACE OLEDB. 12.0; DATA Source=" & App. Path &" \student. accdb"
conn. Open
rs ActiveConnection = conn
rs Open "select * from score"
n = 0
Do While Not rs. EOF
n = n+1
a(n) = rs Fields("name")
b(n) = rs Fields("score")
rs.MoveNext
Loop
对以上代码的分析,不正确的是( )
A、student.accdb数据库中有一张数据表,名为ore B、ActiveConnection是conn对象的一个属性 C、b数组读取了数据表中的score字段的值 D、程序运行结束,变量n存储了数据表中的总录数 -
17、在VB中连接并读取Access数据库文件通常使用以下代码:
Dim conn As New ADODB Connection
Dim rs As New ADODB. Recordset
Dim n as Integer
Private Sub Form_Load ( )
conn. ConnectionString ="Provider= Microsoft. Ace. OLEDB. 12.0;
data source =" + App. Path + " \data \data. accdb" ‘ 此处内容在同一行中,因印刷排版限制而换行
conn. Open
sqI = “select * from student”
Set rs. ActiveConnection = conn
rs. Open sql
n=0
Do while Not rs. EOF
Call read ( )
n=n+1
rs. MoveNext
Loop
End sub
sub read ( )
List1.AddItem rs ("name")
End sub
运行上述程序,以下说法不正确的是( )
A、当前读取的数据库文件为data目录下的data.acdb B、数据库中存在一个名为student的数据表 C、List1列表框中将显示所有name字段的值 D、当前读取的数据表中总记录数为n-1 -
18、有100个大小、形状一样的玻璃球,其中有1个玻璃球的质量轻于其他99个玻璃球,如何用一台无砝码的天平,以最快的速度找出这颗轻玻璃球?运用“三分筛选”法来模拟“寻找”这个玻璃球的算法如下:
步骤1:如果待筛选的玻璃球个数小于或等于,则认定已经找出了这颗玻璃球(认定方法参照步骤2中描述),停止筛选,并输出筛选总次数;否则,重复执行步骤2。
步骤2:按编号依次将玻璃球均分成3份,如果有多余的则放入第3份中。比较第1、2份的玻璃球质量:
①如果第1份等于第2份的质量,则选取第3份的玻璃球作为下一次筛选的对象;
②如果第1份小于第2份的质量,则选取第1份的玻璃球作为下一次筛选的对象;
③如果第1份大于第2份的质量,则选取第2份的玻璃球作为下一次筛选的对象。
重复执行步骤1。
例如:第1次筛选的小球编号区间是1~100,均分成3份的待称重小球编号分别是1~33、34~66、67~100;第2次则选取以上3份的其中一份进行再筛选、再均分,……,直至找到。
解决上述问题的VB程序功能如下:运行程序,在列表框List1中显示100组数据,每组数据分别代表每个编号及对应的小球质量(其中有且只有一个小球的质量与其他小球不同),单击“查找”按钮 Command1,在列表框List2中显每次筛选的编号区间和完成筛选的总次数。程序运行界面如图所示。
(1)、如果编号为88的小球是较轻的,按照题中给定算法,到此小球需经历的筛选次数是。(2)、实现上述功能的VB程序如下。请在划线处填入合适的代码。Const maxn = 100
Dim a (1 To maxn) As Integer
Dim w (1 To 2) As Integer ‘ 数组w用来存储第1份和第2份小球的质量
Private Sub Form Load ( )
‘ 此处代码用来模拟产生100个小球的质量,分别存储在数组元素a(1)~a(100)中
‘ 其中只有1个小球的质量为8,随机存储在数组a的某元素中,其余质量均为10
‘ 此处代码略
End Sub
Private Sub Command1_Click( )
Din 1eft As Integer, right As Integer ‘ left为起始编号, right为结束编号
Dim s As Integer, C As Integer ‘s 为每次查找的区间长度
left = 1:right = maxn
c = 1:s = right:i = 0
List2 AddItem Str(i+1) +"---->” + Str(maxn)
Do While right - left > =3
w(1) = o:w(2) = 0:k =1
i = left
s = ①
Do While i < = (s \3)*2 + left -1
‘Do语句用于将待筛选的数据进行区域划分
w(k) = w(k)+a(i)
If i = (s\3)*k+ left -1 Then k = k+1
i = i+1
Loop
If w(1) = w(2) Then
left = left + (s\3)*2
ElseIf w(1) < w(2) Then
②
Else
right = left+(s\3)
left =s\3+ left
End If
③
List2. AddItem Str (left) & ”---->” & str(right)
Loop
List2. AddItem "经过”+s tr(c) +" 次后找到”
End sub
① ② ③
-
19、数组a中存储的是左右交替上升的n个正整数,如下表所示:
a(1)
a(2)
a(3)
…
a(n-2)
a(n-1)
a(n)
3
25
38
…
55
31
12
依据对分查找思想,设计一个在数组a中查找数据key的程序,实现该功能的VB程序如下,但加框处代码有错,请改正
Private Sub Command1_Click( )
Const n = 6
Dim a (1 To n) As Integer, flag As Boolean
Dim i As Integer, j As Integer, m As Integer, key As Integer
‘读取一组正整数,按上述规则存入数组a中
‘代码略
key = Val(Text1. Text)
i = 1
j = (n+1) \2
flag= False
Do While
And Not flag ‘①m = (i+j) \2
If key = a(m) Then
flag= True
ElseIf key < a(m) Then
j = m-1
Else
i = m+1
Loop
If Not flag And j > 0 Then
m =
‘②If key = a(m) Then flag = True
End If
If flag Then
Text2.ext = str(m)
Else
Text2.Text= “找不到”
End if
End sub
①加框处应改为。
②加框处应改为。
-
20、“轮转后有序数组(Rotated Sorted Array)”是取有序数组中某一个数为分割点,将分割点之前的所有数都轮转到数组的末尾所得的数组。比如7,11,13,17,2,3,5就是一个轮转后有序数组,原有序数组中的子串{2,3,5}被轮转到了数组的末尾处。对于一个轮转后有序数组arr也可以进行对分查找,算法思路如下(以升序为例):每次根据查找的左侧位置L和右侧位置R求出中间位置M,M左边[L,M]和右边[M+1,R]这两部分中至少有一个是有序的(可根据中间位置数据和边界数据的大小关系进行判断)。
arr[M]和待查找数据key比较:
①arr[M]= key,返回M的值;
②若M位置的右侧有序,当待查找数据在右侧时则下次在右侧查找,否则在M左侧查找;
③若M位置的左侧有序,当待查找数据在左侧时,下次在左侧查找,否则在M右侧查找。
(1)、对轮转后有序数组{7,1,13,1,2,3,5}使用函数Search( )查找key值3,则查找次数为。(2)、以下VB程序实现了对轮转后有序数组arr进行分查找的过程,如果查询成功,返回M值,查询失败则返回-1。请补充程序中划线处的代码。Function Search (key As Integer, L As Integer, R As Integer) As Integer
① ‘填写合适的代码
Do While L < R And Search =-1
M=(L+R)\2
If arr(M) = key Then
Search = M
Else
If ② Then ‘填写合适的代码
If arr(L) < = key And key arr(M)Then
R=M-1
Else
L=M+1
End If
Else
If ③ Then ‘填写合适的代码
L=M+1
Else
R = M-1
End if
End if
End If
Loop
End Function
① ② ③