5章:配列
5.3 多次元配列
多次元配列を使うと、表形式などで表された複数のデータを格納することが可能になる。 Fortran90では、2次元配列から7次元配列までの多次元配列を使用できる。
多次元配列は行と列からなり、以下のように書く。
型名 :: 配列名(行番号、列番号)
(例)A(I,J)
行\列 | 1 | 2 | 3 | 4 | 5 | ‥ | J |
---|---|---|---|---|---|---|---|
1 | A(1,1) | A(1,2) | A(1,3) | A(1,4) | A(1,5) | ‥ | A(1,J) |
2 | A(2,1) | A(2,2) | A(2,3) | A(2,4) | A(2,5) | ‥ | A(2,J) |
3 | A(3,1) | A(3,2) | A(3,3) | A(3,4) | A(3,5) | ‥ | A(3,J) |
4 | A(4,1) | A(4,2) | A(4,3) | A(4,4) | A(4,5) | ‥ | A(4,J) |
5 | A(5,1) | A(5,2) | A(5,3) | A(5,4) | A(5,5) | ‥ | A(5,J) |
: | : | : | : | : | : | : | : |
I | A(I,1) | A(I,2) | A(I,3) | A(I,4) | A(I,5) | ‥ | A(I,J) |
■配列要素の順序
メモリに記憶される時の配列の順序は、行順なので注意する必要がある。
上表の例では、初期設定や代入、入出力の時に値をまとめて処理する場合、1列目の1行目(A(1,1))、1列目の2行目(A(2,1))、1列目の3行目(A(3,1))の順にA(I,1)までいき、その次に2列目の1行目(A(1,2))、2列目の2行目(A(2,2))と続く。
(例)
INTGER A(3,3)/11,12,13,14,15,16,17,18,19/
の場合、以下のようになる。
11 14 17
12 15 18
13 16 19
値11から19を
11 12 13
14 15 16
17 18 19
のように列順(横方向)に並べたい時は、以下のように書く。
A(1,1,3)=(/11,12,13/)
A(2,1,3)=(/21,22,23/)
A(3,1,3)=(/31,32,33/)
■部分配列
多次元配列の部分配列は添字三つ組で指定する。
(例)
A(3:6,7:8)
形状が(4,2)の2次元配列
A(1:7:2,3:9:3)
形状が(4,3)の2次元配列
![](img/chap5-04.gif)
■代入
多次元配列の代入は1次元配列のように配列構成子をそのまま使うことができないので、RESHAPEという組み込み関数を使って、1次元配列を多次元に配置しなおす必要がある。
(例)
RESHAPE(/(A,A=1,8),(/2,4/)/)
1 3 5 7
2 4 6 8 となる
(例1)
血液型のデータを以下のように読み込み、それぞれの血液型が何人いるかを表示する
- 最初に人数を入力
- A型は「1」、B型は「2」、O型は「3」、AB型は「4」と入力
- 血液型ごとの人数のカウントは関数として組み込む
PROGRAM REI5_1
IMPLICIT NONE
INTEGER A,N
INTEGER,ALLOCATABLE :: BTYPE(:)
PRINT*,"INPUT NINZU:"
READ*,N
ALLOCATE(BTYPE(N))
DO A=1,N
PRINT*,"INPUT BLOOD TYPE:",A
READ*,BTYPE(A)
END DO
PRINT*,"TYPE A :",TYPE_GOKEI(BTYPE,1)
PRINT*,"TYPE B :",TYPE_GOKEI(BTYPE,2)
PRINT*,"TYPE O :",TYPE_GOKEI(BTYPE,3)
PRINT*,"TYPE AB:",TYPE_GOKEI(BTYPE,4)
DEALLOCATE(BTYPE)
CONTAINS
INTGER FUNCTION TYPE_GOKEI(B,C) !血液型ごとの人数をカウントする
INTEGER,INTENT(IN) :: B(:),C 組み込み関数
INTEGER A
TYPE_GOKEI=0
DO A=1,UBOUND(B,1)
IF (B(A)==C) TYPE_GOKEI=TYPE_GOKEI+1
END DO
END FUNCTION TYPE_GOKEI
END PROGRAM REI5_1
(例2)
生徒10人の生徒番号(1~10)と国語、数学、英語の試験の点数を読み込み、合計点の総平均を求める。
- 「No.」に生徒番号を入力
- 「KAMOKU-1」に国語の点数を入力
- 「KAMOKU-2」に数学の点数を入力
- 「KAMOKU-3」に英語の点数を入力
PROGRAM REI5_2
IMPLICIT NONE
INTEGER,PARAMETER :: NINZU=10
INTEGER,PARAMETER :: KAMOKU=3
INTEGER : : A,B,GOKEI
INTEGER,DIMENSION(NINZU,KAMOKU) :: TENSU
REAL(8) :: HEIKIN
INTRINSIC ABLE
DO A=1,BANGO
WRITE(*,*) "No.",B
DO A=1,KAMOKU
WRITE(*,*) "KAMOKU-",A,":"
READ(*,*) TENSU(B,A)
END DO
END DO
GOKEI=0
DO A=1,KAMOKU
DO B=1,NINZU
GOKEI=GOKEI+TENSU(B,A)
END DO
END DO
HEIKIN=ABLE(GOKEI)/ABLE(NINZU*KAMOKU)
WRITE(*,*) "HEIKIN=",HEIKIN
STOP
END PROGRAM REI5_2