i=l:j=9:n=0
key=Val(Text1,Text)
Do While i<=j
n=n+1
m=Fix((i+j) / 2)
If key=d(m) Then Exit Do ‘Exit Do表示退出循环
If key<d(m) Then j=m-1 Else i=m+1
Loop
数组元素d(1)到d(9)的值依次为“7,12,18,25,39,58,61,72,86”。若该程序段运行结束后,n的值为2,则key的值是( )
程序运行时,在文本框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
① ② ③
Dim i As Integer, sum As Integer
Dim a(1 To 6) As Integer, b(1 To 6) As Integer
sum = 0
a(6) = 18: a(5) = 7: b(6) = 14: b(5) = 16
For i = 4 To 1 Step -1
a(i) = a(i + 2) - a(i + 1)
b(i) = b(i + 2) - a(i)
If b(i) Mod 3 = 0 Then sum = sum + b(i)
Next i
Text1.Text = Str(sum)
该程序段运行后,文本框Text1中显示的内容是( )
租车原则是首先考虑自带经费多的部分同学优先租相对花费少的自行车,尽量少花学校经费以达到最多同学租车的结果。比如学生带的钱为9,3,6,7,5,租车的钱分别需要15,8,12,6,9,11,如果5个人都能租车,至少需要学校提供经费为(6-3)+(8-5)+(9-6)+(11-7)+(12-9)=16,如果学校经费只有10元,则自带钱最少的同学不租车,这时所需学校经费为(6-5)+(8-6)+(9-7)+(11-9)=7。计算过程中采用二分查找法来判断租用自行车的人数能否达到最大值。
Dim a( 1 To 100) As Integer, b( 1 To 100) As Integer
Dim n As Integer, m As Integer
Private Sub Command1_Click()
Dim left As Integer, right As Integer, mid As Integer, an s As Integer
n=Val(Text 1.Text) :m=Val(Text 2.Text)
‘从数据库读取n位同学带的钱存储在数组a,m辆自行车租用的钱存储在数组b,代码略。
Call px(a(),n)
Call px(b(),m)
left =1:right=n:ans= 0
Do While left<=right
mid=(left+right) \ 2
If check(mid) =True Then
①
right =mid-1
Else
left =mid+ 1
End If
Loop
Label 1.Caption=“能租车的最大人数为”+Str(ans)
End Sub
Sub px(d() As Integer, s As Integer)
Dimi as integer, j as integer, k as integer
For i=2Tos
k=d(i)
j=i-1
Do While k<d(j)
d(j+1)=d(j)
j=j-1
If j=0ThenExitDo
Loop
②
Next i
End Sub
Function check(mid As Integer) As Boolean
Dim cnt As Integer, jf As Integer, t As Integer
cnt=Val(Text 3.Text)
For t=1Ton-mid+ 1
If b(t) >a(mid+t-1) Then jf=b(t) -a(mid+t-1) Else jf= 0
③
Next t
If cnt>= 0 Then check=True
End Function
① ② ③
Private Sub Command1_Click()
Dim result As String, s As String, c As String, cmax as string
Dim i As Integer, j As Integer
s = Text1.Text
Text2.Text = ""
For i = 1 To Len(s)
①
If c >= "A" And c <= "Z" Or c >= "a" And c <= "z" Then
result =②
End If
Next i
Text2.Text = result
j = 2
cmax = Mid(result, 1, 1)
Do While j <= Len(result)
If Mid(result, j, 1) > cmax Then cmax = Mid(result, j, 1)
③
Loop
Text3.Text = cmax
End Sub
Private Sub Command1_Click()
Dim a(1 To 100) As String, s As String
Dim i As Integer, m As Integer, n As Integer, pos As Integer
Dim L As Integer, R As Integer, length As Integer, Max As Integer
s = Text1.Text
n = Len(s)
For i = 1 To n
a(i) = Mid(s, i, 1)
Next i
For i = 1 To n
L = i + 1: R = n
Do While L <= R
m = (L + R) \ 2
If Then
L = m + 1
Else
R = m - 1
End If
Loop
If length > Max Then
Max = length : pos = i
End If
i = i + length - 1
Next i
Text2.Text =
End Sub
编写VB程序,实现上述算法。程序功能如下:运行程序时,在列表框List1中显示数组a中的原始数据,并在列表框List2中输出去重后的数组a中的数据,即相同的数据仅保留一个。同时在标签Label1中显示删除的数据总个数,运行效果如图所示,程序代码如下:
Const maxn=10
Dim a(1 To maxn)As Integer
Private Sub Form_Load( )
´maxn个数据在数组a中,并在列表框List1中显示
End Sub
Private Sub Command1_Click( )
Dim i As Integer, n As Integer ‘n用于存储当前查找的数字长度
Dim j As Integer, key As Integer ‘key用于存储本次查找的关键字的数据位置
key=1:n=maxn
Do While key<=n
i=n-1
Do While ‘①
i=i-1
Loop
If i=key Then ‘找到重复数据,删除;未找到,设定下一查找关键字
key=key+1
Else
For j=i To n-1
a(j)=a(j+1)
Next j
n=n-1
End If
Loop
For i= 1To n
List2.AddItem a(i)
Next i
Labell.Caption="共删除重复数据:"&___________&"个"
End Sub
为实现上述功能,小王编写如下VB程序,首先在Text1中输入两个满足条件的序列,数字之间用“,”隔开且以“,”结尾,单击按钮“Cod1”,在Text2中输出最小值所在序列中的位置,程序运行界面如下图所示。
Private Sub Cod1_Click( )
Dim s As String, ch As String
Dim i As Integer, j As Integer, n As Integer, c As Integer
Dim a(100) As Integer
s = Text1.Text: c = 0: n = 0
For i = 1 To Len(s)
ch = Mid(s, i, 1)
If ch >= "0" And ch <= "9" Then
Else
n = n + 1
c = 0
End If
Next i
i = 1: j = n
Do While
m = (i + j) \ 2
If a(m) > a(i) Then
i = m
Else
j = m
End If
Loop
End Sub
a(1) |
a(2) |
a(3) |
a(4) |
a(5) |
a(6) |
a(7) |
a(8) |
a(9) |
a(10) |
1 |
10 |
3 |
8 |
5 |
6 |
7 |
4 |
9 |
2 |
依据对分查找思想,设计一个在数组a中查找数据key的程序,实现该功能的VB程序如下,请回答下列问题:
Private Sub Search_Click()
Const n = 10
Dim a(1 To n) As Integer
Dim i As Integer, j As Integer, m As Integer, f As Boolean, key As Integer
'读取一组正整数,按上述规则存入数组 a 中。代码略
key = Val(Text1.Text)
If key Mod 2 = 1 Then i = 1 Else i = 2
j = n :f = False
Do While i <= j And Not f
If key Mod 2 = 0 Then
m = (i + j) \ 2 - (i + j) \ 2 Mod 2
Else
m = ①
End If
If key = a(m) Then
f = True
ElseIf Then
j = m - 2
Else
i = ②
End If
Loop
If f Then Label1.Caption = Str(m) Else Label1.Caption = "不存在"
End Sub
① ②
key =Int(Rnd()*17+2)
i = 1: j = 9
Do While i <= j
m = (i + j) \ 2
If a(m) <= key Then i = m + 1 Else j = m - 1
Loop
Label1.Caption = str(i)
数组元素a(1)到a(9)的值依次为“2,4,6,8,10,12,14,16,18”,执行上述程序段后,在Label1中显示的内容不可能是( )
key = Val(Text1.Text): cnt=10
For i = 1 To cnt - 1
n = key - a(i)
L = i + 1: R = cnt
Do While L <= R
m = (L + R) \ 2
If a(m) = n Then Exit Do
If a(m) > n Then R = m - 1 Else L = m + 1
Loop
If L <= R Then Text2.Text = Str(key - a(m)) + "," + Str(a(m))
Next i
在数组a(1)~a(10)中存储的数据依次为“1,4,9,16,25,36,49,64,81,100”,在Text1中输入一个不大于200的数,执行该程序后,Text2中显示的内容可能是( )
For i=1 To 15
a(i) = i
Next i
key = Int (Rnd * 20)
i = 1:j=15:n=0
Do While i<=j
m=(i+j+1)\2
If a(m)< key Then i=m +1 Else j=m-1
n=n+1
Loop
执行该程序段后,变量n的值可能是( )
key=
i = 1: j = 10
Do While i <= j
m = (i + j) \ 2
If a(m) < Key Then
i = m + 1: n = n + 1
Else
j = m - 1: n = n - 1
End If
Loop
数组元素a(1)到a(10)的值依次是“2,2,4,6,9,15,15,20,25,30”若n值为2,则key的值可能为( )
arr[M]和待查找数据Key比较
①arr[M]=Key,返回M的值
②若M位置的右侧有序,当待查找数据在右侧,则下次在右侧查找,否则在M左侧查找
③若M位置的左侧有序,当待查找数据在左侧,则下次在左侧查找,否则在M右侧查找
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