fortran で演算をするとき,計算が行われる順序は以下の通りとなります.
以下のプログラムを実行し,結果を検討してみよう.
implicit none write(*,*) 4 + 2 * 3 write(*,*) 12/3*2 write(*,*) 2**3**2 write(*,*) (2**3)**2 end
1.D0 2.D0 3.D0 4.D0 5.D0
と縦に並んだデータをファイル(retsu.datとする)から読み, 配列a(5)に格納するプログラム例:
implicit none integer i double precision a(5) open(1,file='retsu.dat') do i=1,5 read(1,*) a(i) write(*,*) a(i) enddo end
1.D0 2.D0 3.D0 4.D0 5.D0
と横に並んだデータをファイル(gyou.datとする)から読み, 配列a(5)に格納するプログラム例:
implicit none double precision a(5) integer i open(1,FILE='gyou.dat') read(1,*) (a(i),i=1,5) write(*,*) (a(i),i=1,5) end
配列の要素を指定する番号は複数あってもよい. 二つになると二次元配列となり, 三つになると三次元配列となる. FORTRANでは7次元の配列まで使用可能である.
二次元配列の宣言:
宣言文 配列名(寸法の下限:寸法の上限, 寸法の下限:寸法の上限)
double precision a(10,10)
a(1,1)からa(10,10)まで要素を100個持つ倍精度実数型二次元配列を宣言
integer i(2,-1:8)
i(1,-1)からi(2,8)まで要素を20個もつ実数型二次元配列を宣言
二次元配列を使ったプログラム例:implicit none integer a(5,5),b(5,5),c(5,5),n,i,j n=0 do i=1,5 do j=1,5 n=n+1 a(i,j)=0 b(i,j)=n enddo enddo do i=1,5 do j=1,5 c(i,j)=b(i,j) enddo enddo do i=1,5 write(*,*) (a(i,j),j=1,5) enddo write(*,*) do i=1,5 write(*,*) (b(i,j),j=1,5) enddo write(*,*) do i=1,5 write(*,*) (c(i,j),j=1,5) enddo end
以下の数値をファイル matrix.dat にコピーする.それぞれの数値を二次元配列a(2,3)に格納するプログラムは以下のとおり.
1.D0 2.D0 3.D0 4.D0 5.D0 6.D0
implicit none double precision a(2,3) integer i, j open(1,file='matrix.dat') do i = 1, 2 read(1,*) (a(i,j), j = 1, 3) end do do i = 1, 2 write(*,*) (a(i,j), j = 1, 3) end do end
プログラム中で条件分岐を行いたいときはIF文を用いる. 基本の形を以下にしめす.
if(b) 実行文
bには論理式または算術関係式がはいります(算術関係式は下に説明. 論理式は後日説明します. ).この形式だとbが真の場合にのみ実行文が行われ,それ以外だと何もせず次に制御が移ることになります.
if(b) then 実行文 endif
基本的に上とおなじ. 実行文が二行以上になる時.
if(b) then 実行文 1 else 実行文 2 endif
上の形式では,もしbが真であれば実行文1が行われ,偽であれば実行文2が行 われます.実行文2にもあてはまらない場合をさらに場合分けしたいときはさらにブロックを重ねることができます.
if(b) then 実行文 1 else if(c) then 実行文 2 else 実行文3 endif
この場合は, もしbが真であれば実行文1が行なわれます. 偽の場合はさらにcによって条件がわかれ, 真の場合は2が, 偽の場合は3が実行されます. このif-elseブロックはいくらでも重ねることができます.
「かつ」「または」は以下の構文で可能となる.
かっこで囲まない限り,算術関係式 > and > or の順で評価が行われる.同じ順位のものがあった場合は左から順に行われる.
たとえば,以下のプログラムはキーボードから入力した値が10.以上ならその値を画面に表示させるプログラムである.
implicit none double precision a read(*,*) a if(a >= 1.D1) then write(*,*) a endif end
このプログラムを作成して実行してみよ.
以下のプログラムは,キーボードから整数を二つ(n(1)とn(2))改行して入力し,n(1)がn(2)で割り切れる場合はn(1)を画面に表示させるプログラムである.
implicit none integer n(2),i do i=1,2 read(*,*) n(i) enddo if( mod( n(1), n(2) ) == 0 ) write(*,*) n(1) end
以下のプログラムは何をするだろうか? 上から4行目のread文は,スペースを挟んで横に並んだデータを読み込む時の形式である.
implicit none integer n(2),i read(*,*) (n(i),i=1,2) if(n(1) > n(2)) then write(*,*) n(1) else write(*,*) n(2) endif end