0

私はプログラミングを学び始めたばかりで、FORTRAN95が私の第一言語です。このPDFファイルの45ページの下部にある質問4i)を完了しようとしています。参考までに、これが私のソースコード全体です。

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 秒間、落下傘兵は一定の速度で降下し、1 秒ごとに位置と速度を更新し、15 秒後に異なる降下速度が適用され、位置を更新します速度は 10 秒ごとです。シミュレーションは位置が 500 に達するまで続きます。これは落下傘兵がジャンプしたときの地面までの距離だと思います。以下のいくつかを誤解している場合、中程度の誤りがあります

唯一の方法ではなく、おそらく最善ではない方法の 1 つは、プログラムを次のように構成することです。

    ... 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 を初めて使用することを告白したので、ここでさらにいくつかの一方的なアドバイスを示します。

  • Format ステートメントをプログラム内の 1 つの場所に集めます。ループ内のステートメント 100 の場所が特に好きではありません。
  • ループを実装するために GOTO を書いていることに気付いた場合は、何か間違ったことをしています。
  • 90 以降の Fortran では、数値ステートメント ラベルはほぼ完全に不要です。あなたが書いたもののいくつかは、FORTAN77 によく似ています。
  • 古いスタイルの関係演算子 (.GE. など) と新しいスタイル (>= など) が混在しています。1 つのスタイルに固執し、新しいスタイルを使用することをお勧めしますが、何らかの理由でそれができない場合は、古いスタイルに固執してください。
于 2012-04-29T14:54:14.057 に答える
0

「ここである種の do ループを開始するように指示されています...」

おそらく WHILE ループが必要です。英語だとこうなる

「z が 500 未満の場合 {...}」

STOP はループの後になります。

作業を進めていくうちに学べる「ベスト プラクティス」がたくさんあります。それらの 1 つは、すべての定数に名前を付けることです。これは「ノーマジックナンバー」と呼ばれます。

于 2012-04-29T14:07:50.693 に答える