• ベストアンサー

【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% (4852/10267)
回答No.2

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

aneja
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • perlのdo-while文で抜け出せない 

    perlのwhile,do-while,last文に関する質問です。 1) code1のようなプログラムを作ったのですが   eでdo_whileを抜け出すことができませんがなぜでしょうか。 ---code1(eで抜け出せない)(NG)--- my $sum=0; do{  my $a=<STDIN>;  chomp($a);  $sum=$sum+$a; }while($a ne 'e'); print $sum; -------------------------------- 2) 抜け出す方法をいろいろ試していたら   while(1)にしてlastで抜けるようにすると   code2ではeで抜け出すことができるように   なりましたが、   do~while(1)にしたcode3では、  「Can't "last" outside a loop block at …」C   というエラーが発生します。   code2とcode3はwhileがdo~whileになって   条件を見る位置がループの始めか終わりの   違いだけなのに、なぜ、code2ではOKで、   code3ではエラーになるのでしょうか。 ---code2(eで抜け出せる)(OK)----- my $sum=0; while(1) {  my $a=<STDIN>;  chomp($a);  last if ($a eq 'e');  $sum=$sum+$a; }; print $sum; --------------------------------- ---code3(エラーになる)(NG)----- my $sum=0; do{  my $a=<STDIN>;  chomp($a);  last if ($a eq 'e');  $sum=$sum+$a; }while(1); print $sum; --------------------------------- よろしくお願いします。 Windows7 , ActivePerl(v5.16.3)

    • ベストアンサー
    • Perl
  • do-while文について

    参考書を読んでいて分からないところが有りました。 「配列aの値を先頭から見ていき、その値が-1になるま配列bにコピーしていく。そのとき-1という値もコピーする。という処理をするものです。-1という値もコピーするため、このループは最低1回は実行されることになります。 i=0; do{ b[i]=a[i]; }while(b[i++]!=-1); 」 この場合、a[0]が-1のときにはb[0]に-1がコピーされるかもしれませんが、そうでない場合は「そのとき-1という値もコピーする。」というのは出来ないと思うのですが、どなたかご教授宜しくお願いします。

  • FORTRAN★DO WHILE★の問題

    FORTRANのDO WHILE問題です。 次の漸化式で与えられる数列{Xk}が、 |Xk - Xk-1|< 0.00001 となる時のXkの値を求めよ。 Xk+1 = Xk - (Xk)^3 - 6(Xk)^2 + 11Xk - 6               / 3(Xk)^2 - 12Xk + 11 (Xk)^3はXkの3乗です。 私の回答は、 implicit none integer :: k real,dimension(100000000) :: x  k = 1 x(0) = 0 do while ( abs(x(k)-x(k-1)) >= 0.00001 )   x(k+1)=x(k)-(x(k)**3-6*(x(k)**2)+(11*x(k))-6)&       /(3*(x(k)**2)-12*x(k)+11) x(k) = x(k+1) k = k +1 end do write(*,*) x(k) stop というものなんですが、作動しません。 どこが違うのか教えてください!!お願いします!!

  • do-while文での無限ループ?

    こんにちは。 いつもお世話になっております。 現在Perlを使用してプログラムを組んでいますが、無限ループになってしまうらしく、次の画面に遷移しません。 @selected2には最大10個までの要素が入ります。(要素数は都度違う) その要素の中から$carno以外の要素を1つ選びたいのですが、このプログラムだとうまく動きません。 do-whileを取るととりあえずは動くので、条件の所が間違っているようなのですが、どう考えても正しいような気がします。 do{ if($ransuu==0){ $ransuu=int rand(11); } for($k=1;$k<=$a;$k++){ if($selected2[$k]==$ransuu){ $second=$ransuu; } } }while($ransuu==$carno || $second!=$ransuu); アドバイスをよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • fortranでファイルから数値を読み取ることについての質問です。

    fortranでファイルから数値を読み取ることについての質問です。 次のような内容のファイルから数値を読み取る場合: 1 2 3 4 5 6 7 8 9 これはdoループを使って do i=1,n read(1,*)a[3*(i-1)+1],a[3*(i-1)+2],a[3*(i-1)+3] end do として、行数をn=3と指定すれば読み取れますが、 行数を指定しなくてはabortします。 行数を指定せずに、最後のデータまで自動的に読むようにするには どうすれば良いでしょうか?

  • FORTRAN

    FORTRANについて聞かせてください。 WRITE(*,*) 'A= READ( *,*) A Aの値を0~0.15の範囲で0.01刻みで増やしていって実行したいのですが,どのようにプログラムを作成すればいいですか?? DOループだと思うのですが,あってますか? 分かる方いらっしゃったらお願いします。 FORTRANについてお勧めの初心者用ホームページがあればおしえてくださると助かります。

  • do - while 文

    以下のコードをコンパイル後実行すると、0~9までの出現回数がわかるのですが、処理を続けますか?と出た後yを入力するともう一度 do 以降を実行するようにしたいのですが、yを入力する前にプログラムが終了してしまいます。何がいけないんでしょうか? #include <iostream> using namespace std; int main (void) { int i; char cont; char c; int count[10] = {0}; do{ while (cin.get(c)){ switch (c){ case '0': count[0]++; break; case '1': count[1]++; break; case '2': count[2]++; break; case '3': count[3]++; break; case '4': count[4]++; break; case '5': count[5]++; break; case '6': count[6]++; break; case '7': count[7]++; break; case '8': count[8]++; break; case '9': count[9]++; break; } } for (i =0; i < 10; i++) cout << i << "の出現回数は" << count[i] << "\n"; cout <<"処理を続けますか?(y/N)"; cin >>cont; }while (cont == 'y'); }

  • while文の中にwhile文を書きたいのですが。。。

    while文の中にwhile文を書きたいのですが。。。 現在、下記ソースでプログラムを記述しております。 下記ソースですと、1回目のループのデータは抽出できるのですが、2回目のループだとデータが抽出できません。。 <? while($item0_3 = mysql_fetch_array($res0_3)){ ?> <tr> <td class="A"> <select name="work_partner_com[]"> <? while ($item5_2 = mysql_fetch_array($res5_2)) {?> <option value="<?=$item5_2["com_name"]?>"><?=$item5_2["com_name"]?></option> <? }?> </select> </td> <td class="B"> <select name="work_com[]"> <? while ($item5_3 = mysql_fetch_array($res5_3)) {?> <option value="<?=$item5_3["name"]?>"><?=$item5_3["name"]?></option> <? }?> </select> </td> </tr> <? } ?> 1回目のwhile文で、データーベースの指定したテーブルに格納されている数 2回目のwhile文で、データーベースの指定したテーブルに格納されているマスタデータ数 ご教授いただけますでしょうか。

    • ベストアンサー
    • PHP
  • fortranでテキストデータ読込できない。教えて下さい。

    fortran95(g95)を使用しています。 以下のようなテキストファイルを読み込みたいのですができません。 a.txtの中身 ------------------------- 0.000000 -11084.0 1.940757E-03 0.000000 -11059.6 6.324515E-04 0.000000 -11035.2 2.825573E-02 0.000000 -11010.7 1.419570E-03 -------------------------- ----と-----の間のデータです。 最初に空白が3つ 次に8桁の実数 次に空白が1つ 次に8桁の実数(マイナス記号含む) 次に空白が2つ 最後に12桁の実数(指数含む) となっています。    real :: z(3,4)   open(1,FILE='a.txt')   do j = 1, 4 read(1,1000,end=99)(z(k,j), k=1,3) enddo 99 continue close(1) 1000 format(F11.6,F9.1,E14.6) 上記のようなコードを作成しています。 do j = 1,4 write(*,*) (z(k,j),k=1,3) enddo 上記のように出力させると 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. となります。 よくわからない。 分かる方、教えて下さい。 お願いします。

  • エクセルVBAで Do While (1)って?

    下記のような例文がありますが、 Do While (1)の括弧1の意味がわかりません。 Stri = "" iCount = 3 '入力データ開始行 Do While (1) If Trim(Sheets("テスト").Range("A" & iCount)) = "" Then Exit Do End If Stri = Stri & Sheets("テスト").Range("G" & iCount) & "," iCount = iCount + 1 Loop 以下のような使い方ならわかるのですが・・・・。 Do While Counter < 20 Counter = Counter + 1 MsgBox Counter Loop