当前位置:编程学习 > VB >>

用VB找出一段最大值和最小值

序号      数字
1 531
2 545
3 321
4 211
5 121
6 10
7 10
8 9
9 110
10 1285
11 213
12 22
13 19
14 18
15 12
16 1
17 52
18 66
19 73
找出每段最大最小值应如下
序号      序号
1 531
2 545
6 10
8 9
10 1285
16 1
19 73
--------------------编程问答-------------------- 锅先联系下我的语文老师,要他来看看…… --------------------编程问答-------------------- Dim b As Boolean 'True means inc and false means dec
Dim a(1 To 19) As Integer
Dim i As Integer
a(1) = 531
a(2) = 545
...
a(19) = 73
Print 1, a(1)
If a(2) > a(1) b = False Else b = True
For i = 2 To 19    
    If (a(i) > a(i - 1)) <> b Then Print i, a(i)
Next i
--------------------编程问答-------------------- 修改下
For i = 2 To 19    
    If (a(i) > a(i - 1)) <> b Then Print i, a(i) : b = Not(b)
Next i --------------------编程问答--------------------
引用 1 楼 yiguangqiang88 的回复:
锅先联系下我的语文老师,要他来看看……

同意 --------------------编程问答--------------------

Option Explicit

Private Sub Command1_Click()
Dim intMax As Integer, intMin As Integer, n As Integer
Dim strLine As String, strItems() As String

intMax = 0
intMin = 32767

Open "c:\3.txt" For Input As #1
Do Until EOF(1)
    Line Input #1, strLine
    strItems = Split(strLine, " ")
    
    If UBound(strItems) = 1 Then
        n = Val(strItems(1))
        If n > intMax Then
            intMax = n
            Debug.Print strLine
        Else
            If n < intMin Then
                intMin = n
                Debug.Print strLine
            End If
        End If
    End If
Loop
Close #1
End Sub

结果:
1 531
2 545
3 321
4 211
5 121
6 10
8 9
10 1285
16 1
--------------------编程问答--------------------
引用 1 楼 yiguangqiang88 的回复:
锅先联系下我的语文老师,要他来看看……


楼主是要输出当前最大和最小值。 --------------------编程问答-------------------- 把这些数据整进数组,然后再排个序就OK了
--------------------编程问答-------------------- 不是这个意思。楼主的需求是当数据逐条增加时,求这一时刻的最大和最小值:

数据编号 最大值 最小值
1       531   531
2       545   531
3       545   321
4       545   211
5       545   122
6       545   10
7       545   10
8       545   9
9       545   9
10     1285   9
11     1285   1    

当最大最小值改变时,打印改变的数值。 --------------------编程问答-------------------- 是这样判断 以第一个为准 判断下面的数字是升还是降,是升要找到最高点数字,如1号 531 到 2号 545 是 2号 545是顶点 ,保留期最低点和最高点,中间其舍去。如下降从2号 545 到8号 9 为降,保留最高点和最低点,因2号 545 是最高点了保留了,只保留最低点,8号 9 中间其舍去,以此类推……规律找出升的那段最高最低,降的那段最高和最低 --------------------编程问答-------------------- 都理解错了,人家是要找反转点.
先设定一个上升或下降的标示 Flag=1(0)上升或下降
按顺序读取数据,当前数据与前一个数据进行比较.
if not(flag Xor number(Now)>number(Now-1)) then
   Read Number(Now+1)
else
   print Number(Now)
end if --------------------编程问答--------------------
结果是一样的。 --------------------编程问答--------------------
或者说,是将你的实际应用需求转化成数学逻辑表达。 --------------------编程问答--------------------

'这段代码是主要.
    If (Flag Xor CDbl((strItems(1)) > CDbl(BakNumber))) Then
       Me.Print BakNumber
       Flag = Not Flag
    Else
       BakNumber = strItems(1)
    End If
--------------------编程问答--------------------

'将你的代码改了一下,这样输出的结果与你的结果不一致,这个应该是LZ想要的吧.

Option Explicit

Private Sub Command1_Click()
Dim intMax As Integer, intMin As Integer, n As Integer
Dim strLine As String, strItems() As String

intMax = 0
intMin = 32767
Dim Flag As Boolean
Flag = True
Dim BakNumber As Double
BakNumber = -1
Open "c:\3.txt" For Input As #1
Line Input #1, strLine
strItems = Split(strLine, " ")
Me.Print strItems(1)
Do Until EOF(1)
    Line Input #1, strLine
    strItems = Split(strLine, " ")
    If (Flag Xor CDbl((strItems(1)) > CDbl(BakNumber))) Then
       Me.Print BakNumber
       Flag = Not Flag
    Else
       BakNumber = strItems(1)
    End If
Loop
   Me.Print strItems(1)
Close #1
End Sub
--------------------编程问答--------------------
引用 6 楼 of123 的回复:
Quote: 引用 1 楼 yiguangqiang88 的回复:

锅先联系下我的语文老师,要他来看看……


楼主是要输出当前最大和最小值。
佩服理解能力。说实话,1楼的还真没办法理解到这一地步…… --------------------编程问答-------------------- 是VB6中吗? --------------------编程问答-------------------- 1 531 
2 545 
3 321 
4 211
5 121 
6 10 
8 9 
10 1285 
16 1
谢谢5楼代码 但是开始数字逐渐下降 应该把中间部分取消,保留上升过程或者下降的过程 开始和结尾数字  --------------------编程问答-------------------- 谢谢14楼的代码 管用 能否注释一下 我想把它扩展一下 --------------------编程问答--------------------


'先说一下此方法的理论.
'先设定此时数据是上升的(Flag=True 上升 Flag=False 下降).
'如果前一个数据与当前数相比,如果后一个数据比前一个数据大,那表示还在上升,接着读下一个数据.
'如果前一个数据与当前数相比,如果后一个数据比前一个数据小,那表示现在较入下降. flag=Flse,并且读出转入下降时的数据(即反转点)

Option Explicit

Private Sub Command1_Click()
Dim intMax As Integer, intMin As Integer, n As Integer
Dim strLine As String, strItems() As String

intMax = 0
intMin = 32767
Dim Flag As Boolean
Flag = True
Dim BakNumber As Double'保存已读出的前一个数据.用于与当前读出的数据进行比较

Open "c:\3.txt" For Input As #1
Line Input #1, strLine
strItems = Split(strLine, " ")
Me.Print strItems(1)   '先读取第一个数据,将此数据写出.
BakNumber = strItems(1) '当前数据放入Baknumber中用于下一轮比较
Do Until EOF(1)  '循环读取文本文件中的数据
    Line Input #1, strLine   
    strItems = Split(strLine, " ")
    If (Flag Xor CDbl((strItems(1)) > CDbl(BakNumber))) Then '此处为从第二个数据开始与前一个数据进行比较. 此处采用 xor 运算,表示如果 flag是True 而 当前数据与前一个数据比较是flase 或 flag是Flase而当前数据与前一个数据比较是True(即进行了反转)
       Me.Print BakNumber  ' 读出反转前的那个点,即反转点
        BakNumber = strItems(1) '将当前数据放入 baknumber用于下一轮比较
       Flag = Not Flag  '上升下降标志进行 not 运算,表示数据进入相反运行通道
    Else
       BakNumber = strItems(1) '如果在上升或下降通道中,将当前数据放入Baknumber中用于下一轮比较
    End If
Loop
   Me.Print strItems(1) '读出最后一个数据
Close #1
End Sub


补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,