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

yww595595 2013-07-13 09:36:45
序号 数字
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
...全文
1202 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复


'先说一下此方法的理论.
'先设定此时数据是上升的(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


yww595595 2013-07-25
  • 打赏
  • 举报
回复
谢谢14楼的代码 管用 能否注释一下 我想把它扩展一下
yww595595 2013-07-25
  • 打赏
  • 举报
回复
1 531 2 545 3 321 4 211 5 121 6 10 8 9 10 1285 16 1 谢谢5楼代码 但是开始数字逐渐下降 应该把中间部分取消,保留上升过程或者下降的过程 开始和结尾数字
ChinaITOldMan 2013-07-17
  • 打赏
  • 举报
回复
是VB6中吗?
  • 打赏
  • 举报
回复
引用 6 楼 of123 的回复:
[quote=引用 1 楼 yiguangqiang88 的回复:] 锅先联系下我的语文老师,要他来看看……
楼主是要输出当前最大和最小值。[/quote]佩服理解能力。说实话,1楼的还真没办法理解到这一地步……
  • 打赏
  • 举报
回复

'将你的代码改了一下,这样输出的结果与你的结果不一致,这个应该是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
  • 打赏
  • 举报
回复

'这段代码是主要.
    If (Flag Xor CDbl((strItems(1)) > CDbl(BakNumber))) Then
       Me.Print BakNumber
       Flag = Not Flag
    Else
       BakNumber = strItems(1)
    End If
of123 2013-07-16
  • 打赏
  • 举报
回复
或者说,是将你的实际应用需求转化成数学逻辑表达。
of123 2013-07-16
  • 打赏
  • 举报
回复
结果是一样的。
  • 打赏
  • 举报
回复
都理解错了,人家是要找反转点. 先设定一个上升或下降的标示 Flag=1(0)上升或下降 按顺序读取数据,当前数据与前一个数据进行比较. if not(flag Xor number(Now)>number(Now-1)) then Read Number(Now+1) else print Number(Now) end if
yww595595 2013-07-16
  • 打赏
  • 举报
回复
是这样判断 以第一个为准 判断下面的数字是升还是降,是升要找到最高点数字,如1号 531 到 2号 545 是 2号 545是顶点 ,保留期最低点和最高点,中间其舍去。如下降从2号 545 到8号 9 为降,保留最高点和最低点,因2号 545 是最高点了保留了,只保留最低点,8号 9 中间其舍去,以此类推……规律找出升的那段最高最低,降的那段最高和最低
of123 2013-07-16
  • 打赏
  • 举报
回复
不是这个意思。楼主的需求是当数据逐条增加时,求这一时刻的最大和最小值:

数据编号 最大值 最小值
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    
当最大最小值改变时,打印改变的数值。
贝隆 2013-07-15
  • 打赏
  • 举报
回复
把这些数据整进数组,然后再排个序就OK了
of123 2013-07-15
  • 打赏
  • 举报
回复
引用 1 楼 yiguangqiang88 的回复:
锅先联系下我的语文老师,要他来看看……
楼主是要输出当前最大和最小值。
of123 2013-07-15
  • 打赏
  • 举报
回复

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
cqq_chen 2013-07-14
  • 打赏
  • 举报
回复
引用 1 楼 yiguangqiang88 的回复:
锅先联系下我的语文老师,要他来看看……
同意
threenewbee 2013-07-13
  • 打赏
  • 举报
回复
修改下 For i = 2 To 19 If (a(i) > a(i - 1)) <> b Then Print i, a(i) : b = Not(b) Next i
threenewbee 2013-07-13
  • 打赏
  • 举报
回复
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
  • 打赏
  • 举报
回复
锅先联系下我的语文老师,要他来看看……

7,786

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧