「難しくなってきた」とか「理解できない」と言う人がそろそろ増えてきましたが,
実際,今までに出てきたコマンドは
- READ(*,*)
- WRITE(*,*)
- DO, END DO
- DIMENSION A(??)
以下のプログラム例では,プログラムを作成する上で新しく出てきた部分のみを示しています.それ以外の必要な部分は各自考えてプログラムを完成させてください.
第7回目の演習では1次元の配列について説明した.すなわち
REAL, DIMENSION (5) :: A
と配列宣言すれば
A(1) | A(2) | A(3) | A(4) | A(5) |
のように,5つの配列要素ができる.そして
DO I = 1,5
READ(*,*) A(I)
END DO
のようにプログラムすれば,DO文で繰り返しが行われるごとにキーボードから入力した値が,それぞれA(1),A(2)・・・A(5)に代入される.
DIMENSION文の後の括弧内の数で配列の要素の数を定義していることは明らかであろう.これを配列の寸法と呼ぶ.
また,
REAL, DIMENSION (5,5) :: A
と配列宣言すれば
A(1,1) | A(1,2) | A(1,3) | A(1,4) | A(1,5) |
A(2,1) | A(2,2) | A(2,3) | A(2,4) | A(2,5) |
A(3,1) | A(3,2) | A(3,3) | A(3,4) | A(3,5) |
A(4,1) | A(4,2) | A(4,3) | A(4,4) | A(4,5) |
A(5,1) | A(5,2) | A(5,3) | A(5,4) | A(5,5) |
のように,5×5の配列要素ができる.ちょうど行列と同じイメージである.
よって,たとえば
REAL, DIMENSION (100,100) :: A
として,行列の行の数M
と列の数N
をキーボードから入力し(ただし100以下),以下のようにプログラムを組めば
DO I=1,M
DO J=1,N
READ(*,*) X
A(I,J)=X
END DO
END DO
それぞれの配列要素に入力した数値が代入される.
また上記プログラムに続いて
DO I=1,M
WRITE(*,*) (A(I,J), J=1,N)
END DO
とすれば,どうなるかを各人確認してください.
ただし,入力した行列とその転置行列は別の配列要素になるものとする.
REAL, DIMENSION (10,10) :: A, T
すなわちA(10,10)の配列に行列の要素がキーボードから入力され,その転置行列はT(10,10)の配列の要素にA(10,10)の要素から代入される.行列の要素を具体的にキーボードから入力するのは1度だけです.
プログラムの中に必ず出てくるのは次の形です.この部分がないレポートは減点します.
T(?,?)=A(I,J)
?
の部分にはなにか変数が入ります.
PROGRAM REPORT_NO8
IMPLICIT NONE
REAL :: X
INTEGER :: I, J, M, N
REAL, DIMENSION (10,10) :: A, T
C 行列の行数と列数の読み込み
WRITE(*,*)'行列の行数を入力してください'
READ(*,*) M
WRITE(*,*)'列数を入力してください'
READ(*,*) N
C 行列の要素の読み込み
DO I=1, M
DO J=1, N
WRITE(*,*) I, '行' , J, '列の要素は'
READ(*,*) X
A(I , J) = X
END DO
END DO
C 入力した行列の表示
WRITE(*,*) '入力した行列は'
DO I=1, M
WRITE(*,*) (A(I, J), J = 1, N)
END DO
C 転置行列の計算
DO J=1, N
DO I=1, M
T(J, I) = A(I, J) この部分が一番重要!!!!!
END DO
END DO
C 転置行列の表示
WRITE(*,*) '転置行列は'
DO J=1, N
WRITE(*,*) (T(J, I), I = 1,M)
END DO
STOP
END PROGRAM REPORT_NO8
数名の人が以下のようにプログラムを作成していました.
DO I=1,M
DO J=1,N
WRITE(*,*)I,'行',J,'列の要素は?'
READ(*,*)X
A(I,J)=X
T(J,I)=X
END DO
END DO
これでは意味が無いので減点しています.
大半の人が以下のようにプログラムを作成していました.
DO I=1,M
DO J=1,N
WRITE(*,*)I,'行',J,'列の要素は?'
READ(*,*)X
A(I,J)=X
T(J,I)=A(I,J)
END DO
END DO
全くの間違いではないので採点していますが,解答例のプログラムの組み方を理解しておいてください.
All rights reserved.