第8回目の演習

第8回目の演習で説明すること

注意

「難しくなってきた」とか「理解できない」と言う人がそろそろ増えてきましたが,

といった点をきちんと理解していけば,それほど難しくないはずです.

実際,今までに出てきたコマンドは

READ(*,*)
WRITE(*,*)
DO, END DO
DIMENSION A(??)
4つだけです.意外でしたか?あとは変数の取り扱い,計算の方法だけの問題です.

以下のプログラム例では,プログラムを作成する上で新しく出てきた部分のみを示しています.それ以外の必要な部分は各自考えてプログラムを完成させてください.


配列について

第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


とすれば,どうなるかを各人確認してください.


第8回目に課したレポート課題(件名: 学籍番号 report_no8

以下に示すステップで実行されるプログラムを作成せよ.
  1. 行列の行数と列数を入力(ただしそれぞれ10以下)
  2. その行列の要素を入力
  3. 入力した行列を表示
  4. その行列の転置行列を表示

ただし,入力した行列とその転置行列は別の配列要素になるものとする.

ヒント


   REAL, DIMENSION (10,10) :: A, T

すなわちA(10,10)の配列に行列の要素がキーボードから入力され,その転置行列はT(10,10)の配列の要素にA(10,10)の要素から代入される.行列の要素を具体的にキーボードから入力するのは1度だけです.

プログラムの中に必ず出てくるのは次の形です.この部分がないレポートは減点します.


T(?,?)=A(I,J)

?の部分にはなにか変数が入ります.


第8回目に課したレポートの解答


   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

全くの間違いではないので採点していますが,解答例のプログラムの組み方を理解しておいてください.


前のページへ戻る.
Copyright. 2022, Kazuya Sato

All rights reserved.