友情提示:380元/半年,儿童学编程,就上码丁实验室。
VB代码:(2018年9月金华十校)16.【加试题】查找峰值问题:随机生成 n 个正整数(假设 n=20 ,取值范围为 0~100),存储于数组a()中,将这些数按顺序映射在坐标轴上,相邻的数用直线相连,构建了类似于“心电图”的折线:
编写 VB 程序统计所有的峰值(peak)、峰值数量(count)和最高点(high)。实现上述功能的 VB 程序如下,加框处的代码有错误,请改正。
Const n = 20
Dim a(1 To n) As Integer
Private Sub FormLoad()
‘随机生成 n 个数,存储于数组 a 中,并输出在 List1 中。
‘代码略。
End Sub
Private Sub Command1_Click()
Dim count As Integer
Dim high As Integer
Dim peak As Integer
Dim i As Integer,j As Integer
count=0
if a(1)>a(2) then count = 1
high = -1
i = 1
Do While i < n – 1
j = i + 1
If a(j) > a(j – 1) Then
Do While a(j) > a(j – 1)
j = j + 1
Loop
count = count + 1
peak = a(j) ‘①
List2.AddItem “第” + Str(count) + “个峰值: ” + Str(peak)
If peak > high Then high = peak
i = i + 1 ‘②
Else
i = i + 1
End If
Loop
List2.AddItem “共有:” + Str(count) + ” 个峰值”
List2.AddItem “最高点是:” + Str(high)
End Sub
参考答案:
①peak=a(j-1)
②i=j
解析:
①Do while a(j)>=a(j-1)
J=j+1
Loop
通过上述循环,找到当前波段第一个不符合a(j)>=a(j-1)的点,此时J标注的是峰值过后的点,峰值点应该在J-1。
②完成上述循环后,J-1之前的点均已比较过,下一轮从J开始比较即可。
Python代码如下:
a=[80,82,91,63,26,2,1,62,70,64,
47,48,65,53,88,28,39,10,7,37]
n=len(a)
peak=0
count=0
if a[0]>a[1]:
count=1
high=-1
i=0
while i<n-2:
j=i+1
if a[j]>a[j-1]:
while a[j]>a[j-1]:
j=j+1
count=count+1
peak=a[j-1]
print(‘第’+str(count)+’个峰值’+str(peak))
if peak>high:
high=peak
i=j
else:
i=i+1
print(‘共有’+str(count)+’个峰值’)
print(‘最高点是:’+str(high))
Python代码运行结果如下: