1

誰かがここで私を助けてくれたらありがたいです。私はプログラミングの仕方を学び始めたばかりなので、非常に明白な何かを見逃している可能性が高いです。このPDFの45ページにある質問4i)を解決するプログラムをFortran90で作成しようとしています。私はついにコードを何かにコンパイルすることができましたが、何かがややゴミになっているので、それが生成するデータは狂っています(時間が長くなるにつれて、t0で入力した後の距離が短くなります)。誰かが私の間違いを見つけることができますか?これは非常に多くのコードを確認する必要があることを認識しています。多くの人に質問して申し訳ありません。ご覧いただきありがとうございます!


   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
4

1 に答える 1

2

これを2つのコメントとして書きましたが、本当に長すぎました。計画していた場合は、先に進んですべて削除してください。私はFortran77と「最新の」Fortran90を比較するドキュメントを閲覧しました。(私は少し前に学校を始めたばかりのときにFortran77でコーディングしました...)。ここにいくつかの提案があります:

「ELSEIF」の使用にはご注意ください。通常、ELSEとIFでスペースを省略しても問題ありませんが、フリーフォーマットコードの場合はそうではありません(スペースオプションの他のインスタンスは、DOUBLE PRECISION、ELSE IF、GO TO、END DO、およびEND IF)。

Fortran90を使用する利点は、SELECT CASEがあるので、ELSE IF(または計算されたGOTO!)さえも必要としないことです。

FORMATは、READまたはWRITEステートメント自体のフォーマット文字列に直接組み込むことができるため、必要ありません。

はい、古いFortran77演算子.GE..GT..EQ..NE..LE..LT.または新しい 演算子のいずれかを使用できます>= > == /= <= <。ただし、コードで気付いたように、それらを混在させる必要があるかどうかはわかりません。

編集:コントロール構造に関する上記の2番目のリンクでは、Fortran90のセクション3.2〜3.5でIFの代わりにDOループを使用する方法について説明しています。名前付きDO、無期限のDOループ、DO WHILE、あらゆる種類のものを使用できます。例もあります。(ドキュメント全体の名前は、Fortran77プログラマー向けのFortran90です。)

于 2012-04-29T13:38:58.990 に答える