回 帖 发 新 帖 刷新版面

主题:[讨论]请教:怎样判断连续200个数相等

[size=6][size=3]各位大侠:
   我有一个一维数组,里边有几万个数据,其中有连续4000个数是0,我想找出这些零数据的开始位置。我编了个小程序,但是编译不过去,不知为什么。
  DO ii=1,ND-200
   ag=MAXVAL(ABS(SA(ii:ii+200)))  !SA即为数据数组
   if(ag.EQ.0.0)iii=ii;exit  !如果找到连续零数据的开始位置,跳出循环                
   end 
 END DO 
请问这样我能实现我的目的吗?错误在哪里呢??
谢谢了!![/size][/size]

回复列表 (共5个回复)

沙发

没有高手现身指教吗??急求啊!!
谢谢了!!

板凳

编译通不过,请给出错误提示,这是求助基本的信息

3 楼

[quote][font=宋体][color=#FF0000]Program [/color][color=#000000]Main
 [/color][color=#FF0000]Implicit None
 Integer [/color][color=#000080], [/color][color=#FF0000]Parameter [/color][color=#000080]:: [/color][color=#000000]ND [/color][color=#000080]= [/color][color=#800080]400
 [/color][color=#FF0000]Integer [/color][color=#000080]:: [/color][color=#000000]ii [/color][color=#000080], [/color][color=#000000]iii
 [/color][color=#FF0000]Real [/color][color=#000080]:: [/color][color=#000000]SA[/color][color=#000080]( [/color][color=#000000]ND [/color][color=#000080]) = [/color][color=#800080]0 [/color][color=#000080], [/color][color=#000000]ag
 SA[/color][color=#000080]( [/color][color=#800080]24 [/color][color=#000080]) = [/color][color=#800080]1.0
 [/color][color=#FF0000]DO [/color][color=#000000]ii[/color][color=#000080]=[/color][color=#800080]1[/color][color=#000080],[/color][color=#000000]ND[/color][color=#000080]-[/color][color=#800080]200
   [/color][color=#000000]ag[/color][color=#000080]=[/color][color=#FF0080]MAXVAL[/color][color=#000080]([/color][color=#FF0080]ABS[/color][color=#000080]([/color][color=#000000]SA[/color][color=#000080]([/color][color=#000000]ii[/color][color=#000080]:[/color][color=#000000]ii[/color][color=#000080]+[/color][color=#800080]200[/color][color=#000080]))) [/color][color=#008000]!!SA即为数据数组
   [/color][color=#FF0000]if[/color][color=#000080]( [/color][color=#FF0080]abs[/color][color=#000080]([/color][color=#000000]ag[/color][color=#000080]-[/color][color=#800080]0.0[/color][color=#000080])<[/color][color=#800080]0.0000001 [/color][color=#000080]) [/color][color=#FF0000]then
     [/color][color=#000000]iii[/color][color=#000080]=[/color][color=#000000]ii
     [/color][color=#FF0000]exit  [/color][color=#008000]!如果找到连续零数据的开始位置,跳出循环
   [/color][color=#FF0000]end if
 END DO 
 write[/color][color=#000080](*,*)[/color][color=#000000]iii
[/color][color=#FF0000]End Program [/color][color=#000000]Main
[/color][/font][/quote]

这段代码是可以实现的

4 楼

if(ag.EQ.0.0)iii=ii;exit  !如果找到连续零数据的开始位置,跳出循环

错就错在这一行,这一行用了 ; (分号),于是等价于
[quote]if(ag.EQ.0.0)iii=ii
exit  !如果找到连续零数据的开始位置,跳出循环[/quote]

也就是说,先判断 ag 是否等于 0.0,如果是,则 iii = ii。
然后不管是不是,都退出循环。

换句话说,这一句等于让 Do 循环失效了,因为循环第一次不管结果如何,都Exit

另外, ag.EQ.0.0 这样的语句也不应该出现。
ag 是浮点数,浮点数不要判断相等。因为浮点数的舍入误差会导致相等判断的结果不真实。
最好用 abs( ag - 0.0 ) < 0.000001 这样的

5 楼


[size=3]谢谢兄台的指教!我以前没有接触过Fortran,一直用的是matlab,可能把许多养成的习惯都带过来了。
看了您的回复,现在明白了!原来是分号惹的祸啊!
谢谢了,真是节省了我的不少时间![/size]

我来回复

您尚未登录,请登录后再回复。点此登录或注册