Fortran Coder

楼主: filwZ
打印 上一主题 下一主题

[数值问题] 关于求平均值的问题

[复制链接]

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

楼主
发表于 2014-3-6 17:21:19 | 显示全部楼层
本帖最后由 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  

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2014-3-7 11:03:29 | 显示全部楼层
这个程序用本次读取的年月日上一次读取的年月日对比,以便判断是否需要重新进行平均。(你要求每半月进行一次平均)
yearlast = -1
monlast = -1
daylast = -1
这是让一开始的上一次读取的年月日是一个不可能存在的年月日,以便第一行读取后,本次读取的年月日,一定与这个不同,于是程序会认为是一个新的平均部分。

( (day>15)==(daylast>15) ) )
这句话的意思是,day 和 daylast 是否同时大于15,或者是否同时小于15。如果不是的话,就说明需要重新平均了。如果是的话,就继续本次平均

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

板凳
发表于 2014-3-7 11:21:10 | 显示全部楼层
filwZ 发表于 2014-3-7 11:15
我把你的那个写进去,调试不出结果。。。好难啊

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

如果遇到错误提示,请给出来。这样别人才能判断是为什么。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2014-3-7 13:36:59 | 显示全部楼层
filwZ 发表于 2014-3-7 12:46
不好意思,我把那个写到屏幕的让他写到一个txt里,运行完没有错误,但是也没有结果输出。麻烦你了。。 ...

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

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

请使用二楼的新代码。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

5#
发表于 2014-3-9 11:51:42 | 显示全部楼层
filwZ 发表于 2014-3-9 11:46
还有点疑问,就是如果这半个月的数据都是不满足条件的话,3000的时候,程序就跳过了这半个月? ...

是的,因为没有满足条件的,所以无法平均。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

6#
发表于 2014-3-9 13:08:49 | 显示全部楼层
filwZ 发表于 2014-3-9 13:07
有没有办法让他读完以后也输出一行平均数为0的结果呢?

有办法,修改很简单。请你尝试自己修改,如有问题再追问。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

7#
发表于 2014-3-9 13:33:19 | 显示全部楼层
filwZ 发表于 2014-3-9 13:29
哦,我算出来了。[mw_shl_code=fortran,true]else if (( c==0) .and. (yearlast/=-1))then
a = 0
c = 0

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

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

能自己举一反三的学习,才值得鼓励!你很棒!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-7 05:38

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表