Fortran Coder

查看: 18515|回复: 14
打印 上一主题 下一主题

[文件读写] 如何按行进行数据操作

[复制链接]

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
跳转到指定楼层
楼主
发表于 2017-1-29 21:32:09 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
我在做一个计算积温的小程序,根据彭国伦计算学生成绩的例子做的,已经实现一整年积温的计算 ,现在我想根据第一列的天数 1.实现输入起止日期即起止行数,灵活的计算两个指定行之间的数据而不是简单的一整列的计算,不知道该怎末给指定行赋值 2.就是temp我现在是手动赋值 ,能不能根据文件行数自动赋值给它,我试着把获取文件行数的代码放进去,一放进去就提示mod不能用,大过年的打扰大家了
[Fortran] 纯文本查看 复制代码
module typedef
    type tdd
        integer :: stat=0
        real ::  tmax , tmin ,  total , average
    end type
end module

PROGRAM MAIN
    USE typedef
    implicit none
    real::dy,rain
    INTEGER,PARAMETER::temp=365
    type(tdd)::t(temp)! 保存气温值
    type(tdd):: total !日均温累加
    integer i

    open(7,file="GDNH94")
    read(7,*)

    do i=1,temp
        read(7,*)dy , t(i)%tmax , t(i)%tmin , rain

        t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
        total%average=total%average+t(i)%average    !日均温累加=积温
    enddo
    print *,total%average    !
    STOP
end PROGRAM


QQ截图20170129210133.png (5.26 KB, 下载次数: 386)

QQ截图20170129210133.png
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
15#
 楼主| 发表于 2017-2-2 12:17:48 | 只看该作者
vvt 发表于 2017-2-1 10:02
你欠缺一点对程序的理解。
文件的行数,必须运行的时候才能判断,然后才能知道数组的大小。
运行以后才知道 ...

我有个关于批量处理的问题发了个新帖 麻烦帮忙看一下吧

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
14#
 楼主| 发表于 2017-2-1 18:56:41 | 只看该作者
vvt 发表于 2017-2-1 10:02
你欠缺一点对程序的理解。
文件的行数,必须运行的时候才能判断,然后才能知道数组的大小。
运行以后才知道 ...

嗯嗯 明白了 谢谢

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
13#
发表于 2017-2-1 10:02:30 | 只看该作者
你欠缺一点对程序的理解。
文件的行数,必须运行的时候才能判断,然后才能知道数组的大小。
运行以后才知道大小的数组,就得用动态数组。
有两个时间很重要:编译时,和运行时

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
12#
 楼主| 发表于 2017-2-1 08:55:39 | 只看该作者
vvt 发表于 2017-1-31 23:46
[mw_shl_code=fortran,true]PROGRAM MAIN
  USE typedef
  implicit none

谢谢,光照搬书上例子,把动态数组给忘了,还是要活学活用啊

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
11#
发表于 2017-1-31 23:46:22 | 只看该作者
本帖最后由 vvt 于 2017-1-31 23:48 编辑

[Fortran] 纯文本查看 复制代码
PROGRAM MAIN
  USE typedef
  implicit none
  real::rain
  type(tdd),allocatable::t(:)! 保存气温值
  type(tdd):: total !日均温累加
  integer i , m , dy , start , end
  character(len=3) :: line
  open(7,file="CN019067")
  I=0
  do
    READ(7,*,end=100) line
    i=i+1
  end do
  100 m = i - 1 !//你这个前面只多了一行
  rewind(7)
  allocate( t(m))  
  read(7,*)
  write(*,*)"start:"
  read(*,*) start
  write(*,*)"end:"
  read(*,*) end
  do i=1,m
    read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
    t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
  end do
  total%average = 0
  do i=start,end
    total%average=total%average+t(i)%average    !日均温累加=积温
  enddo
  print *, dy,total%average    !
end PROGRAM

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
10#
 楼主| 发表于 2017-1-31 22:04:24 | 只看该作者
本帖最后由 wxy 于 2017-1-31 22:19 编辑
vvt 发表于 2017-1-31 21:52
把 print 放到循环外面不就可以了?

嗯嗯 太感谢了 然后就是请问一下 temp=366,366其实是行数 ,我想用获取行数的代码赋给temp,理论上是否是对的,temp=366是声明数组大小吧,获取行数代码放在后面赋值给temp 好像顺序反了,如果理论上可以 应该放在什么位置
[Fortran] 纯文本查看 复制代码
I=0
  do while (.true.)
    READ(8,*,end=100) line
    i=i+1
  end do
  100 CONTINUE
   m=i-4
  rewind(8)


954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
9#
发表于 2017-1-31 21:52:10 | 只看该作者
本帖最后由 vvt 于 2017-1-31 21:54 编辑

把 print 放到循环外面不就可以了?
[Fortran] 纯文本查看 复制代码
  do i=start,end
    read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
    t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
    total%average=total%average+t(i)%average    !日均温累加=积温
  enddo
  print *, dy,total%average    !

如果你要全部365个都读完,然后再计算start到end的平均值,可以这样
[Fortran] 纯文本查看 复制代码
PROGRAM MAIN
  USE typedef
  implicit none
  real::rain
  INTEGER,PARAMETER::temp=366
  type(tdd)::t(temp)! 保存气温值
  type(tdd):: total !日均温累加
  integer i , dy , start , end

  open(7,file="CN019067")
  read(7,*)
  write(*,*)"start:"
  read(*,*) start
  write(*,*)"end:"
  read(*,*) end
  do i=1,temp
    read(7,*)dy , t(i)%tmax , t(i)%tmin , rain
    t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
  end do
  total%average = 0
  do i=start,end
    total%average=total%average+t(i)%average    !日均温累加=积温
  enddo
  print *, dy,total%average    !
end PROGRAM

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
8#
 楼主| 发表于 2017-1-31 21:21:17 | 只看该作者
本帖最后由 wxy 于 2017-1-31 21:33 编辑
vvt 发表于 2017-1-31 19:31
1.我不清楚你现在的代码是怎样的?数据文件是怎样的?你做了什么改动。因此,你的第一个问题我没办法回答。 ...

这是现在的代码和文件,一开始发的代码 比如1-50行求和,会只显示50行和的值,这个代码会显示每一行跟前几行的和,直到第50行,
[Fortran] 纯文本查看 复制代码
module typedef
    type tdd
        integer :: stat=0
        real ::  tmax , tmin ,  total , average
    end type
end module

PROGRAM MAIN
    USE typedef
    implicit none
    real::rain
    INTEGER,PARAMETER::temp=366
    type(tdd)::t(temp)! 保存气温值
    type(tdd):: total !日均温累加
    integer i , dy , start , end

    open(7,file="CN019067")
    read(7,*)
    write(*,*)"start:"
    read(*,*) start
    write(*,*)"end:"
    read(*,*) end

    do i=1,start-1
        read(7,*)
    enddo
    do i=start,end
        read(7,*)dy , t(i)%tmax , t(i)%tmin , rain

        t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
        total%average=total%average+t(i)%average    !日均温累加=积温
    print *, dy,total%average    !
    enddo
    STOP
end PROGRAM

QQ截图20170131211931.png (10.44 KB, 下载次数: 383)

QQ截图20170131211931.png

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
7#
 楼主| 发表于 2017-1-31 21:20:18 | 只看该作者
这是现在的代码
[Fortran] 纯文本查看 复制代码
module typedef
    type tdd
        integer :: stat=0
        real ::  tmax , tmin ,  total , average
    end type
end module

PROGRAM MAIN
    USE typedef
    implicit none
    real::rain
    INTEGER,PARAMETER::temp=366
    type(tdd)::t(temp)! 保存气温值
    type(tdd):: total !日均温累加
    integer i , dy , start , end

    open(7,file="CN019067")
    read(7,*)
    write(*,*)"start:"
    read(*,*) start
    write(*,*)"end:"
    read(*,*) end

    do i=1,start-1
        read(7,*)
    enddo
    do i=start,end
        read(7,*)dy , t(i)%tmax , t(i)%tmin , rain

        t(i)%average=(t(i)%tmax+t(i)%tmin)/2    !日均温
        total%average=total%average+t(i)%average    !日均温累加=积温
    print *, dy,total%average    !
    enddo
    STOP
end PROGRAM

QQ截图20170131211931.png (10.44 KB, 下载次数: 373)

QQ截图20170131211931.png
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-6-30 07:55

Powered by Tencent X3.4

© 2013-2024 Tencent

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