题库 高中信息

题干

挤牛奶问题:如有三个农民每天清晨5点起床,然后去牛棚分别给3头牛挤奶。第一个农民在300时刻(从5点开始计时,秒为单位)给他的牛挤奶,一直到1000时刻(总共挤了700个时刻),第二个农民在700时刻开始,在1200时刻结束(总共挤了500个时刻)。第三个农民在1500时刻开始2100时刻结束(总共挤了600个时刻)。期间最长挤奶的连续时间为900秒(从300时刻到1200时刻),而最长的无人挤奶的连续时间为300时刻(因第二个农民在1200时刻已结束,而第三个农民从1500时刻才开始,中间有300时刻没有人在挤牛奶)。相应时刻如下图所示:

下面提供的程序是,从N个农民(1<N<=5000)挤N头牛的工作时间列表,计算出最长有人在挤牛奶的时间段与最长的无人挤牛奶的时间段。
下图为两组不同数据程序运行后界面;

请在划线处填入相应的代码,使程序功能完善。
Dim a(1 To 100) As Integer '存放农民挤牛奶开始时刻
Dim b(1 To 100) As Integer '存放农民挤牛奶结束时刻
Dim n As Integer '存放农民人数
Private Sub Form_Load()
‘获取农民的人数与各个农民开始挤牛奶与结束挤牛奶的时间,并在list1中输出
‘相应的代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer
Dim t As Integer, ymax As Integer, nmax As Integer
Dim btime As Integer, etime As Integer, flag As Boolean
flag = True: i = 1
Do While i <= ________And flag
flag = False
For j = 1 To n - i
If a(j) > a(j + 1) Then
t = a(j): a(j) = a(j + 1): a(j + 1) = t
t = b(j): b(j) = b(j + 1): b(j + 1) = t
flag = True
End If
Next j
i = i + 1
Loop
btime = a(1): etime = b(1)
ymax = etime - btime: nmax = 0
For i = 2 To n
If _______________________________Then
etime = b(i)
If etime - btime > ymax Then ymax = etime - btime
ElseIf etime < a(i) Then
If a(i) - etime > nmax Then nmax = a(i) - etime
btime = a(i): etime = b(i)
End If
Next i
Label2.Caption = "最长挤牛奶时间为:" + Str(ymax) + " 时刻"
Label3.Caption = "最长无人挤牛奶时间为:" + Str(nmax) + " 时刻"
End Sub
上一题 下一题 0.99难度 填空题 更新时间:2019-04-17 09:08:51

答案(点此获取答案解析)

同类题1

为分析数组a中各元素依次变化的情况,进行如下定义:
变化段:数组中相邻两个元素构成一个变化段。变化段有上升段(a(i)>a(i-1))、下降段(a(i)<a(i-1))和持平段(a(i)=a(i-1))。数组a中的n个元素可构成n-1个依次排列的变化段。
波峰:从上升段转到下降段形成一个波峰。波峰的起点是峰顶前所有连续上升段中的第1个,终点是峰顶后所有连续下降段中的最后1个。
对称波峰:上升段与下降段个数相同的波峰称为对称波峰。
下图为一组数据的变化段及波峰示意图。

现要求统计数组a各元素依次变化过程中“对称波峰”的个数。小李依据上述描述设计如下VB程序。请回答下列问题:
(1)数组元素“1,4,3,3,2,6,8,7,9,3,4,7,9,6,3,1”依次变化过程中“对称波峰”的个数为_____。
(2)请在划线处填入合适的代码。
Const n = 20
Dim a(1 To n) As Integer
Private Sub Form_Load()
'读取数据,并存储到数组a中,代码略
End Sub
Private Sub Command1_Click()

Dim flag As Integer  '存储变化段的状态:1表示升,-1表示降,0表示平

Dim count As Integer '存储对称波峰段的个数

Dim steps As Integer

Dim i As Integer

flag = 0: steps = 0: count = 0

For i = ________ To n

If a(i) > a(i - 1) Then

If IsSymPeak(flag, steps) Then count = count + 1

If flag = 0 Or flag = -1 Then

_________

Else

steps = steps + 1

End If

flag = 1

ElseIf a(i) = a(i - 1) Then

If IsSymPeak(flag, steps) Then count = count + 1

steps = 0

flag = 0

Else

  steps = steps - 1

flag = -1

End If

Next i

If IsSymPeak(flag, steps) Then count = count + 1

Text1.Text = Str(count)

End Sub
Function IsSymPeak(flag As Integer, steps As Integer) As Boolean

If __________________ Then

IsSymPeak = True

Else

IsSymPeak = False

End If

End Function

同类题2

编写矩阵乘法的VB程序。矩阵是由m×n个元素数排列而成,例如m*n矩阵是由m行n列数据排列而成。若A矩阵是m×s个元素,B矩阵是s×n个元素,将A矩阵乘以B矩阵得到C矩阵,C矩阵是m×n个元素。

计算方法:矩阵A的第i行s个元素(i,1),(i,2),…,(i,s)和矩阵B的第j列s个元素(1,j),(2,j),…,(s,j)对应相乘后相加,就得到乘积矩阵C的第i行第j列元素,即(i,j)值=(i,1)的值×(1,j)的值+(i,2)的值×(2,j)的值+…+(i,s)的值×(s,j)的值。

例如:A矩阵3×5个元素,B矩阵5×2个元素相乘后得到3×2的C矩阵,如图1所示。其中c(5)=a(11)×b(1)+a(12)×b(3)+a(13)×b(5)+a(14)×b(7)+a(15)×b(9)。

3×5矩阵A

(由数组a存储)

a(1) a(2)   a(3)   a(4)   a(5)

a(6)   a(7) a(8)   a(9)   a(10)

a(11)  a(12)  a(13) a(14) a(15)

×

5×2矩阵B

(由数组b存储)

b(1) b(2)

b(3) b(4)

b(5) b(6)

b(7) b(8)

b(9) b(10)

=

乘积矩阵C

(由数组c存储)

c(1) c(2)

c(3)    c(4)

c(5)    c(6)

图1

 

 

 

 

(1)如下图所示,矩阵A×矩阵B的乘积矩阵C的第2行第3列的值为_________。
矩阵A
矩阵B
 

1   0

2   1

4   0

 

 

2  4  1

5  1  3

 

 
(2)根据上述矩阵乘法规则,小明设计了一个求矩阵A、B的乘积矩阵C的程序,代码如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
Const max = 10
Dim a(1 To max * max) As Integer ’ 存储m×s矩阵A的各元素
Dim b(1 To max * max) As Integer ’ 存储s×n矩阵B的各元素
Dim c(1 To max * max) As Integer ’ 存储乘积矩阵C的各元素
Dim m As Integer, s As Integer, n As Integer, i As Integer, strline As String
m=3:    n=2:   s=5
’从左向右、由上往下依次将矩阵A和矩阵B的各元素存储于数组a和数组b中,代码略
For i = 1 To_________
strline = “”
For j = 1 To n
c ((i - 1) * n + j) = 0
For k = 1 To _________
c((i - 1) * n + j)=c ((i - 1) * n + j)+a((i - 1) * s + k) * b__________)
Next k
strline = strline + Str(c((i - 1) * n + j))
Next j
List3. AddItem strline

Next i

End Sub