If statement 在Fortran 90程序中调试DO loop/IF块(初学者级)
如果有人能在这里帮助我,我将不胜感激。我刚刚开始学习如何编程,所以很有可能我错过了一些非常明显的东西。我正试图用Fortran 90编写一个程序来解决pdf第45页的问题4。我终于设法让我的代码编译成了某种东西,但现在有些东西是垃圾,它产生的数据是疯狂的(随着时间的增加,在t0输入任何东西后,我得到的距离会减少)。有人能发现我的错误吗?我意识到这是相当多的代码要看,我很抱歉问这么多你。提前感谢您的浏览If statement 在Fortran 90程序中调试DO loop/IF块(初学者级),if-statement,fortran,fortran90,do-loops,If Statement,Fortran,Fortran90,Do Loops,如果有人能在这里帮助我,我将不胜感激。我刚刚开始学习如何编程,所以很有可能我错过了一些非常明显的东西。我正试图用Fortran 90编写一个程序来解决pdf第45页的问题4。我终于设法让我的代码编译成了某种东西,但现在有些东西是垃圾,它产生的数据是疯狂的(随着时间的增加,在t0输入任何东西后,我得到的距离会减少)。有人能发现我的错误吗?我意识到这是相当多的代码要看,我很抱歉问这么多你。提前感谢您的浏览 程序伞兵 ! 降落伞手下降z和速度zdot表 ! 作为时间t的函数 !分配程序的相关常量 隐
程序伞兵
! 降落伞手下降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
I=0,20吗
! 计算出离地面的距离
200如果(tt0)那么
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,如
! 问题规格
Elseif(t我把它写成两条评论,但它实在太长了。如果你打算这么做,请继续删除它。我刚刚浏览了一份比较Fortran77和“现代”Fortran90的文档。(我刚开始上学时用Fortran77编码,不久前…。以下是一些建议:
使用“ELSEIF”时要小心。对于,这通常是可以的,但对于自由格式代码,情况并非如此(我认为空间可选的唯一其他实例是双精度、ELSE IF、GO TO、END DO和END IF)
使用Fortran90的一个优点是,您可以,(也可以不计算转到!),因为有SELECT CASE
您也不需要格式,因为它可以直接与本身合并
是的,您可以使用旧的Fortran 77运算符.GE..GT..EQ..NE..LE..LT.
或新的运算符>=>==/=我不懂Fortran,但在其他编程语言中,您可以指定这样的不等式:a=b(a大于或等于b)。因此,我假设错误出现在else if语句中(t=>t0)。请尝试将其更改为t0@krdx。非常感谢,这就解决了问题!我的代码正在编译,但正如我所怀疑的,我的输出数据已关闭,因此我一定是在其他地方误入歧途了。我将更新我的问题以反映这一发展,同时看看是否可以发现错误。在FORTRAN中比较数字的传统方法是使用o运算符,如.GE.和.LT.,但我对90级一无所知。@PhilipSheard 90标准允许使用我现在看到了我的错误!在我读取输入之前,我在变量赋值中使用了t0!所以在此之前它一定是t0=0。感谢大家的查看和您的输入。我会保持这个状态的还有几分钟,以防有人浏览,但我会删除它,因为它现在已经解决了,以减少混乱/未回答问题的数量。这里还有一个链接给你,特别是关于Fortran 90和DO循环等等。它没有多少选择题,它们很有趣,我花了半个晚上重新学习vi editor和UNIX文件系统命令,然后在每节末尾进行可爱的“测试您的知识”。@Stefano Borini是正确的,Fortran不区分大小写,因此使用小写而不是大写字母会更安全。正确的间距和缩进非常重要,因为您需要结束每个umm 132字符(?)使用&行,并且不使用注释打断行。如果您小心地将代码整齐地格式化,则可以减少错误;o)根据您的链接(以及我的经验),elseif
完全可以。(它被列为空白是重要规则的例外)。@mgilson好的,很高兴知道。一开始我觉得这很奇怪,我想是习惯吧。我检查了一下,找到了这个链接,其中有一个项目列表,其中空格是可选的,并且它确实包括else if
。我一直使用转到
而不是转到
,从未遇到过问题。如果看到doubleprecision
,看起来会很奇怪,即使它应该是可以的!是的,我还没有看到doubleprecision
。尽管如此,我一直在使用elseif
和endif
和enddo
和goto
(我认为我从来没有使用过这两个单词的形式,除非是在处理别人按照其他约定编写的项目时)。
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