• ベストアンサー

【FORTRAN77】DO WHILE文 これで正しいの?

まったくさわったことのないFORTRAN77の解読をさせられています。 次のような場合はどうなるのでしょうか? コンパイル・実行できる環境がないので、教えて下さい。 データ数5の実数型配列をA(5)とする。 マイナスのデータは必要ないので、データ数を、今の5つから、マイナスデータを引いた数字に変更したい。 (ここでは、データ数のみを変更するものとします) N = 5 A(1) = -3. A(2) = -5. A(3) = -1. A(4) = 5. A(5) = 3. の時、次の使い方は正しく動くの? DO WHILE (A(N) .LE. 0.) N = N - 1 END DO 最初のWHILEループ N = 1から見ていって、A(1)がマイナスだから、 Nが4になる。 次のWHILEループ ・N = 4になったから、A(4)を見る? ・それともちゃんと順番にA(2)を見る? WHILEループが終わったら、ちゃんとN = 2になっている?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

実際に動かしてないので、間違ってたらすみません。 >DO WHILE (A(N) .LE. 0.) なので、 >最初のWHILEループ N = 1から見ていって、A(1)がマイナスだから、 最初のループ A(N) は、A(5) だと思います。 WHILE ループで A(N) .LE. 0. とかするより、 配列の全部を1からNまで検査して マイナスで無いモノをカウントしてN をカウントしたもので置き換えるのがいいんじゃないでしょうか 配列の並びが、マイナスの並びがあって、マイナスではないものに切り替わるような並びになっているなら、 先頭から見ていって、マイナスで無い要素が見つかった時点でブレークし N=N-見つかった要素の番号+1 とかすれば良いような気がします

aneja
質問者

お礼

ご回答ありがとうございます。 >>最初のWHILEループ N = 1から見ていって、A(1)がマイナスだから、 >最初のループ A(N) は、A(5) だと思います。 そんな感じがしますよね。 このプログラムはDO文で書けそうなところを、このようなWHILE文を多用しているのです。 A(I)の中身は連続な値ではなさそうなので、これ、正しく動いてませんね。

その他の回答 (2)

  • colder
  • ベストアンサー率43% (30/69)
回答No.3

そもそも、FORTRAN77には、 DO WHILE文や END DO文はありません。 これらが使えるのは、Fortran90以降か、 コンパイラの拡張機能(多くのコンパイラで使えますが)です。

aneja
質問者

お礼

ご回答ありがとうございます。 大元はFORTRAN77だったものをFortran90に変更したものかもしれません。 (プログラム内がすべて大文字でしたので、勝手に自分がFORTRAN77と思い込んでいたようです)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

配列の添え字と個数の変数がごっちゃになっていますね。fortranかどうかという以前の問題です。 N=5 DO I=1,5 IF(A(I).LT.0) N=N-1 END DO

aneja
質問者

お礼

ご回答ありがとうございます。 私もまったく同じように感じていたのですが、FORTRANはこんな文法が通ってしまうのかと思って質問させていただきました。 (実際に稼動しているプログラムです…怖い怖い)