宾馆的参会者分开接送,同一宾馆的参会者可同乘一辆车,每辆车最多接送v人,每个参会者的等待时间都不超过w分钟。参会者入住的宾馆和到达上车点的时间用长度为7 的字符串表示,例如“A-09:15”表示参会者当天入住A宾馆,9点15分到达上车点,如果w为 10,那么该参会者最晚9点25分出发去宾馆。
编写VB程序,统计接送n个参会者所需的最少车辆数。运行程序,列表框List1中按入住宾馆分组显示所有参会者提交的信息,同一宾馆的按时间先后排列。单击“统计”按钮Command1,在文本框 Text1中显示所需的最少车辆数。程序运行界面如第16题图所示。
(1)如图所示,如果每辆车最多接送4人,每个参会者的等待时间不超过10分钟,接送所有到A宾馆
的参会者最少需要 辆车。
(2)实现上述功能的部分VB程序如下,请在划线处填入合适的代码。
'n、v、w是常量
'n为参会人数,v为每辆车最多接送人数,w为参会者最长的等待时间,代码略
Private Sub Form_Load()
'读取n个参会者提交的信息,依次存入a(1)~a(n)
'将a(1)~a(n)按入住宾馆分组,同一宾馆参会者按时间先后排序
'并在List1中显示,代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer, sum As Integer
a(n + 1) = ""
j= 1 : sum = 0
For i = 2 To n + 1
If Mid(a(i), 1, 1) <> Mid(a(j),1, 1) Then
①
j= i
End If
Next i
Text1.Text = Str(sum)
End Sub
Function getDif(tsl As String, ts2 As String) As Integer
'返回ts1到ts2的时长(单位:分钟),代码略
'例如ts1为"08:30",ts2为"08:35",则返回的函数值为5
End Function
Function getCnt(first As Integer, last As Integer) As Integer
Dim s1 As String, s2 As String
Dim i As Integer, p As Integer, k As Integer,t As Integer
p = first : k = 1
s1 = Mid(a(first), 3, 5)
For i = first + 1 To last
s2 = Mid(a(i), 3, 5)
t= getDif(s1, s2)
If ② Then
k=k +1
p = i
③
End If
Next i
getCnt = k
End Function
【答案】
(1)3 (2) ①sum=sum+getCnt(j,i-1) 或其他等价 答案 ②i-p+1>v Or t>w 或 i-p=v Or t>w 或i-p>=v Or t>w 或其他等价答案 ③s1=s2 或 s1=Mid(a(i),3,5) 或 s1=Mid(a(p),3,5) 或其他等价答案
【本题解析】
本题考查VB基本语句、数组、自定义函数定义和调用等知识。
去A宾馆的第1个参会者到达指定上车地点的时间为08:03,第2个参会者的到达时间为08:38,两者时间超出10分钟,故第1个人单独乘坐一辆车。第3、4、5个参会者的到达时间和第2个参会者的到达时间之差小于10,故第2~5人合乘一辆车,第6人单独乘一辆车,故最少需3辆车。
遍历参会者提交的信息,即数组a,若当前提交信息中的宾馆和前一相邻信息中的宾馆不同,则表示一个同一宾馆的记录已经遍历完毕,j指向该宾馆第一个参会者,i-1指向该宾馆最后一个参会者,调用自定义函数getCnt计算从第j到第i-1个参会者所需的车辆数,累加到sum中,j再调整为i,即指向下一宾馆的第一个参会者,故①处代码为“sum=sum+getCnt(j,i-1)”。
p指向去某宾馆的第一个参会者,提取该参会者到达指定上车地点的时间存s1,从下一个参会者开始逐个往后遍历,提取当前参会者到达指定上车地点的时间存s2,调用自定义函数getDif(s1,s2)计算这两人到达上车地点的时间差存t,若t大于w,即去该宾馆的第一个上车人的等待时间大于w,则需开新的一辆车子;或该车辆已满,即从第p到第i参会者的人数大于v,也需开新的一辆车子,故②处代码为“t>w Or i-p+1>v”或“t>w Or i-p=v”。车子数量k加1,p调整为i,指向新车辆的第一个上车的人,s1调整为s2,记录该车第一个人的上车时间,故③处代码为“s1=s2”或“s1=Mid(a(i),3,5)”或“s1=Mid(a(p),3,5)”。