有一组数,100个,放在excel2003的第一列里,有两个峰值,想把这两个峰值找出来,放在text1和text2里,这是我编的,
总是有问题,希望高手给改改!或者类似的新编一个!
Private Sub Command1_Click()
Dim a(1 To 100) As Integer
Dim i As Integer
Dim max1, max2 As Integer
'引用excel部分略去了For i = 0 To 99
a(i) = Val(objSheet.Cells(i, 7))
max1 = a(0)
Next
For i = LBound(a) To UBound(a) If max1 < Val(a(i)) Then max1 = a(i)
Next
Text1.Text = max1
If max1 = Val(a(0)) Then max2 = Val(a(1)) Else max2 = Val(a(0))
For i = LBound(a) To UBound(a)
If Val(a(i)) <> max1 And max2 < Val(a(i)) Then max2 = a(i)
Next
Text2.Text = max2
End Sub
总是有问题,希望高手给改改!或者类似的新编一个!
Private Sub Command1_Click()
Dim a(1 To 100) As Integer
Dim i As Integer
Dim max1, max2 As Integer
'引用excel部分略去了For i = 0 To 99
a(i) = Val(objSheet.Cells(i, 7))
max1 = a(0)
Next
For i = LBound(a) To UBound(a) If max1 < Val(a(i)) Then max1 = a(i)
Next
Text1.Text = max1
If max1 = Val(a(0)) Then max2 = Val(a(1)) Else max2 = Val(a(0))
For i = LBound(a) To UBound(a)
If Val(a(i)) <> max1 And max2 < Val(a(i)) Then max2 = a(i)
Next
Text2.Text = max2
End Sub
Dim a(1 To 100) As Integer
Dim i As Integer
Dim max1 As Integer, max2 As Integer 'Dim 中每个变量都应该单独声明
'... For i = 0 To 99
a(i) = Val(objSheet.Cells(i, 7))
Next
'max1 最大,max2 次大
If a(0) >= a(1) Then
max1 = a(0)
max2 = a(1)
Else
max1 = a(1)
max2 = a(2)
End If
For i = 2 To UBound(a)
If a(i) > max1 Then
max1 = a(i)
max2 = max1
ElseIf a(i) > max2 Then
max2 = a(i)
End If
Next
Text1.Text = max1
Text2.Text = max2
End Sub
定义或对象定义问题
(1) 数组a的下标范围, 申明时与使用时不一致:
Dim a(1 To 100) As Integer '申明时是1到100
......
For i = 0 To 99 '使用时是0到99
a(i) = Val(objSheet.Cells(i, 7))
Next (2) Dim max1, max2 As Integer 这样申明是有问题的,max1将是Variant类型变量而不是Integer类型(3) 两个峰值不等同于最大值和第二最大值。峰值应该是大于前一值而小于后一值的那些值。
a(i) = Val(objSheet.Cells(i, 7))
Next
还有,后面的a(0)也要相应的更改
改为double
Dim a(1 To 100) As Double
Dim i As Integer
Dim max1 As Double, max2 As Double
'... For i = 1 To 100
a(i) = Val(objSheet.Cells(i, 7))
Next
If a(1) > a(100) Then
max1 = a(1)
max2 = a(1)
Else
max1 = a(100)
max2 = a(100)
End If For i = 2 To 99
If (a(i) > a(i - 1)) And (a(i) < a(i + 1)) Then
If a(i) > max1 Then
max1 = a(i)
max2 = max1
ElseIf a(i) > max2 Then
max2 = a(i)
End If
End If
Next i
Text1.Text = max1
Text2.Text = max2
End Sub
② 数据类型 sduupc 没说清楚
③ 在出现新的最大值的时候赋值次序错了
④ to jadeluo: 修正代码我没意见,但是丢了程序的目的——如果正好是 [1~100] 的有序数列,即使修正了 ③ 中提到的错误,你的结果还是 max1 = max2 = 100。
自己修正,并且 max1、max2 的初始化部分写得更清楚点
Private Sub Command1_Click()
Dim a(1 To 100) As Double
Dim i As Long
Dim max1 As Double, max2 As Double
'... For i = 1 To 100
a(i) = Val(objSheet.Cells(i, 7))
Next
'max1 最大,max2 次大
max1 = IIf(a(1) >= a(2), a(1), a(2)) '= Max(a(1), a(2))
max2 = IIf(a(1) >= a(2), a(2), a(1)) '= Min(a(1), a(2))
For i = 3 To UBound(a)
If a(i) > max1 Then '出现新最大,原最大降为次大
max2 = max1
max1 = a(i)
ElseIf a(i) > max2 Then '出现新次大,直接提到原次大
max2 = a(i)
End If
Next
Text1.Text = max1
Text2.Text = max2
End Sub
那请问: 两个峰值是50和49? 还是50和30?
⑥ 如果是一段U型曲线 {90,89,88...0...98,99,100},你还是求得 max1 = max2 = 100;所以初始化时还要看两头的升降趋势。
讨论使人进步!向你们学习!
我上面的代码也有问题, 这一行:
If (a(i) > a(i - 1)) And (a(i) < a(i + 1)) Then改成这样:
If (a(i) > a(i - 1)) And (a(i) > a(i + 1)) Then
max1 = a(i)
max2 = max1