爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6620|回复: 13

[求助] fortran算月平均值

[复制链接]

新浪微博达人勋

发表于 2013-11-3 23:35:06 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
用fortran算月平均值,结果出现有一行没有值(就是说等于0),其他行都有值,不知道那一步错了,看了半天也没看出来,望哪位大神指教一下下,如下图为输出文件的截图(第一列为月份,080100代表08年一月;第二列为所求的平均值,最后一行的值为什么是0)
程序如下(有点长,不太会编):
program main
implicit none
integer n,nn
parameter(n=1578240,nn=36)
integer j,jj,f
integer cs1(n),su(nn),sum,dat(nn),s
real ave(nn)
real cs2(n)
real cs3(n)
real cs4(n)
real d
character hh,cha(n)
open(1,file='d:\gbno2.txt',status='old',form='formatted')
do j=1,n
read(1,'(I7,A10,f8.5,A8,f8.5,A8,f8.5)') cs1(j),cha(j),cs2(j),hh,cs3(j),hh,cs4(j)
end do
close(1)
j=1
do jj=1,nn
if(cs1(j)>80200.and.cs1(j)<80300) then
su(jj)=29
dat(jj)=cs1(j)-1
j=j+29*1440
else  if(cs1(j)>90200.and.cs1(j)<90300) then
su(jj)=28
dat(jj)=cs1(j)-1
j=j+28*1440
else if(cs1(j)>100200.and.cs1(j)<100300) then
su(jj)=28
dat(jj)=cs1(j)-1
j=j+28*1440
else if(cs1(j)>80400.and.cs1(j)<80500) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>80600.and.cs1(j)<80700) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>80900.and.cs1(j)<81000) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>81100.and.cs1(j)<81200) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>90400.and.cs1(j)<90500) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>90600.and.cs1(j)<90700) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>90900.and.cs1(j)<91000) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>91100.and.cs1(j)<91200) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>100400.and.cs1(j)<100500) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>100600.and.cs1(j)<100700) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>100900.and.cs1(j)<101000) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)>91100.and.cs1(j)<91200) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else
su(jj)=31
dat(jj)=cs1(j)-1
j=j+31*1440
end if
end do
d=0
s=su(1)*1440
jj=1
f=0
do j=1,n
d=d+cs2(j)
if(cs2(j)==0) then
f=f-1
end if
if(j==s) then
sum=su(jj)*1440
ave(jj)=d/(sum+f)
jj=jj+1
s=s+su(jj)*1440
d=0
f=0
end if
end do
open(2,file='d:\avemonth.txt',form='formatted',status='new')
do jj=1,36
write(2,'(I10,A5,f20.15)') dat(jj),hh,ave(jj)
end do
close(2)
end


图
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-11-4 08:36:04 | 显示全部楼层

回帖奖励 +1 金钱

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-11-4 08:47:52 | 显示全部楼层
这个我好像遇到过~~~需要在你读取的文件最后一行加上一行,加上这一行任意~~~只要是在最后一行就行~~~你试试~~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2013-11-4 08:49:22 | 显示全部楼层
请自己先逐步调试  一点点的输出各个变量
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-11-4 09:37:14 | 显示全部楼层
是否读取数据有问题,建议把读取的数据存储在文本文件中,对照原始数据,检验一下。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-11-4 10:25:09 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-11-4 10:27:27 | 显示全部楼层
andrewsoong 发表于 2013-11-4 08:47
这个我好像遇到过~~~需要在你读取的文件最后一行加上一行,加上这一行任意~~~只要是在最后一行就行~~~你试试 ...

我发现我有一行写错了,就是中间求dat(jj)和su(jj)那一段,我复制粘贴之前的内容,有个东西搞忘改了,就导致最后j多了一天的量,所以最后一个出来是0,谢谢了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-11-4 10:27:54 | 显示全部楼层
mofangbao 发表于 2013-11-4 08:49
请自己先逐步调试  一点点的输出各个变量

问题解决了  谢谢!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-11-4 10:28:58 | 显示全部楼层
oneworker 发表于 2013-11-4 09:37
是否读取数据有问题,建议把读取的数据存储在文本文件中,对照原始数据,检验一下。

问题解决了,谢谢了
改过以后的程序:
program main
implicit none
integer n,nn
parameter(n=1578240,nn=36)
integer j,jj,f
integer cs1(n),su(nn),sum,dat(nn),s
real ave(nn)
real cs2(n)
real cs3(n)
real cs4(n)
real d
character hh,cha(n)
open(1,file='d:\gbno2.txt',status='old',form='formatted')
do j=1,n
read(1,'(I7,A10,f8.5,A8,f8.5,A8,f8.5)') cs1(j),cha(j),cs2(j),hh,cs3(j),hh,cs4(j)
end do
close(1)
j=1
do jj=1,nn
if(cs1(j)==80201) then
su(jj)=29
dat(jj)=cs1(j)-1
j=j+29*1440
else  if(cs1(j)==90201) then
su(jj)=28
dat(jj)=cs1(j)-1
j=j+28*1440
else if(cs1(j)==100201) then
su(jj)=28
dat(jj)=cs1(j)-1
j=j+28*1440
else if(cs1(j)==80401) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==80601) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==80901) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==81101) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==90401) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==90601) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==90901) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==91101) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==100401) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==100601) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==100901) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else if(cs1(j)==101101) then
su(jj)=30
dat(jj)=cs1(j)-1
j=j+30*1440
else
su(jj)=31
dat(jj)=cs1(j)-1
j=j+31*1440
end if
end do
d=0
s=su(1)*1440
jj=1
f=0
do j=1,n
d=d+cs2(j)
if(cs2(j)==0) then
f=f-1
end if
if(j==s) then
sum=su(jj)*1440
ave(jj)=d/(sum+f)
jj=jj+1
s=s+su(jj)*1440
d=0
f=0
end if
end do
open(2,file='d:\avemonth.txt',form='formatted',status='new')
do jj=1,36
write(2,'(I10,A5,f20.15)') dat(jj),hh,ave(jj)
end do
close(2)
end

评分

参与人数 1金钱 +2 收起 理由
mofangbao + 2

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-11-4 10:53:11 | 显示全部楼层
q863510557 发表于 2013-11-4 10:28
问题解决了,谢谢了
改过以后的程序:
program main

恭喜~~~
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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