调试Fortran 90程序中的DO循环/ IF块(初级)

时间:2012-04-29 10:33:16

标签: if-statement fortran fortran90 do-loops

如果有人能帮助我,我将不胜感激。我刚开始学习如何编程,所以很有可能我错过了一些非常明显的东西。我正在尝试在Fortran 90中编写一个程序来解决this pdf第45页上的问题4 i)。我终于设法让我的代码编译成某些东西,但是现在某些东西有点垃圾,它产生的数据是疯狂的(随着时间的增加,我在t0输入的任何东西后都会减少距离)。有人能发现我的错误吗?我意识到这是需要查看的相当多的代码,很抱歉这么多问你。提前感谢您的回顾!


   PROGRAM PARACHUTIST
   ! Tabulation of parachutist's descent z and and speed zdot
   ! as functions of time t

     !Assign the program's associated constants

    IMPLICIT NONE
      REAL z, zdot, g, U1, U2, z0, u0, t0, q0, t, x,c,s
    INTEGER I


g=9.8
U1=54
U2=5

!Break z0 down a little with q0

q0=COSH(g*t0/U1)
z0=U1**2/g*LOG(q0)
u0=U1*TANH(g*t0/U1)

      !Prompt for and read in the free-fall time

      Print*, 'Input free-fall time in seconds:'
      Read*, t0

      !Print the table headings
      WRITE(*,1000)

1000 FORMAT (6X, 'TIME', 6X, 'DISTANCE', 6X, 'VELOCITY',            /6X, '(SEC)', 7X, '(M)', 10X, '(M/SEC)',&
        /6X, '0.0', 10X, '0.0', 10X, '0.0' )

      !Loop covering the specified times
      t=0 

    DO I=0,20

  ! Calculate the distance above ground
200         IF(t<=t0) THEN
            x=g*t/U1
            z=U1**2/g*LOG(COSH(x))
            zdot=U1*TANH(x)

    Elseif(t>t0) THEN
            x=g*(t-t0)/U2  
    !store re-used expressions

            c=cosh(x)
            s=sinh(x)
            z= z0 + (U2**2/g)*LOG(c+ (u0/U2)*s)
            zdot=U2*(U2*s+u0*c)/(U2*c+u0*s) 

        Endif

         !Print a line of table using T formats
         WRITE(*,100) t, z, zdot
100      Format(4X, F5.2, 6X, F7.2, 6X, F7.2)

!Stop with message if landed

         If(z.GE.500) THEN
        PRINT*, 'LANDED'
        STOP
         !If we haven't yet landed then increment t as in 
        !   problem specs
         Elseif(t<15) then
            t=t+1
         Elseif(t.GE.15) then
            t=t+10

        ENDIF

     !End of the t-loop
      END DO

  END PROGRAM PARACHUTIST

1 个答案:

答案 0 :(得分:2)

我写这篇文章是两条评论,但实在太冗长了。如果您计划这样做,请继续删除。我只浏览了一篇比较Fortran77和“现代”Fortran90的文档。 (我刚开始上学的时候,我在Fortran77编码,不久前......)。以下是一些建议:

小心使用“ELSEIF”。对于 ELSE and IF to have the space omitted 通常是可以的,但是这不是真的,否则使用自由格式代码(我认为空间可选的唯一其他实例是DOUBLE PRECISION,ELSE IF,GO TO,结束DO和END IF)。

使用Fortran90的一个优点是你 shouldn't even need ELSE IF's ,(也没有计算过GOTO!)因为有SELECT CASE。

您也不需要FORMAT,因为它可以直接与 format string in the READ or WRITE statement 本身合并。

是的,您可以使用旧的Fortran 77运算符.GE..GT..EQ..NE..LE..LT.或新的运算符>= > == /= <= <。但是,我不确定你是否应该混合它们,我在你的代码中注意到了。

编辑:上面的第二个链接,关于控制结构,描述了如何在Fortran90中使用DO循环代替IF,3.2 - 3.5节。您可以使用命名DO,无限DO循环,DO WHILE,各种各样的东西!也有例子。 (整个文档的名称是 Fortran90 for Fortran77 Programmers 。)