有一组数,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 

解决方案 »

  1.   

    Private Sub Command1_Click()
        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
      

  2.   

    a(i) = Val(objSheet.Cells(i, 7)) 这句,说应用程序 
    定义或对象定义问题
      

  3.   

    指出些问题:
    (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) 两个峰值不等同于最大值和第二最大值。峰值应该是大于前一值而小于后一值的那些值。
      

  4.   

    For i = 1 To 99
            a(i) = Val(objSheet.Cells(i, 7))
        Next
    还有,后面的a(0)也要相应的更改
      

  5.   

    晕,定义的类型就是integer,当然了
    改为double
      

  6.   

    Private Sub Command1_Click()
        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
      

  7.   

    ① 修改 sduupc 的代码时的确没留意数组下标的问题
    ② 数据类型 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
      

  8.   

    to Tiger_Zhao:如果正好是 [1~100] 的有序数列,那何来的两个峰值?如果是这样的一个数列: 1,2,3,......,48,49,50,49,48,47,......,22,21,20,21,22,23,......28,29,30,29,28,......
    那请问: 两个峰值是50和49? 还是50和30?
      

  9.   

    to jadeluo:看明白了,是求峰值不是求最大两个值。⑤ 如果出现一个方的峰顶 {...3,8,8,5...} 没有判断出来。
    ⑥ 如果是一段U型曲线 {90,89,88...0...98,99,100},你还是求得 max1 = max2 = 100;所以初始化时还要看两头的升降趋势。
      

  10.   

    不会出现方的峰顶,就是求两个峰值!感谢各位高手!特别感谢tiger 和jadeluo,
    讨论使人进步!向你们学习!
      

  11.   


    我上面的代码也有问题, 这一行:
    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
      

  12.   

    我的在这里面给出的答案有问题吗?>http://topic.csdn.net/u/20080826/21/ec6d9830-13d6-4b94-b59b-fce6376345dc.html
      

  13.   

    jadeluo 在 8 楼的代码:先按 14 楼修正,再将下面两行代码上下交换
                    max1 = a(i)
                    max2 = max1