FORTRAN程序中DO循环的混淆(初学者级)

FORTRAN程序中DO循环的混淆(初学者级),fortran,Fortran,我刚刚开始学习编程,FORTRAN 95是我的第一语言。我正在努力完成pdf文件第45页底部的问题4 I)。以下是我的全部源代码供参考: 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

我刚刚开始学习编程,FORTRAN 95是我的第一语言。我正在努力完成pdf文件第45页底部的问题4 I)。以下是我的全部源代码供参考:

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
! I know I'm meant to start some DO loop here, but unsure
! how to set it up. 
     ! Calculate the distance above ground
200         IF(t<=15) THEN
        x=g*t/U1
        z=U1**2/g*LOG(COSH(x))
        zdot=U1*TANH(x)
     Elseif(t>15) 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
    STOP

     !If we haven't yet landed then increment t as in 
    !   problem specs
     If(t<15) then
        t=t+1

     Elseif(t.GE.15) then
        t=t+10
ENDIF
GOTO 200
300 STOP
ENDIF
  !End of the t-loop

END PROGRAM PARACHUTIST
程序伞兵
! 降落伞手下降z和速度zdot表
! 作为时间t的函数
!分配程序的相关常量
隐式无
实z,zdot,g,U1,U2,z0,u0,t0,q0,t,x,c,s
整数I
g=9.8
U1=54
U2=5
!用q0稍微分解z0
q0=COSH(g*t0/U1)
z0=U1**2/g*对数(q0)
u0=U1*TANH(g*t0/U1)
!自由落体时间提示和读取
打印*,“以秒为单位输入自由下落时间:”
读*,t0
!打印表格标题
写(*,1000)
1000格式(6X,‘时间’、6X‘距离’、6X‘速度’、/6X’(秒)、7X’(米)、10X’(米/秒)&
/6X,'0.0',10X,'0.0',10X,'0.0')
!循环覆盖指定的时间
t=0
! 我知道我打算在这里开始一些循环,但不确定
! 如何设置它。
! 计算出离地面的距离
200如果(t15)那么
x=g*(t-t0)/U2!存储重复使用的表达式
c=cosh(x)
s=sinh(x)
z=z0+(U2**2/g)*对数(c+u0/U2*s)
zdot=U2*(U2*s+u0*c)/(U2*c+u0*s)
恩迪夫
!使用T格式打印一行表格
写(*,100)t,z,zdot
100格式(4X、F5.2、6X、F7.2、6X、F7.2)
!如果着陆,用消息停止
如果(z.GE.500)那么
停止
!如果我们还没有着陆,那么增加t,如
!   问题规格
如果(t“我想在这里开始某种do循环…”

您可能需要一个WHILE循环。在英语中应该是

“z小于500{…}”

然后在循环之后停止

有很多“最佳实践”,您将在学习过程中学习。 其中之一是为所有常量命名。
这就是所谓的“无幻数”.

如果我读对了,你的程序会在降落伞降落的前15秒内对其进行建模。降落伞以一种速度降落,你会每秒更新一次位置和速度,15秒后会应用不同的下降速度,你会每10秒更新一次位置和速度。模拟会一直持续到位置和速度下降当到达500时,我想这就是跳伞者跳伞时离地面的距离。如果我误解了,那么接下来的一些内容将是适度错误的

一种方法(不是唯一的,也可能不是最好的)是将您的程序结构如下:

    ... initialise stuff ...
    t = 0
    DO
        IF (t<=15) THEN
            ...do stuff...
            t = t+1
        ELSE ! no need for a else if (t>15) here
            ...do other stuff...
            t = t+10
        END IF
        ... write stuff ...
        IF (Z>=500.0) EXIT

    END DO
…初始化内容。。。
t=0
做
如果(t15)在这里
…做其他事情。。。
t=t+10
如果结束
…写东西。。。
如果(Z>=500.0)退出
结束
请注意,我在测试中使用了EXIT语句来终止循环,停止程序,EXIT从最近的封闭循环中断,并给您机会(这在本程序中可能不是严格必需的,但在您最终编写的更复杂的循环中)在程序停止之前进行整理

既然你承认自己是Fortran新手,这里有一些未经请求的建议

  • 在程序中的一个位置收集格式语句。我特别不喜欢语句100在循环中的位置
  • 如果您发现自己编写GOTO来实现一个循环,那么您就做错了
  • 在Fortran 90之后的版本中,几乎完全不需要数字语句标签;您所写的一些内容看起来很像FORTAN77
  • 您已经将旧式的关系运算符(例如.GE.)与新样式(例如>=)混合在一起。坚持一种样式,新样式更好,但如果由于某些奇怪的原因无法做到这一点,请坚持旧式

我认为这个问题最适合SO。OP的可能副本命名了所有变量,在发布的代码中没有任何幻数的迹象。一些变量名称可能有点短且神秘。