专项测试十 区间问题
1.进入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中,并显示在列表框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)
Text3.Text = Str(max)
End Sub
解析 本题主要考查的是程序的综合能力。本程序的功能是统计满足条件的连续区间范围,变量ncount用来统计温度大于tjqw的连续天数,ntempend用来记录温度连续大于tjqw的序号,变量max用来记录温度大于tjqw的最长连续天数,nend用来记录温度大于tjqw的最长连续天数的最后一天位置,因此①处代码为qw(i) >= tjqw,②处代码为nend = ntempend。最长连续天数为max,结束日期为rq(nend),则开始日期为rq(nend - max + 1)。
答案 ①qw(i) >= tjqw ②nend = ntempend ③rq(nend - max + 1)
2.小明编写了一个有关合并区间的VB程序,功能如下:窗体加载时,获取并存储合并前的区间数据,并显示在左边的列表框中;单击“合并区间”按钮Command1,程序以区间左端点数值对区间进行升序排序,然后按相邻区间的相交情况进行合并,最后将合并后的区间信息显示在右边的列表框中。程序运行界面如图所示。
(1)合并前区间为“[1,10],[5,15],[8,12],[16,30],[35,50]”,则合并后的区间为______________。
(2)实现上述功能的VB程序如下,请在程序划线处填入合适的代码。
Dim a(1 To 20) As Integer ′存储区间左端点
Dim b(1 To 20) As Integer ′存储区间右端点
Dim n As Integer
Private Sub Form_Load()
′获取n个合并前区间数据
′将区间左端点存入a数组,区间右端点存入b数组,并在列表框List1中显示
′代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer, left As Integer, right As Integer
Dim k As Integer, temp1 As Integer, temp2 As Integer
For i = 1 To n - 1
k = i
For j = n To i + 1 Step -1
If ______①______ Then k = j
Next j
If i < > k Then
temp1 = a(k): a(k) = a(i): a(i) = temp1
temp2 = b(k): b(k) = b(i): b(i) = temp2
End If
Next i
left = a(1)
right = b(1)
For i = 2 To n
If a(i) <= right Then
If ______②________ Then right = b(i)
Else
List2.AddItem “[“ + Str(left) + ”,“ + Str(right) + ”]”
left = a(i)
________③________
End If
Next i
List2.AddItem “[“ + Str(left) + ”,” +
Str(right) + ”]”
End Sub
解析 本题主要考查的是程序的综合能力。(1)本小题主要是区间合并的实际应用,合并后的区间为“[1,30],[35,50]”。(2)本题程序的功能是进行区间合并,首先使用选择排序算法对区间按左端点升序排序,因此①处代码为a(k) > a(j);然后根据相邻区间的左右端点情况进行合并操作,根据代码“right = b(i)”可知,当前面区间的右端点小于当前区间的右端点时(即right < b(i)),则合并后的区间右端点为当前区间的右端点;当a(i) >right时,表示相邻两个区间无相交关系,因此区间的左端点left=a(i),右端点right=b(i)。
答案 (1)[1,30],[35,50] (2)①a(k) > a(j) ②right < b(i) ③right = b(i)
3.为分析数组a中各元素依次变化的情况,进行如下定义:
?变化段:数组中相邻两个元素构成一个变化段。变化段有上升段(a(i)>a(i-1))、下降段(a(i)
?波峰:从上升段转到下降段形成一个波峰。波峰的起点是峰顶前所有连续上升段中的第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
解析 本题主要考查的是学生对程序的综合能力。本题的本质是区间问题,1个波峰可以看作是一个区间,如果此区间内的升序段和降序段数据个数相等,即为对称波峰。(1)数组元素为“1,4,3,3,2,6,8,7,9,3,4,7,9,6,3,1”时,“1,4,3”、“7,9,3”、“3,4,7,9,6,3,1”为对称波峰,因此共有3个;(2)根据语句“If a(i) > a(i - 1) Then”可知,当前i位置上的数据与它前面的数据进行比较,第一对比较的数据为a(2)与a(1),因此i的初值为2;自定义函数IsSymPeak的功能是判断当前波峰是否为对称波峰,若是则IsSymPeak=True,若不是则IsSymPeak=False。一个波峰为对称波峰的条件是:一个波峰结束前处于下降状态((a(i)>a(i-1)表示结束),step=-1表示下降状态),且上升段和下降段数据相等(即step=0),因此③处代码为flag = -1 And steps = 0;当 “a(i) > a(i - 1)”且“flag = 0 Or flag = -1”时(变化段的状态为下降或持平),则表示一个波峰结束,即下一个波峰开始,因此steps = 1。
答案 (1)3 (2)①2 ②steps = 1 ③flag = -1 And steps = 0
4.回收存储空间。设在内存中经存放了A、B、C、D四个任务,其余的空间为可用的,如图a所示。
可用空间的信息如表一所示。用一维数组dz和Leng表示,其中dz(i)对应第i个可用空间的开始地址(左列数据),Leng(i)对应第i个可用空间的长度(右列数据)。
现某个任务释放一个区域,其开始地址为xdz,长度为xL,现要求将释放区域加入到可用空间表中。要求在加入时,若与可用空间相邻时,则必须进行合并,如图b。合并方法如下:
1)向下合并,即回收区域和下面可用空间相邻。例如,xdz=80,xL=20,此时合并后的数据如表二中的(a)。
2)向上合并,即回收区域和上面可用空间相邻。例如,xdz=600,xL=50,此时合并后的数据如表二中的(b)。
3)上下合并,即回收区域和上面、下面可用空间都相邻。例如,xdz=150,xL=150,此时合并后的数据如表二中的(c)。
4)不合并,即回收区域和上面、下面可用空间都不相邻。例如,xdz=430,xL=20,此时增加释放区域后的数据如表二中的(d)。
小赵编写了一个回收内存空间的VB程序,功能如下:窗体加载时,自动读取每段可用空间的信息,每段可用空间的开始地址和长度分别存储在数组元素dz(1)、dz(2)…和leng(1)、leng(2)…中,可用空间的段数存储在变量n中,原可用空间信息显示在列表框List1中。单击“回收”按钮Command1,程序对任务中释放的区域进行回收处理,回收后的可用空间信息显示在列表框List2中。程序运行界面如图c所示。
(1)如果释放区域的开始地址为450,长度为50,则合并方法为________(填:向上合并/向下合并/上下合并/不合并)。
(2)实现上述功能的VB程序如下。请在划线处填入合适代码。
程序说明:对数组dz和leng预置2个标志,即头和尾标志,如表一(b)所示。
Dim dz(0 To 100) As Integer, leng(0 To 100) As Integer
Private Sub Form_Load()
′读取原可用空间信息,其中开始地址存储在一维数组dz中,长度存储在数组leng中
′将原可用空间信息显示在列表框List1中
End Sub
Private Sub Command1_Click()
Dim xdz As Integer, xcd As Integer, i As Integer, j As Integer, x As Integer
List2.Clear
xdz = Val(Text1.Text):xl = Val(Text2.Text)
i = 1
n = 4
Do While dz(i) < xdz
i = i + 1
Loop
i = i - 1
If dz(i) + leng(i) = xdz Then
If xdz + xl = dz(i + 1) Then ′第3种情况
leng(i) = ________①________
For j = i + 1 To n - 1
dz(j) = dz(j + 1): l(j) = leng(j + 1)
Next j
n = n - 1
Else ′第2种情况
leng(i) = leng(i) + xl
End If
ElseIf (xdz + xl) = dz(i + 1) Then ′第1种情况
dz(i + 1) = xdz
leng(i + 1) = leng(i + 1) + xl
Else ′第4种情况
For j = n To i + 1 Step -1
dz(j + 1) = dz(j):________②________
Next j
________③________
leng(i + 1) = xl
n = n + 1
End If
For i = 0 To n
List2.AddItem Str(dz(i)) + Str(leng(i))
Next i
End Sub
解析 本题主要考查学生的算法综合应用能力。(1)因为释放区域的开始地址为450,长度为50,该区域释放后将与下面的空闲区域相连(开始地址500,长度100),因此采用向下合并的方法;(2)①处代码表示第3种情况,即上下合并,合并后的总长度为上面空闲区域长度+下面空闲区域长度+释放区域长度,因此①处填入的代码为leng(i) + leng(i + 1) + xl;②处代码表示第4种情况,即不合并,处理办法是先把后i+1个空闲区域的开始地址和长度后移一个位置,因此②处代码为leng(j + 1) = leng(j),然后把释放的区域信息存储在第i+1个位置上,因此③处代码为dz(i + 1) = xdz,表示存储释放区域的开始地址。
答案 (1)向下合并 (2)①leng(i) + leng(i + 1) + xl ②leng(j + 1) = leng(j) ③dz(i + 1) = xdz
专项测试十 区间问题
1.进入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中,并显示在列表框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)
Text3.Text = Str(max)
End Sub
2.小明编写了一个有关合并区间的VB程序,功能如下:窗体加载时,获取并存储合并前的区间数据,并显示在左边的列表框中;单击“合并区间”按钮Command1,程序以区间左端点数值对区间进行升序排序,然后按相邻区间的相交情况进行合并,最后将合并后的区间信息显示在右边的列表框中。程序运行界面如图所示。
(1)合并前区间为“[1,10],[5,15],[8,12],[16,30],[35,50]”,则合并后的区间为______________。
(2)实现上述功能的VB程序如下,请在程序划线处填入合适的代码。
Dim a(1 To 20) As Integer ′存储区间左端点
Dim b(1 To 20) As Integer ′存储区间右端点
Dim n As Integer
Private Sub Form_Load()
′获取n个合并前区间数据
′将区间左端点存入a数组,区间右端点存入b数组,并在列表框List1中显示
′代码略
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer, left As Integer, right As Integer
Dim k As Integer, temp1 As Integer, temp2 As Integer
For i = 1 To n - 1
k = i
For j = n To i + 1 Step -1
If ______①______ Then k = j
Next j
If i < > k Then
temp1 = a(k): a(k) = a(i): a(i) = temp1
temp2 = b(k): b(k) = b(i): b(i) = temp2
End If
Next i
left = a(1)
right = b(1)
For i = 2 To n
If a(i) <= right Then
If ______②________ Then right = b(i)
Else
List2.AddItem “[“ + Str(left) + ”,“ + Str(right) + ”]”
left = a(i)
________③________
End If
Next i
List2.AddItem “[“ + Str(left) + ”,” +
Str(right) + ”]”
End Sub
3.为分析数组a中各元素依次变化的情况,进行如下定义:
?变化段:数组中相邻两个元素构成一个变化段。变化段有上升段(a(i)>a(i-1))、下降段(a(i)?波峰:从上升段转到下降段形成一个波峰。波峰的起点是峰顶前所有连续上升段中的第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
4.回收存储空间。设在内存中经存放了A、B、C、D四个任务,其余的空间为可用的,如图a所示。
可用空间的信息如表一所示。用一维数组dz和Leng表示,其中dz(i)对应第i个可用空间的开始地址(左列数据),Leng(i)对应第i个可用空间的长度(右列数据)。
现某个任务释放一个区域,其开始地址为xdz,长度为xL,现要求将释放区域加入到可用空间表中。要求在加入时,若与可用空间相邻时,则必须进行合并,如图b。合并方法如下:
1)向下合并,即回收区域和下面可用空间相邻。例如,xdz=80,xL=20,此时合并后的数据如表二中的(a)。
2)向上合并,即回收区域和上面可用空间相邻。例如,xdz=600,xL=50,此时合并后的数据如表二中的(b)。
3)上下合并,即回收区域和上面、下面可用空间都相邻。例如,xdz=150,xL=150,此时合并后的数据如表二中的(c)。
4)不合并,即回收区域和上面、下面可用空间都不相邻。例如,xdz=430,xL=20,此时增加释放区域后的数据如表二中的(d)。
小赵编写了一个回收内存空间的VB程序,功能如下:窗体加载时,自动读取每段可用空间的信息,每段可用空间的开始地址和长度分别存储在数组元素dz(1)、dz(2)…和leng(1)、leng(2)…中,可用空间的段数存储在变量n中,原可用空间信息显示在列表框List1中。单击“回收”按钮Command1,程序对任务中释放的区域进行回收处理,回收后的可用空间信息显示在列表框List2中。程序运行界面如图c所示。
(1)如果释放区域的开始地址为450,长度为50,则合并方法为________(填:向上合并/向下合并/上下合并/不合并)。
(2)实现上述功能的VB程序如下。请在划线处填入合适代码。
程序说明:对数组dz和leng预置2个标志,即头和尾标志,如表一(b)所示。
Dim dz(0 To 100) As Integer, leng(0 To 100) As Integer
Private Sub Form_Load()
′读取原可用空间信息,其中开始地址存储在一维数组dz中,长度存储在数组leng中
′将原可用空间信息显示在列表框List1中
End Sub
Private Sub Command1_Click()
Dim xdz As Integer, xcd As Integer, i As Integer, j As Integer, x As Integer
List2.Clear
xdz = Val(Text1.Text):xl = Val(Text2.Text)
i = 1
n = 4
Do While dz(i) < xdz
i = i + 1
Loop
i = i - 1
If dz(i) + leng(i) = xdz Then
If xdz + xl = dz(i + 1) Then ′第3种情况
leng(i) = ________①________
For j = i + 1 To n - 1
dz(j) = dz(j + 1): l(j) = leng(j + 1)
Next j
n = n - 1
Else ′第2种情况
leng(i) = leng(i) + xl
End If
ElseIf (xdz + xl) = dz(i + 1) Then ′第1种情况
dz(i + 1) = xdz
leng(i + 1) = leng(i + 1) + xl
Else ′第4种情况
For j = n To i + 1 Step -1
dz(j + 1) = dz(j):________②________
Next j
________③________
leng(i + 1) = xl
n = n + 1
End If
For i = 0 To n
List2.AddItem Str(dz(i)) + Str(leng(i))
Next i
End Sub