Fortran Coder

标题: 关于求平均值的问题 [打印本页]

作者: filwZ    时间: 2014-3-6 16:46
标题: 关于求平均值的问题
求助大家一个问题
我的资料是52年的雨量资料,每一天都有,但是有的天数是缺失的,现在需要将一个月的前15天求一个平均值,这个月剩下的天数求一个平均。
但是需要雨量大于12mm,资料里雨量30000多的表示缺失,记为0.

请位大神教下怎么求。

QQ截图20140306164022.png (14.26 KB, 下载次数: 877)

QQ截图20140306164022.png

作者: 楚香饭    时间: 2014-3-6 17:21
本帖最后由 chuxf 于 2014-3-7 13:34 编辑

[Fortran] 纯文本查看 复制代码
Program www_fcode_cn
  Implicit None
  integer :: ierr
  integer :: i , year , mon , day
  integer :: yearlast , monlast , daylast , c
  real :: d , a
  Open( 12 , File = '57517(4年).txt' )
  Open( 13 , File = 'out.txt' )
  read(12,*)
  yearlast = -1
  monlast = -1
  daylast = -1
  a = 0.0
  c = 0
  Do
    Read( 12 , * , ioStat=ierr ) i , year , mon , day , d
    if ( ( ierr== 0 ) .and. (year == yearlast) .and. (mon == monlast) .and. ( (day>15)==(daylast>15) ) ) then !// 同一个半月
      if ( ( d > 12.0 ) .and. ( d < 3000.0 ) ) then
        a = a + d
        c = c + 1
      end if
    else
      if( c> 0 ) then
        a = a / c
        write(13,*) yearlast , monlast , a , c
      end if
      a = 0.0
      c = 0
      if ( ( d > 12.0 ) .and. ( d < 3000.0 ) ) then
        c = 1
        a = d
      end if
    end if
    yearlast = year
    monlast = mon
    daylast = day
    if ( ierr /= 0 ) Exit
  End Do
  Close( 12 )
  Close( 13 )
End Program www_fcode_cn  

作者: filwZ    时间: 2014-3-6 17:56
非常谢谢。。大神。
作者: filwZ    时间: 2014-3-7 10:32

[Fortran] 纯文本查看 复制代码
  yearlast = -1
  monlast = -1
  daylast = -1

和后面的那句
[Fortran] 纯文本查看 复制代码
( (day>15)==(daylast>15) ) )

看不懂啊,能解释下吗?
作者: filwZ    时间: 2014-3-7 10:34
chuxf 发表于 2014-3-6 17:21
[mw_shl_code=fortran,true]Program www_fcode_cn
  Implicit None
  integer :: ierr

能解释下吗?谢谢!
作者: 楚香饭    时间: 2014-3-7 11:03
这个程序用本次读取的年月日上一次读取的年月日对比,以便判断是否需要重新进行平均。(你要求每半月进行一次平均)
yearlast = -1
monlast = -1
daylast = -1
这是让一开始的上一次读取的年月日是一个不可能存在的年月日,以便第一行读取后,本次读取的年月日,一定与这个不同,于是程序会认为是一个新的平均部分。

( (day>15)==(daylast>15) ) )
这句话的意思是,day 和 daylast 是否同时大于15,或者是否同时小于15。如果不是的话,就说明需要重新平均了。如果是的话,就继续本次平均
作者: filwZ    时间: 2014-3-7 11:15
chuxf 发表于 2014-3-7 11:03
这个程序用本次读取的年月日和上一次读取的年月日对比,以便判断是否需要重新进行平均。(你要求每半月进行 ...

我把你的那个写进去,调试不出结果。。。好难啊
作者: 楚香饭    时间: 2014-3-7 11:21
filwZ 发表于 2014-3-7 11:15
我把你的那个写进去,调试不出结果。。。好难啊

建议您发送部分数据(而不是截图)

如果遇到错误提示,请给出来。这样别人才能判断是为什么。
作者: filwZ    时间: 2014-3-7 12:46
不好意思,我把那个写到屏幕的让他写到一个txt里,运行完没有错误,但是也没有结果输出。麻烦你了。。

57517(4年).txt

216.94 KB, 下载次数: 8


作者: 楚香饭    时间: 2014-3-7 13:36
filwZ 发表于 2014-3-7 12:46
不好意思,我把那个写到屏幕的让他写到一个txt里,运行完没有错误,但是也没有结果输出。麻烦你了。。 ...

别人给你写的代码,你不能完全拷贝,要根据自己的情况稍作修改。别人的代码只是思路,而不是确定的解决方案。

问题就出在第一行的表头上面。之前的代码没有考虑第一行的表头。

请使用二楼的新代码。
作者: filwZ    时间: 2014-3-7 13:53
chuxf 发表于 2014-3-7 13:36
别人给你写的代码,你不能完全拷贝,要根据自己的情况稍作修改。别人的代码只是思路,而不是确定的解决方 ...

嗯,我就把文件的名字改了,好的,谢谢你
作者: filwZ    时间: 2014-3-9 11:46
chuxf 发表于 2014-3-7 13:36
别人给你写的代码,你不能完全拷贝,要根据自己的情况稍作修改。别人的代码只是思路,而不是确定的解决方 ...

还有点疑问,就是如果这半个月的数据都是不满足条件的话,<12,>3000的时候,程序就跳过了这半个月?
作者: 楚香饭    时间: 2014-3-9 11:51
filwZ 发表于 2014-3-9 11:46
还有点疑问,就是如果这半个月的数据都是不满足条件的话,3000的时候,程序就跳过了这半个月? ...

是的,因为没有满足条件的,所以无法平均。
作者: filwZ    时间: 2014-3-9 13:07
chuxf 发表于 2014-3-9 11:51
是的,因为没有满足条件的,所以无法平均。

有没有办法让他读完以后也输出一行平均数为0的结果呢?
作者: 楚香饭    时间: 2014-3-9 13:08
filwZ 发表于 2014-3-9 13:07
有没有办法让他读完以后也输出一行平均数为0的结果呢?

有办法,修改很简单。请你尝试自己修改,如有问题再追问。
作者: filwZ    时间: 2014-3-9 13:29
chuxf 发表于 2014-3-9 13:08
有办法,修改很简单。请你尝试自己修改,如有问题再追问。

哦,我算出来了。
[Fortran] 纯文本查看 复制代码
else if (( c==0) .and. (yearlast/=-1))then
a = 0
c = 0
write(13,*) yearlast , monlast , a , c
     

作者: 楚香饭    时间: 2014-3-9 13:33
filwZ 发表于 2014-3-9 13:29
哦,我算出来了。[mw_shl_code=fortran,true]else if (( c==0) .and. (yearlast/=-1))then
a = 0
c = 0

很好,别人给你写代码只是提供一种思路。

其实一个问题的确定,几句话说不清楚,很多特殊情况下你的需求不一定都要靠别人帮你实现。

能自己举一反三的学习,才值得鼓励!你很棒!
作者: filwZ    时间: 2014-3-9 13:35
chuxf 发表于 2014-3-9 13:33
很好,别人给你写代码只是提供一种思路。

其实一个问题的确定,几句话说不清楚,很多特殊情况下你的需求 ...

谢谢你
作者: filwZ    时间: 2014-3-9 20:05
chuxf 发表于 2014-3-9 13:33
很好,别人给你写代码只是提供一种思路。

其实一个问题的确定,几句话说不清楚,很多特殊情况下你的需求 ...

[Fortran] 纯文本查看 复制代码
Program main
  Implicit None
  real::v,w,pd12,py12
  integer::year1,year2,mon1,c1,c2
    open(1,file='pd12.dat')
    open(2,file='py12.dat')
    open(3,file='canshu.dat')
    do
        read(2,*)year2,py12,c2
        do
            read(1,*)year1,mon1,pd12,c1
                if((year1==year2).and.(pd12/=0.0))then
                    w=0.8363+181.77/pd12+244.55/py12
                    v=21.586*w**(-7.1891)  
                else  if((year1==year2).and.(pd12==0.0))then
                    w=0.0
                    v=0.0
                if (year1/=year2)exit
                end if
            write(3,'(1x,i5,i5,f10.1,f10.1)')year1,mon1,w,v
        end do
    end do
    close(1)
    close(2)
    close(3)
end program

作者: filwZ    时间: 2014-3-9 20:06
本帖最后由 filwZ 于 2014-3-9 20:13 编辑
filwZ 发表于 2014-3-9 20:05
[mw_shl_code=fortran,true]Program main
  Implicit None
  real::v,w,pd12,py12

我运行这个程序说有个断点,能帮我看下吗?我要算的是当取一个年平均值py2的时候,没半个月有一个pd12,带入公式算出w和v,
当半月的平均值为0时,就直接为0了。可是我编出这个程序老说这个有断点。

pd12.dat

3.47 KB, 下载次数: 1

半月平均值

py12.dat

162 Bytes, 下载次数: 1

年平均值


作者: fcode    时间: 2014-3-9 20:49
filwZ 发表于 2014-3-9 20:06
我运行这个程序说有个断点,能帮我看下吗?我要算的是当取一个年平均值py2的时候,没半个月有一个pd12,带 ...

你没有添加对文件终止的判断。一直读,遇到文件结束就出错了
作者: filwZ    时间: 2014-3-9 21:22
fcode 发表于 2014-3-9 20:49
你没有添加对文件终止的判断。一直读,遇到文件结束就出错了

哦,我试下。谢谢了




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2