一連の順序づけられた値の集まり(ベクトルや行列など)に名前をつけたものを配列といい、この名前を配列名といいます。また、配列の各要素を配列要素といい、配列名のあとに添字をつけて表します。添字は配列要素の位置を示す添字式(定数、変数、式を次元数だけカンマで区切り、( )で括ったもの )です。
配列を使用する時は、型宣言文で配列宣言子を用いて配列の次元数や寸法(添字式の値の範囲)を宣言しておかなければなりません。
配列の宣言は、
型宣言 配列宣言子のように記述します。配列宣言子は次に示すものです。
配列名([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 の装置に出力します。
例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 nlist/clist/nlist は並びで、値を設定する変数や配列や do型並びなどをカンマで区切って記述したものです。
次に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 s c=e1, e2 [,e3] .. ←────┐ doの範囲 .. │ do文の次の文から .. │ 文番号 s の端末文までを s continue ←────┘ 繰り返し実行するdo文では、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 があれば、その位置を求め、なければゼロとする |
プログラムの中で関数を使用していると、用意されている関数の定義を翻訳時に呼び出して結合し、実行形式ファイルを作成します。