爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6581|回复: 5

[求助] 程序优化

[复制链接]

新浪微博达人勋

发表于 2015-4-18 12:03:20 | 显示全部楼层 |阅读模式

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

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

x
下面为一fortran程序,由于本人久(xue)不(de)接(hen)触(lan),虽然程序可以运行,结果正确,但仍希望大家多多指点,个人认为有以下问题
(1)循环过多,运行了8个多小时,希望简化循环
(2)程序代码臃肿,不够简洁
(3)注释不够明确,个别概念表达不清

—————————————————代码区—————————————————————————————————————————

Module DFile_Mod !用来读取未知文件的行数
Implicit None
contains
  Integer Function GetDataN( cStr )
    Character( Len = * ) , Intent( IN ) :: cStr
    Integer :: i
    Logical :: bIsSeparator , bIsQuote
    GetDataN = 0
    bIsSeparator = .TRUE.
    bIsQuote = .FALSE.
    Do i = 1 , Len_Trim( cStr )
      Select Case( cStr(i:i) )
      Case( '"' , "'" ) !// 如果遇到引号
        If ( .Not.bIsQuote ) GetDataN = GetDataN + 1  !//如果不在引号中,则增加一个数据
     bIsQuote = .Not.bIsQuote !// 引号结束或开始
       bIsSeparator = .FALSE.
      Case( " " , "," , char(9) ) !// 如果遇到分隔符
        If ( .Not.bIsQuote ) then  !// 分隔符如果不在引号中
          bIsSeparator = .TRUE.
        End If
      Case Default     
        If ( bIsSeparator ) then
          GetDataN = GetDataN + 1
        End If
        bIsSeparator = .FALSE.
      End Select
    End Do
  End Function GetDataN
  Function f_numbervars(vars) result(numvars)
    character(len=*), intent(in) :: vars
    integer :: numvars
    character(len=len(vars)) :: tmpvars
    character(len=256) :: tmpvar
    tmpvars = trim(adjustl(vars))
    numvars = 0
    do while (len_trim(tmpvars) > 0)
      read(tmpvars, *) tmpvar
      numvars = numvars + 1
      tmpvars = tmpvars(index(tmpvars, trim(tmpvar))+len_trim(tmpvar):)
    end do
  End Function f_numbervars
  Integer Function GetFileN( iFileUnit )
  !// 此函数应在打开文件后立即调用。调用后读取位置返回文件起始位置
    Implicit None
    Integer , Intent( IN ) :: iFileUnit
    character( Len = 1 ) :: cDummy
    integer :: ierr
    GetFileN = 0
    Rewind( iFileUnit )
    Do
      Read( iFileUnit , * , ioStat = ierr ) cDummy
      If( ierr /= 0 ) Exit
      GetFileN = GetFileN + 1
    End Do
    Rewind( iFileUnit )
  End Function GetFileN
End Module DFile_Mod

program main

!程序的作用:用于批量读取行数不确定的txt文件(共145个),第一列为站点数据,厡数据是按时间顺序排列的(站点乱序),希望将数据转换成按站点排列,将每一个站点的数据按时间顺序放入单独的txt文件中

use DFile_Mod
integer :: nRow                                                                   ! nrow为行数
character*100 filename(145) ,files                                       !filename(145) 145 是行数  files是路径加文件名
integer m  ,k                                                                       !m 定义为文件个数 k为站点数
REAL,ALLOCATABLE :: VEC(:,:),VECT(:,:),VECR(:,:)
INTEGER :: ISTATUS
INTEGER :: zhandian(756)
character(len=80)::filet,vs1
open(13,file='H:\climate data\zhandian.txt')                          !zhandian.txt用于存取站点数据
read(13,*) zhandian                                                             !读取站点数据
do k=1,756
    write(vs1,*) zhandian(k)
    filet=trim(adjustl(vs1))//".txt"
    open(5,file=filet)                                                                !打开以站点命名的txt文档
  open(10,file='H:\climate data\1.txt')                                   !1.txt是文件名的列表,共145个文件
    do  m=1,145
            read(10,*) filename(m)
            files='H:\climate data\day\'//trim(adjustl(filename(m)))! 文件的路径加名字
      Open( 12 , File = files )                                                 !打开相应的txt文档
      nRow = GetFileN( 12 )                                                 !利用DFile_Mod计算每行的行数,每个文件有20列
      ALLOCATE( VECT(20,nRow-1) , STAT = ISTATUS)
           ALLOCATE( VEC(nRow-1,20) , STAT = ISTATUS)    !用于分配动态数组
          read(12,*)  
          read(12,*) VECt                                              !不读取第一行数据描述的文字 从第二行开始读取数据 数据是按列读取 第一行变成了站点数
          VEC=transpose(VECt)                                    !转置之后第一列为站点数
                do i=1,nRow-1  
                    if (VEC(i,1)==zhandian(k) ) then
                                                 write( 5 , 100) VEC(i,:)
                         100 format(20f8.0)
                   endif
                enddo                                                !对站点数据进行筛选,将同一站点数据放入unit5中
   enddo
   close(12)
   close(5)
   close(10)
enddo
    close(13)
end Program main






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

新浪微博达人勋

发表于 2015-4-18 13:46:37 | 显示全部楼层

回帖奖励 +2 金钱

抢个沙发,对fortran不太懂  飘过
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-8-9 16:42:31 | 显示全部楼层

回帖奖励 +2 金钱

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

使用道具 举报

新浪微博达人勋

发表于 2018-8-10 21:20:57 | 显示全部楼层

回帖奖励 +2 金钱

帮楼主顶一下
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2021-8-25 14:46:10 | 显示全部楼层

回帖奖励 +2 金钱

{:5_213:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2022-4-7 08:43:23 | 显示全部楼层

回帖奖励 +2 金钱

程序就是需要楼主这样自己些,赞
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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