前述のように、ループ内の条件はarithmetic if statementです。
私たちが知っている(とそれをここで明示的に前の回答で述べています)num
が少ないarray(i)
よりラベル8
であればそうでないラベル7
が選択され、選択されていること。また、ループを終了したりサイクリングしたりする効果があるという答えもあります。正確には、私は続行します。
DO構成には範囲があります。問題のような非ブロックDO構造は、do
ステートメントとDO終了ステートメント(この場合は7 continue
)の間のステートメントからなる範囲を持っています。 DO終了ステートメントは、構造の範囲内からジャンプするための有効なターゲットです。
DO終了文がジャンプされると、実行は構造体のスコープ内にとどまります。その終了ステートメントが実行されます(この場合、何もしないでcontinue
)、ループの繰り返し条件が再度テストされます。つまり、ループは繰り返されます。
DO構文の中から、構文の範囲外の文にジャンプすると、構文の実行が終了します。 7
をラベル付き文がcontinue
文があるので、我々はこれを書くことができ、今 - (私と一緒にクマgo to
秒で)
DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
GO TO 8
ELSE
GO TO 7
END IF
7 CONTINUE
I=29
8 NUM = ARRAY(I)
この例では、その後、同等のIFを構築使用してフォームを持っています
DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
GO TO 8
ELSE
CYCLE
END IF
7 CONTINUE
I=29
8 NUM = ARRAY(I)
これはまだかなり醜いです(すべての大文字のためではありません)。幸いにも、これをもっときれいにすることができます。 i=29
ステートメントは、8
というラベルのステートメントがジャンプされずにループが終了した場合にのみ実行されます。今、ループインデックスi
は、制御がI = 1,28
であるので、ループが自然に終了するときに、インデックスは既にhas the value29
です。その割り当ては(現代Fortranでは)何もしないので、それを取り除くことができます。我々はまた、IF構築物がすぐにループの終わりが続いている(ので、我々は明示的にサイクルする必要はありません)私たちは
DO 7 I = 1,28
IF (NUM < ARRAY(I)) EXIT
7 CONTINUE
NUM = ARRAY(I)
かを持っていることに注意すると
DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
GO TO 8
ELSE
CYCLE
END IF
7 CONTINUE
8 NUM = ARRAY(I)
で私たちを残します(もっとうまく)
DO I = 1,28
IF (NUM < ARRAY(I)) EXIT
END DO
NUM = ARRAY(I)
すべてこの例では、num
より大きいarray(1:28)
、又はで最も早い要素の値を見つけることである行っています存在しない場合は。
これは現代の言語ではどのように見えますか? – LionsFan
DOループは1〜3行です。あなたが4行目にいるとき、あなたはDOループから外れています。 – gbdcool
2行目から4行目に行くとどうなりますか?条件が満たされたら?私はループから外れていますか?それは 'break'ステートメントと呼ぶのが安全でしょうか? – LionsFan