Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement 在Fortran 90程序中调试DO loop/IF块(初学者级)_If Statement_Fortran_Fortran90_Do Loops - Fatal编程技术网

If statement 在Fortran 90程序中调试DO loop/IF块(初学者级)

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的函数 !分配程序的相关常量 隐

如果有人能在这里帮助我,我将不胜感激。我刚刚开始学习如何编程,所以很有可能我错过了一些非常明显的东西。我正试图用Fortran 90编写一个程序来解决pdf第45页的问题4。我终于设法让我的代码编译成了某种东西,但现在有些东西是垃圾,它产生的数据是疯狂的(随着时间的增加,在t0输入任何东西后,我得到的距离会减少)。有人能发现我的错误吗?我意识到这是相当多的代码要看,我很抱歉问这么多你。提前感谢您的浏览


程序伞兵
! 降落伞手下降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