配列、繰り返し



○配列と配列要素について

 

 一連の順序づけられた値の集まり(ベクトルや行列など)に名前をつけたものを配列といい、この名前を配列名といいます。また、配列の各要素を配列要素といい、配列名のあとに添字をつけて表します。添字は配列要素の位置を示す添字式(定数、変数、式を次元数だけカンマで区切り、( )で括ったもの )です。
 配列を使用する時は、型宣言文で配列宣言子を用いて配列の次元数や寸法(添字式の値の範囲)を宣言しておかなければなりません。

 配列の宣言は、

        型宣言  配列宣言子
のように記述します。配列宣言子は次に示すものです。

        配列名([l1:] u1, [l2:] u2, ・・・,[ln:] un) 
 l は寸法の下限、u は寸法の上限で、l が1の時は省略できます。[l:] u を次元の数だけカンマ , で区切って指定します。使用できるのは7次元までです。

 次に配列宣言の例を示します

 例1)
             integer  mmt(12)

 integer文を用いて、1 から 12 の寸法をもつ1次元の配列 mmt を整数型と宣言しています。配列要素は、mmt(1), mmt(2), ... , mmt(12) の12個です。

 例2)
             real  con(-150:150) 

 real文を用いて、-150 から 150 の寸法をもつ1次元の配列 con を実数型と宣言しています。配列要素は、con(-150), ... ,con(-1),con(0),con(1), ... ,con(150) の301個です。

 例3)
             character  himoku(20)*12

 character文を用いて、1 から 20 の寸法をもつ1次元の配列 himoku を文字の長さ 20 の文字型と宣言しています。配列要素は、himoku(1), himoku(2), ... , himoku(20) の20個です。

 例4)
             real  x(5,10) 

 real文を用いて、1から5と、1から10の寸法をもつ2次元の配列 x を実数型と宣言しています。配列要素は、

             x(1,1), x(1,2), ... , x(1,10),
             x(2,1), x(2,2), ... , x(2,10),
                     :
             x(5,1), x(5,2), ... , x(5,10)
の5×10個で、 配列要素の順番は、縦の順に x(1,1), x(2,1), ... ,x(1,2), x(2,2), ... x(1,10),x(2,10), ... ,x(5,10)と並んでいます。

 例5)
             real  y(5,7:12) 

 real文を用いて、1から5と、7から12の寸法をもつ2次元の配列 y を実数型と宣言しています。配列要素は、

             y(1,7), y(1,8), ... ,y(1,12),
             y(2,7), y(2,8), ... ,y(2,12),
                     :
             y(5,7), y(5,8), ... ,y(5,12)
の5×6個で、配列要素の順番は、縦の順に y(1,7), y(2,7), ... ,y(1,8), y(2,8), ... y(1,12),y(2,12), ... ,y(5,12)と並んでいます。


 次に実行文の中で配列要素を使用する例を示します。

 例1)
             mmt(i) = 0

 配列要素 mmt(i)にゼロを代入します。

 例2)
             mmt(mm) = mmt(mm) + 1

 配列要素 mmt(mm) の値に1を足し、その結果を同じ配列要素 mmt(mm)に代入します。

 例3)
             mmt(i+1) = mmt(i-1) + mmt(i)

 配列要素 mmt(i-1) と mmt(i) の値を足して結果を配列要素 mmt(i+1) に代入します。

 例4)
             write(6,*) j,mmt(j)

 変数j と配列要素 mmt(j) の値を自由書式で装置番号 6 の装置に出力します。


入出力文での配列の指定方法について

◎ read文や write文の並びに記述された配列名(添字式の無いもの)は、その配列のすべての配列要素を要素順に並べたものを意味します。
 例1)
             integer  mmt(12) 
               (略)
             read(*,*)  mmt

 配列 mmtのすべての配列要素に、配列要素の順番(mmt(1)からmmt(12)まで)にしたがって値を読み込みます。

 例2)
             real  x(5,10)
               (略)
             write(*,*)  x

 配列 x のすべての配列要素の値を、配列要素の順番( x(1,1),x(2,1),x(3,1),x(4,1),x(5,1), x(1,2),x(2,2), ... ,x(4,10),x(5,10) )にしたがって出力します。

◎ do形並びの指定方法は、連続した配列要素の一部分を示します。

 一般記述形式は次のとおりです。

        (並び,c=e1,e2,e3)

 ( )で括って繰り返しの範囲を指定します。 c=e1,e2,e3 do文の繰り返し方の指定と同じです。制御変数 c について e1 から e2 まで増分 e3 で繰り返します。

 例1)
             write(*,*)  (mmt(j),j=1,nmax)

 mmt(1),mmt(2),..,mmt(nmax)の順に配列要素の値を自由書式で標準出力装置に出力します。 制御変数jにまず 1の値が設定されて mmt(1)、次に j=j+1 が実行されて mmt(2)、また次に j=j+1が実行されて mmt(3)、同様に、mmt(nmax) まで繰り返します。

 例2)
             write(6,314)  (con(k),k=nm,mm)

 配列con の配列要素の値を con(nm),con(nm+1),con(nm+2),..,con(mm-1),con(mm) の順に、文番号 314 で指定した書式仕様で装置番号 6 の装置に出力します。

 例3)
             write(6,211)  (j,mmt(j),j=1,nmax)

 1,mmt(1),2,mmt(2),..,nmax,mmt(nmax) の値を 文番号 211 で指定した書式仕様で装置番号 6 の装置に出力します。

 例4)
             write(*,*)  ((x(i,j), j=1,10), i=1,5)

 配列x の配列要素の値を x(1,1),x(1,2),x(1,3),..,x(1,10),x(2,1),x(2,2),x(2,3), ..., x(5,9),x(5,10) という順に、自由書式で標準出力装置に出力します。



○宣言文

・data文

 data文は変数や配列に初期値を設定する時に使用します。data文はプログラムの翻訳時に解釈され、指定した変数や配列に指定した値を設定します。実行時にはすでに値が設定されていて、data文は何もしませんので実行文ではありません。
 data文は次のように記述します。

     data  nlist/clist/
 nlist は並びで、値を設定する変数や配列や do型並びなどをカンマで区切って記述したものです。
 clist は、nlistで指定した項目の対応する値(定数値)を項目数だけカンマで区切って記述したものです。同じ定数値を複数個並べる代わりに「個数*定数値」と指定できます。nlist/clist/ の記述をカンマで区切って並べることができます。

 次にdata文の例を示します。

             integer  a,b,c
             real  d(20)
             data a,b/1,0/, d/20*0/

 整数型変数 a に 1 を b に 0 を初期値として設定し、 実数型配列 d のすべての要素(要素数 20)に初期値としてゼロを設定します。



○繰り返し

・do文

 ある処理を繰り返し行う時には do文を使用します。do文は次のように記述します。

         do  s  c=e1, e2 [,e3] 
            ..           ←────┐  doの範囲
            ..                     │    do文の次の文から
            ..                     │    文番号 s の端末文までを
     s   continue        ←────┘    繰り返し実行する
 do文では、do文の範囲と繰り返し方を記述します。
s :do文の範囲の最後の文(端末文)の文番号
c :do変数でdoの繰り返し方を指定、doの範囲では c の値は変更できない
e1,e2,e3:式
e1 :c の初期値
e2 :c の終値
e3 :c の増分値(1の時は省略可)
 e3 が正の時は、 e2 ≧ e1
 e3 が負の時は、 e2 ≦ e1
 e3 が正の場合の do文では、do変数 c に初期値 e1 を設定し、c≦e2 なら doの範囲を実行します。次に、c=c+e3 を実行し、c≦e2 ならまたdoの範囲を実行します。このように do文は、c=c+e3 を実行しては c≦e2 の間は doの範囲を繰り返し実行し、c>e2になった時は、端末文の次の文に実行を移します。e3 が負の場合は c≧e2 の時にdoの範囲を実行します。

 次に do文の使用例を示します。

     
 例1)
             real ・・・,dd(15),・・・
               (略)
             do  20  i=1, n
               read(*,*)  dd(i)
          20 continue
 例2)
             real ・・・,dd(15),・・・
               (略)
             read(*,*)  (dd(i),i=1,n)

 例1、例2とも配列要素 dd(1)からdd(n)までデータを読み込みます。但し、データの入力の仕方が異なります。例1では1つの read文でデータを1つ読み込むので、データを1行に1つずつ入力します。

 例3)
             real dd(20), c(50)
                 (略)
             do  310  i=13, 1, -1
                dd(i)=c(i+25)+c(i)
         310 continue 

 増分値が負の例です。 dd(i)=c(i+25)+c(i) の実行を do変数 i の値を 13 から 1 まで 1 づつ減らして繰り返します。

 例4)
                   real  yokot(5),x(5,10)
                        (略)
                        do  100  i=1, 5
                          yokot(i)=0.0
                          do  110  j=1, 10
                    110    yokot(i)=yokot(i)+x(i,j)
                    100 continue

 表の横の集計をするような時に使用する例です。配列 x の横に並んでいる10個の配列要素の値の合計を配列 yokot の対応する配列要素に格納します。外側の do は doの範囲(配列要素 yokot(i)に初期値としてゼロを代入し、内側のdoを実行する)を do変数i について1から5まで繰り返します。内側の do は do変数 jを使用して配列要素yokot(i)に x(i,1)+x(i,2)+…+x(i,10) を求めています。



○組込み関数

 Fortranには、組込み関数と呼ばれる関数が用意されています。関数は式の中で使用されます。関数を使用する時は 関数名(引数)、例えば cos(x)という形で記述します。引数( cos(x) の場合は x を指す)は定数や変数あるいは式で指定します。

 次に用意されている組込み関数を示します。

組込み関数
関数の一般形 意味
int(x) 実数 x の少数点以下を切り捨てて整数の値にする
nint(x) 実数 x の少数点以下を四捨五入して整数の値にする
real(i) 整数 i を実数の値にする
mod(x1,x2)x1 を x2 で割った時の余りを求める
max(x1,x2,...)x1、x2、...の中の最大値を求める
min(x1,x2,...)x1、x2、...の中の最小値を求める
sqrt(x)実数 x の平方根を求める
abs(x)実数 x の絶対値を求める
cos(x)実数 x の余弦を求める(xの単位はラジアン)
sin(x)実数 x の正弦を求める(xの単位はラジアン)
tan(x)実数 x の正接を求める(xの単位はラジアン)
len(c)文字列 c の長さ(整数)を求める
ichar(c)文字列 c の文字コードの値(整数)を求める
char(i)整数 i を文字コードとする文字を求める
index(c1,c2) 文字列 c1 の中に文字列 c2 があれば、その位置を求め、なければゼロとする
i,x,x1,x2,c,c1,c2は、引数

 プログラムの中で関数を使用していると、用意されている関数の定義を翻訳時に呼び出して結合し、実行形式ファイルを作成します。