Fortran Coder

标题: 统计年份并删除的逻辑问题,请高手帮帮忙 [打印本页]

作者: gercibee    时间: 2015-1-24 22:58
标题: 统计年份并删除的逻辑问题,请高手帮帮忙
[Fortran] 纯文本查看 复制代码
program watersave
implicit none
     character*5 filename
     integer :: i,k,j,q,flag
     integer :: a1, a2, a3 , a5, a6, a7, a8, a9, a10, a11, a12,a13
     real*8 :: a4
     
     open(10, file = "D:\a\tem.txt")
     do i = 1, 221
         read(10, *) filename
         flag = 0 !// 每次赋初值
        open(11, file = "D:\a\"//filename//".txt")
         do k = 1,19358
             read(11, *)a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13
             do j = 1961, 2013
                 q = 0
                 if(a5 == j .and. a8 == 32766) then
                     q = q+1
                     if(q>18) then
                         flag = 1
                     endif
                 endif
             end do
         end do
         if(flag == 1) then
            close(11, status = "delete")
         else
            close(11, status = "keep")
         endif
     end do
end

每一个文件时间序列都是1961到2013年,每一年只要a8列等32766的数大于18就把这个文件删掉,可是运行之后没有删掉,请高手帮忙指点一下哪里写的不对。

作者: fcode    时间: 2015-1-25 08:59
这是逻辑错误。

[Fortran] 纯文本查看 复制代码
read(11, *)a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13
do j = 1961, 2013
    q = 0
    if(a5 == j .and. a8 == 32766) then
        q = q+1
        if(q>18) then
            flag = 1
        endif
    endif
end do


这段代码的结果就是,读取了一行数据。循环了2013-1961+1次,但 if 条件满足就一直满足,不满足就一直不满足。
因为 j 循环的过程中,a5 和 a8 都未改变。因此 if 的真假也就不会改变。

实际上,对 j 从 1961 到 2013 的循环是没有用处的。也不需要。

以下是我写的一段代码,希望对你有用。(我没有数据文件,不保证一定可以正确运行,请注意备份你的数据文件以免误删除,但至少,从逻辑上你会有所收获)

[Fortran] 纯文本查看 复制代码
Program Watersave
  Implicit None
  Character *5 Filename
  Integer :: I, K, J, Q, Flag, Curryear
  Integer :: A(13)
  Real *8 :: A4
  Open (10, File='D:\a\tem.txt')
  Do I = 1, 221
    Read (10, *) Filename
    Flag = 0 !// 每次赋初值
    Open (11, File='D:\a\'//Filename//'.txt')
    Do K = 1, 19358
      Read (11, *) A(1:3), A4, A(5:13)
      If (K==1) Then !// 如果是第一行
        Curryear = A(5)
        Q = 0
      Else If (A(5)/=Curryear .Or. K==19358) Then !// 如果是新的一年,或者是最后一行
        If (Q>18) Then
          Flag = 1
          Exit
        End If
        Curryear = A(5) !// 当前年切换到新的一年
        Q = 0 !// Q=0 重新计数
      End If
      If (A(8)==32766) Q = Q + 1
    End Do
    If (Flag==1) Then
      Close (11, Status='delete')
    Else
      Close (11, Status='keep')
    End If
  End Do
End Program Watersave


最后,a(13) 可以是数组,就用数组,这样不是很好吗??

为何你非要用13个变量呢?
作者: gercibee    时间: 2015-1-25 20:48
fcode 发表于 2015-1-25 08:59
这是逻辑错误。

[mw_shl_code=fortran,true]read(11, *)a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13

我测试了,这下对了,我是新手多谢指点,我都修改过来了




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