我刚开始学习编程,FORTRAN 95是我的第一语言。我正在尝试完成this 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
现在,我认为我已正确分配变量类型/值并以合适的格式打印出标题(虽然我不确定,如果您看到任何错误请告诉我),我的主要问题来自“!循环覆盖指定的时间“。那整段代码,说实话,我完全糊涂了。我不确定如何构建循环,我只是在更简单的问题上完成它们而且无法绕过这个问题。有人可以看看并给我一些建议吗?
答案 0 :(得分: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的新手,那么还有一些未经请求的建议;
答案 1 :(得分:0)
“我想在这里开始做某种循环......”
你可能想要一个WHILE循环。在英语中它将是
“而z小于500 {...}”
STOP将在循环之后。
随着您的进展,您将学到很多“最佳实践”。 其中之一是给所有常数一个名字。 这被称为“无魔数”。