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次元配列

■代入

多次元配列の代入は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



<前へ   目次へ   次へ>

Copyright ©2008 JAMSTEC All Rights Reserved.