火曜日3,4限

環境・建設計算機実習T


アルゴリズムの基礎(FORTRAN演習)  配列


※プログラムのコンパイルと実行はUNIXの基礎、プログラムの実行手順を参考にすること


 一般の計算においては、単純な変数の他に、ベクトルや行列の場合のように変数に添え字をつけて用いることがよくある。ベクトルや行列は順序づけて並べられたいくつかの値を変数と考えられ、FORTRANではそれをいままで使用してきた変数と区別ために配列と呼んでいる。ここでは、配列の取り扱い方について説明する。

1.配列の概念 (別ページ)

(1) 変数の限界

(2) 配列の考え方

(3) 配列の効用

(4) 配列を用いたプログラム例

 

2.配列の宣言

 配列を使用するに際しては、配列の性質を宣言しなければならない。それはDIMENSION文と呼ばれる宣言文を用いておこなわれる。DIMENSION文の一般形は次のとおり。

DIMENSION a1 ( d1, d2,…, dm), a2 (d1, d2,…, dn), …

ここで、aiは配列名で、ai(d1,…,di)を配列宣言子、diを寸法宣言子という。

1つのDIMENSION文には複数の配列宣言子を記入することができ、その場合、配列宣言子の間はカンマで区切る。DIMENSION文は非実行文であり、実行文よりも前に位置しなければならない。

次に配列の性質に関することを説明する。

 

(1) 配列名および型

配列名には英字を用いる。配列は変数と同じように型を持ち、型は配列名の付け方によって決まる。例えば暗黙の型宣言のとおり配列名の頭文字がI,J,K,L,M,Nで始まれば、その配列は整数型となり、それ以外は実数型となる。

 

(2) 配列の次元と大きさ

配列宣言子中に指定される寸法宣言子diの数が配列の次元を決定する。diの数が1個ならば1次元配列、2個ならば2次元配列である。寸法宣言子はカンマで区切って並べる。

寸法宣言子にdiには下限と上限があり、それらは整定数によって表現される。その表現形式は次のとおり。

Ld:Ud

 ここでLdを寸法の下限、Udを寸法の上限といい、それらは整定数によって表現される。UdはLdと等しいかそれよりも大きくなければならない。UdとLdの差

Ud-Ld+1

が各次元の大きさを決定する。

 

(3) 具体的な例

次の例を用いて、DIMENSION文を具体的に説明する。

DIMENSION ABC(-5:5)

配列名はABCなので、この配列は実数型である。寸法宣言子の個数は1個なので、配列の次元は1次元である。寸法の下限は-5、上限は+5である。この配列宣言によって、配列要素

ABC(-5), ABC(-4),…, ABC(0),…, ABC(4), ABC(5)

の合計11個が、記憶領域中に確保される。

 配列要素の下限が1の場合に限り、寸法宣言子の下限を省略することができる。

この場合、寸法宣言子1:5を5と省略し、

DIMENSION ABC( 5 )

と宣言してもよい。

次に多次元の配列の例を示す。

DIMENSION N( 5, 7 ), X( 2, 5, 0: 5 )

配列N、Xはそれぞれ2次元、3次元配列であり、前者は整数型、後者は 実数型である。配列Nの2つの寸法宣言子5,7は、それぞれ1:5、1:7の省略形である。配列Xの最初の2つの寸法宣言子も省略されている。配列要素の 個数は、各次元の大きさ(Ud-Ld+1)を掛け合わせた値である。配列Nの配列要素数は35個、配列Xは60個である。

 

3.配列要素の引用(添字式)

配列要素は変数と全く同じはたらきをするので、変数に変えて配列を用いることができる。実行分の中で配列要素を使用(引用)する方法をここでは述べる。

配列Nを次のように宣言する。

DIMENSION N( -1:1, -2:2 )

この宣言によって確保される15個の配列要素の記憶領域は、概念的に下図のように示すことが出来る。

図-4 配列Nの記憶領域の概念図

縦:1番目の寸法宣言子、横:2番目の寸法宣言子)

配列Nの個々の要素は N(S1,S2)という形式で実行文の中で引用することができる。ここで、(S1,S2)は添字であり、Siを添字式と呼 び、整数式で指定する。整数式とは演算結果が整数型の値になるような算術式をいう。添字式には整数型の配列要素および関数を含んでもよいが、整定数だけで あってもよい。添字式Siの値は、寸法宣言子の寸法の下限Ldと上限Udの範囲(Ld<=Si<=Ud)でなければならない。

配列Nの引用の例として、添字式を整定数とする場合を考える。

いま、3つの配列要素、N(-1, -2), N(0, 0), N(1, 2)はそれぞれ図-4のA,B,Cの記憶場所を占める。また添字式をI+JとK-Lとし、I,J,Kがそれぞれ3,-2,1,3の値を持つならば、配列要 素 N(I+J, K-L)はDの記憶場所を占める。

 

 

4.配列要素を用いた入出力

(1) DO形並び

配列要素を用いてデータを入出力する場合、次に示すように、変数と全く同じように個々の配列要素を入出力文の並び項目に記載することができる。

READ(5,*) A(1), A(2), A(3), A(4), A(5)

READ(5,*) B(1,0), B(1,1), B(1,2)

しかし、現実的な配列要素の入出力に関してはDO形並びと呼ばれる方法がよく用いられる。上記の入出力文はこおDO形並びを用いて、次のように書き換えることができる。

READ(5,*) ( A(I), I=1, 5, 1 )

READ(5,*) ( B(1,J),J=0, 2, 1 )

かっこ( )で囲まれた部分がDO形並びであり、配列要素A(1)からA(5)まで、およびB(1,0)からB(1,2)までを繰り返して引用する。

DO形並びの一般形は次のとおり。

( dlist, v= e1, e2, e3 )

DO形並びの機能はDO文の機能と全く同じである。dlistは入出力並びであり、それは複数個の変数や配列要素を記述してもよい。また、dlistはDO形並びを階層的に含んでもよい。DO形並びにおけるDO変数vは、DO形並びの中だけしか効力を持たない。

 

(2) 2次元配列に関する入出力

 2次元配列に関する入出力については、DO文とDO形並びの入出力を併用するのがよい。データを入力し、そのまま出力するという単純なプログラム例を示す。

      program test4
        dimension n(4,5)
        do i1=1,4
          read(5,*) (n(i1, j1), j1=1,5)
        end do
        do i2=1,4
          write(6,*) (n(i2, j2), j2=1,5)
        end do
        stop
        end

図-5 2次元配列の入出力プログラム例

 


5.課題