FORTRANの問題:初心者の質問

このQ&Aのポイント
  • 初心者がFORTRANの問題について質問します。矢印の部分でエラーが出てしまい、計算結果が正しくないと思いますが、出力はできるのでしょうか?
  • FORTRANの問題についての質問です。計算ミスによりm(2,2)が0になってしまい、計算中の矢印の部分でエラーが出てしまいますが、それ以外の出力はできるのでしょうか?
  • 初心者がFORTRANの問題について質問します。計算ミスによりm(2,2)が0になってしまい、矢印の部分でエラーが出てしまいますが、他の部分の出力結果は問題なく表示されるのでしょうか?
回答を見る
  • ベストアンサー

院試の問題(FORTRAN)で。

FORTRANを昨日勉強し始めたばかりの初心者です。 とある大学院の試験問題でわからない部分があるので質問させていただきます。 問題文とソースは以下のとおりです。 以下のFORTRANプログラムについて、標準出力への出力を答えよ。 program main intger :: m(3,3),i,j,k,n n=3 m(1,1)=2; m(1,2)=1; m(1,3)=2 m(2,1)=2; m(2,2)=3; m(2,3)=12 m(3,1)=8; m(3,2)=-6; m(3,3)=2 do i=1,n-1 do j=i+1,n m(j,i)=m(j,i)/m(i,i) ← do k=i+1,n m(j,k)=m(j,k)-m(j,i)*m(i,k) enddo enddo enddo write(6,*) m(2,1),m(2,3),m(3,2),m(3,3) end これを計算していくとm(2,2)=0(計算ミスだったらすみません)となってしまって 上のソースの矢印の部分でエラーが出てしまうと思い、 それだと出力出来ないのではないかと思ったんですが、 それでは答えにならないので質問させていただきました。 コンパイラを使って実行してみたいのもやまやまなんですが、 なにしろ試験まで時間があまりないもので・・・ どなたか回答できる方いらっしゃいましたらよろしくお願いします!

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

  • ベストアンサー
回答No.1

>コンパイラを使って実行してみたいのもやまやまなんですが、 >なにしろ試験まで時間があまりないもので・・・ この意気が見えているし,実力はあるのに混乱しているだけで 課題投げじゃなさそうで嬉しい。 >m(2,2)=0(計算ミスだったらすみません)となってしまって 計算してみたし,実際にg95でコンパイルして実行してみたけどならないっす。 2 ,1 , 2 2 ,3 , 12 8 ,-6, 2 行列はカンマ無いけど,見づらいし,行列じゃないからいいや。 まず、 m(1,1)が2であり m(2,1)が2であるから, m(j,i)=m(j,i)/m(i,i) により m(2,1)は1になるよね? 2 ,1 , 2 1 ,3 , 12 8 ,-6, 2 m(j,k)=m(j,k)-m(j,i)*m(i,k) k = i + 1からなので,さっき弄ったところは変えないのか。 ってことは j = 2の時 2,1,2 1,3-1*1,12-1*2 8,-6,2 が行われて 2,1,2 1,2,10 8,-6,2 次にj = 3だから m(j,i)=m(j,i)/m(i,i) んで 2,1,2 1,2,10 8/2,-6,2 で 2,1,2 1,2,10 4,-6,2 こうなって m(j,k)=m(j,k)-m(j,i)*m(i,k) で 2,1,2 1,2,10 4,-6-4*1,2-4*2 こうなって 2,1,2 1,2,10 4,-10,-6 次にi = 2だから j = 3の時 m(j,i)=m(j,i)/m(i,i) で 2,1,2 1,2,10 4,-10/2,-6 こうなって 2,1,2 1,2,10 4,-5,-6 m(j,k)=m(j,k)-m(j,i)*m(i,k) ここで 2,1,2 1,2,10 4,-5,-6 - (-5) * 10 こうなって 最終形態が 2,1,2 1,2,10 4,-5,44 こう。 普段Fortran使ってなくて, printの第一引数がなんだったか忘れたけど(フォーマットだったか出力先だったか) 気にしない(ぉ >m(2,1),m(2,3),m(3,2),m(3,3) 出力する内容はコレだから m(2,1) = 1 m(2,3) = 10 m(3,2) = -5 m(3,3) = 44 で 1 10 -5 44

naka777008
質問者

お礼

詳しい解答ありがとうございます! おかげでどこが間違ってたか気付きました・・・ アホすぎる・・・ 助かりました! ありがとうございました!

関連するQ&A

  • Fortranコードの疑問

    FORTRANのコードに関して教えてください。 いま作っているプログラムを走らせるとCommand terminated abnormally.と言われて途中で止まってしまいます。これは小さな計算(2000格子点)くらいだと上手くいくのですが、16000格子点くらいになるとダメです。これくらいだとメモリ的にもまだまだ余裕があるので、色々と他の理由を探してみましたが万策尽きました・・・ どうやら write(*,*)n…繰り返し数 n=2000 write(*,*)n do i=1,n -- code ----- enddo としたとき、出力は普通、 0 2000 となってDo文を実行すると思うのですが、上記の場合のように大きな(?)計算をさせようとすると、 1081265151 2000 などと、定義してもいないのにとんでもない値がnに代入されてしまうようです。何故このような現象が起こるのかご存知の方がいらっしゃいましたら、どうかご教示頂けると幸いです。

  • FORTRAN→Cに翻訳

     どなたか、次のFORTRANのプログラムを、Cに、翻訳して頂けないでしょうか。C++ではなく、Cです。ANSI準拠のCでお願いします。  プログラムの内容は、最小二乗法による計算プログラムです。MS-DOS Ver3.3~6.0の頃の、MS FORTRANコンパイラ仕様のものです。その頃持っていたFORTRANの本も処分してしまい、今からFORTRANを学びなおすのにも多大な労力と時間がかかりそうなので、Cに翻訳して頂ければ大変ありがたいです。よろしくお願いします。 (“□”はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ C□LEAST SQUARE APPROXIMATION □PROGRAM MAIN9 □DIMENSION X(100),Y(100),S(0:18),T(0:9),SM(10,10),TV(10),AV(10) □WRITE(*,*) 'N ?' □READ(*,*) N □WRITE(*,*) 'x1,x2,..,xn ?' □READ(*,*) ( X(I),I=1,N ) □WRITE(*,*) 'y1,y2,..,yn ?' □READ(*,*) ( Y(I),I=1,N ) □WRITE(*,*) 'M ?' □READ(*,*) M □DO 110 K=0,M*2 □□VS=0. □□DO 100 I=1,N □100□VS=VS+X(I)**K □□S(K)=VS □110□CONTINUE □□DO 130 K=0,M □□□VS=0. □□□DO 120 I=1,N □120□VS=VS+Y(I)*X(I)**K □□□T(K)=VS □130 CONTINUE □□DO 140 I=1,M+1 □□□DO 140 J=1,M+1 □□□□K=I+J-2 □□□□SM(I,J)=S(K) □140 CONTINUE □□DO 150 I=1,M+1 □150 TV(I)=T(I-1) □□CALL SIMULE( AV, SM, TV, M+1 ) □□DO 160 I=1,M+1 □160 WRITE(*,1000) I-1,AV(I) □1000 FORMAT(1H ,'A',I1,'=',F10.5) □□STOP □□END ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

  • fortran 行列ベクトル積

    行列ベクトル積を計算するプログラムを下のように書いたのですが、実行した結果の答えが実際計算した答えと異なります。初期の要素の設定がおかしいのでしょうか?教えて下さい。よろしくお願いします。 program list2_14 implicit none integer , parameter :: n = 2 real(8) a(n,n), x(n), y(n) integer i, j, k, l a(1,1:2) = (/1.2d0,3.4d0/) a(2,1:2) = (/5.6d0,7.8d0/) x(:) = (/9.0d0,10.0d0/) do i = 1, n y(i) = 0.0d0 do j = 1, n y(i) = y(i) + a(i,j) * x(j) enddo enddo do k = 1, n write(*,*) (a(k,l), l = 1, n) enddo write(*,*) x(:) write(*,*) y(n) end program list2_14 実行結果 1.2 3.4 5.6 7.8 9. 10. 128.4

  • fortranのデータ読み込み

    fortranで下記の読み込みたいデータがあります。 j k R(j,k) L(j,k) 1 1 5 1 1 2 10 2 1 3 15 3 1 4 20 4 2 1 25 5 2 2 30 6 データが9000行あるので, do i=1,9000 read(10,*) j(i) k(i) enddo のような読み込み方だと配列が大きすぎてだめなんです。 他の方法を知っている方、教えていただけませんか。 よろしくお願いします。

  • fortranを用いた行列の掛け算について

    行列の掛け算についてなのですが、ある行列aを2乗した行列bを求める場合は以下のようなプログラムを書けば出来たのですが、これを3乗以上に拡張するためにはどうしたらよいのでしょうか? ______do i=1,3 ________do j=1,3 __________b(i,j)=0.D0 ____________do k=1,3 ______________b(i,j)=b(i,j)+a(i,k)*a(k,j) ____________enddo ________enddo ______enddo

  • fortran 途中まで考えたのですが。。。。

    エラトステネスのふるい(素数の倍数を除いていって残ったのが素数)で3桁の素数を求めて表示したいです。 私が考えたのは、 1・2~99までの数を素数かどうか調べて、素数を配列に入れていく 2・100~999まで素数の配列の中の数で割って、割り切れたらおしまい。割り切れなかったら表示していく ということです。 しかし下のプログラムではうまく素数配列ができていないようなのです。 ここまでかなり時間がかかったのでこのプログラムに手をいれて これ以外におかしくなるところもどこを直せばいいのか教えてくださるとうれしいです。 C C q223.f C PROGRAM q223 C IMPLICIT NONE C INTEGER N,i,K,s,l REAL a(99),b(99),c(99),X,Y C real M C a(1)=2 a(2)=3 l=2 C DO N=2,99,1 M=N**(0.5) S=M DO i=2,S,1 K=MOD(N,i) IF(K ==0)THEN exit ELSE IF(K /=0)THEN l=l+1 a(l)=N ENDIF ENDDO ENDDO C do N=100,999 do l=1,99 X=a(l) Y=N/X if(Y==0)then exit else if(Y/=0)then write(*,*)N end if end do end do c end よろしくおねがいします

  • fortran errorについて

    fortranを勉強していたのですがエラーがでてしまい、何時間かけても理解できなかったので質問させてください。 以下プログラム program test !ここからメインルーチン !前準備 配列の用意 implicit none integer N integer,dimension(0:N,0:N) :: A integer :: i,j,k read * ,N !初期状態の代入 do i=0,N do j=0,N A(i,j)=0 end do end do do i=N/2,N-1 A(N/2,i)=1 end do do i=N/2,N-1 A(N/2+1,i)=-1 end do !ループ 50回ループさせる do k=0,50 !状態の表示 call visualize !サブルーチン visualize subroutine visualize do i=0,N do j=0,N if(A(i,j)== 1) write(*,'(A1)',advance='NO') "*" if(A(i,j)== 0) write(*,'(A1)',advance='NO') " " if(A(i,j)==-1) write(*,'(A1)',advance='NO') "+" end do write(*,*) end do !end subroutine visualize call insert !サブルーチン insert subroutine insert do i=0,N do j=0,N if(A(i,j)== 1) A(i,j)=-1 if(A(i,j)== 0) A(i,j)=max(0,A(i-1,j),A(i,j-1),A(i,j+1),A(i+1,j)) if(A(i,j)==-1) A(i,j)=0 end do end do !end subroutine insert end do end program test これでコンパイラすると In file test.f90:48 subroutine visualize 1 Error: Unclassifiable statement at (1) In file test.f90:69 subroutine insert 1 Error: Unclassifiable statement at (1) とでます いろいろ調べたのですが全くわかりませんでした できればよろしくお願いします

  • アドバイスお願いします

    今,以下の様なプログラムを作っています. 正の整数nを上限とする数字の集合を考える. そのうち a*i+b*j で表現できない値の個数を出力する. a,bは事前に与えられた正の整数であり,i,jは正の整数の変数である. またa,b,nの取り得る最大値は1000000とする. とりあえずfortranで総当たりの方法で作ってみました. integer a,b,n,ans(1000000),c read(*,*)a,b,n  do i=1,n   ans(i)=i  enddo icount=0 do i=0,n  do j=0,n   c=a*i+b*j   if(c.le.n)then    do k=1,n     if(ans(k).eq.c)then      ans(k)=-1     endif    enddo   endif  enddo enddo do i=1,n  if(ans(i).gt.0)then   icount=icount+1  endif enddo write(*,*)icount end nの値があまり大きくなければ問題なく動くのですが, 最大値である1000000を入力して走らすと,とんでもなく 時間がかかってしまいます. もっとスマートな方法は無いものでしょうか? アドバイスお願い致します.

  • ほぼ同じプログラムで結果が違う問題

    プログラムAとBが以下のようになっています。 プログラムA ------------- do n=1,100000 write(*,*) n コード 300行ぐらい enddo プログラムB -------------- do n=1,100000 if(mod(n,100).eq.1) write(*,*) n 同じソースコード enddo 両者の違いはループカウンタの画面表示頻度です。Aは毎回、Bは100回に1回印刷します。それだけですね。 ところが、プログラムAは淡々と走っていきますが、BはNaNなどを生じてしまい結果が違います。このような問題の原因は何でしょうか。出力頻度なので内容とは関係ないはずだと思うのですが。 実はコンパイラを変えたらBの問題が消えました。NaNの出力がなくなり大体想定した値が出てきています。2つのコンパイラはともにgfortranですが、何か仕様が違うということがあるでしょうか。 プログラムとしてはせいぜい10万点ぐらいの2次元配列を何度も繰り返し計算するということで、今のPCの演算速度では大したことはありません。 大昔、パソコンFortranは計算の規模(配列の規模と反復計算の回数など)に応じてコンパイラオプションを付けたり、コンパイラ自体が別物であったりしていました。そういう問題があるのかなと思うのですが。もし、何か心当たりがありましたらよろしくお願いします。

  • FortranにあってCにない関数?について

    10年間Fortran90でプログラミングをしてきましたが、 C言語を使う必要があって、プログラムを書き直し中の者です。 入門書を数冊読んでいて疑問に思ったのですが、Fortranには、 A=SUM(B) と書けば、配列Bの全ての総和をAに返す、という関数があるのですが、C言語に同じような関数はないのでしょうか?(標準ライブラリに無いという事はないのでしょうか?) Fortranと比べてCは組み込み関数が少ないという印象を持ったのですが実際そうなのでしょうか? また、Fortanでは配列の和をとる時、 do i=0,n a(i)=b(i)+c(i) end do を一行で、 a(0:n)=b(0:n)+c(0:n) と書いても良いですし、もし定義されている全部の配列の要素が対象なら a=b+c と一行で書いても良いのですが、c言語では似たような書き方はできないのでしょうか? つまり、多次元配列を扱う時、Fortranでは単に「a=b+c」と書けば済むところを、Cでは for (i=0,i<=n,i++){ for (j=0,j<=n,j++){ for (k=0,k<=n,k++){ a[i][j][k]=b[i][j][k]+c[i][j][k]; }}} と書かなくてはいけないのか?と悩んでおります。 私がCの機能を知らないだけなのか、Cとはそうゆうことが出来ないのか、浅学なため判断できません。 ご教授ください、どうぞよろしくお願いいたします。

専門家に質問してみよう