主题:[讨论]请教:怎样判断连续200个数相等
wwpwwp
[专家分:0] 发布于 2010-12-26 23:22:00
[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个回复)
沙发
wwpwwp [专家分:0] 发布于 2010-12-27 08:09:00
没有高手现身指教吗??急求啊!!
谢谢了!!
板凳
臭石头雪球 [专家分:23030] 发布于 2010-12-27 08:27:00
编译通不过,请给出错误提示,这是求助基本的信息
3 楼
臭石头雪球 [专家分:23030] 发布于 2010-12-27 08:32:00
[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 楼
臭石头雪球 [专家分:23030] 发布于 2010-12-27 08:36:00
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 楼
wwpwwp [专家分:0] 发布于 2010-12-27 09:28:00
[size=3]谢谢兄台的指教!我以前没有接触过Fortran,一直用的是matlab,可能把许多养成的习惯都带过来了。
看了您的回复,现在明白了!原来是分号惹的祸啊!
谢谢了,真是节省了我的不少时间![/size]
我来回复