2017-08-24 16 views
1

NUMとARRAYの両方の倍精度変数ですが、ifブロックの実行方法は不明です。それはいつ中止するのですか?実際に何をしていますか?8に行くと、doループを終了しますか? if(a) 1,2,3:場合は算術と呼ばれるFortran 77 Doループブロック解説

おかげ

DO 7 I = 1,28             
IF (NUM - ARRAY(I)) 8,7,7          
7 CONTINUE               
I=29                
8 NUM = ARRAY(I) 
.... 
.... 
.... 
.... 
+0

これは現代の言語ではどのように見えますか? – LionsFan

+0

DOループは1〜3行です。あなたが4行目にいるとき、あなたはDOループから外れています。 – gbdcool

+0

2行目から4行目に行くとどうなりますか?条件が満たされたら?私はループから外れていますか?それは 'break'ステートメントと呼ぶのが安全でしょうか? – LionsFan

答えて

1

前述のように、ループ内の条件は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)、又はで最も早い要素の値を見つけることである行っています存在しない場合は。

+0

これは私がタグを編集できない理由です。私は重複して投票することに決めました(いくつかあります)が、ハンマーの特権を失うと、レビューキューに十分な投票が得られず、投票が消えてしまいます。ゴールデンタグバッジを持つ人がさらに必要です。 –

+0

重複したターゲットに関して良い提案がありますか?私は1つ(明らかに)を見ませんでしたが、私はまだこの質問に近い投票があります。 – francescalus

+0

この1つは既に2つの他の目標です。https://stackoverflow.com/questions/11124855/fortran-if-statement-with-numbers-labels-rather-than-other-statement私も投票権を持っています。彼らは失効したときに払い戻されます。 –

1

。そして、それは意味:それは1になりa<0場合、それは2番出口へと(それが8に行く(NUM-配列(I)< 0)場合、それはあなたのコード内の3

に行く(a>0)場合行く(a==0)場合ループして別の行をスキップする)、そうでない場合は7(サイクル)になります。

+0

ありがとうございます。 – LionsFan

関連する問題