1

如果有人可以在这里帮助我,我将不胜感激。我刚刚开始学习如何编程,所以我很有可能错过了一些非常明显的东西。我正在尝试用 Fortran 90 编写一个程序来解决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
4

1 回答 1

2

我把它写成两条评论,但它真的太长了。如果您计划这样做,请继续将其全部删除。我刚刚浏览了一个比较 Fortran77 和“现代”Fortran90 的文档。(不久前,我刚开始上学时使用 Fortran77 进行编码......)。以下是一些建议:

小心使用“ELSEIF”。ELSE 和 IF 省略空格通常是可以的,但对于自由格式代码则不然(我认为空格可选的唯一其他实例是 DOUBLE PRECISION、ELSE IF、GO TO、END DO 和万一)。

使用 Fortran90 的一个优点是您甚至不需要 ELSE IF(也不需要计算 GOTO!),因为有 SELECT CASE。

您也不应该需要 FORMAT,因为它可以直接与READ 或 WRITE 语句本身中的格式字符串合并。

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

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

于 2012-04-29T13:38:58.990 回答