0

我刚开始学习编程,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

现在,我认为我已经正确分配了变量类型/值并以合适的格式打印出标题(尽管我不确定,如果您看到任何错误请告诉我),我的主要问题来自“!循环覆盖指定时间”。说实话,我对整个代码块感到非常困惑。我不太确定如何构建循环,我只在更简单的问题上完成了它们,并且无法解决这个问题。有人可以看看并给我一些建议吗?

4

2 回答 2

2

如果我没看错的话,你的程序模拟了一个跳伞者的下降 在前 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

请注意,我在测试中使用了 EXIT 语句来终止循环, STOP 停止程序, EXIT 打破最近的封闭循环并给你机会(这在这个程序中可能不是严格必要的,但会在更多您最终将编写的复杂程序)在程序停止之前进行整理。

由于您承认自己是 Fortran 新手,因此这里还有一些不请自来的建议;

  • 在程序中的一个位置收集您的格式语句。我特别不喜欢循环中语句 100 的位置。
  • 如果您发现自己编写 GOTO 来实现循环,那么您做错了什么。
  • 90 后的 Fortran 中几乎完全不需要数字语句标签;你写的一些东西看起来很像 FORTAN77。
  • 您将旧式关系运算符(例如 .GE.)与新式(例如 >=)混合在一起。坚持一种风格,新的更好,但如果你因为一些奇怪的原因不能做到这一点,那就坚持旧的风格。
于 2012-04-29T14:54:14.057 回答
0

“我要在这里开始某种循环……”

你可能想要一个 WHILE 循环。用英语会是

“而 z 小于 500 {...}”

STOP 将在循环之后。

有很多“最佳实践”,你会随着你的学习而学习。其中之一是为所有常量命名。这被称为“没有幻数”。

于 2012-04-29T14:07:50.693 回答