変数,配列を初期化する際に用いる.配列の場合,値の格納順序に注意(下の例を参照).DATA文は変数に値を「前もって」代入するだけなので,プログラム中で変更は可能.
data文 | data 変数名のリスト/値のリスト/,... |
implicit none integer i,j real*8 a(10),c(2,5),pi,e data pi,e/3.14159625D0,2.7182818D0/ data a/8*0.D0,1.D0,5.D-1/ data c/3*1.D0,7*1.D2/ write(6,*) 'pi=',pi,'e=',e do i=1,10 write(6,*) i,a(i) enddo do i=1,2 do j=1,5 write(6,*) i,j,c(i,j) enddo enddo end
配列をいくつも使用していて, そのサイズをすべて一度に変えたい場合がよくある. このときはparameter文を用いる. 先ほどのDATA文との大きな違いは, DATA文は変数の中に値が入るのに体し, PARAMETER文では定数名それ自体がある定数になる, ということにある. よってPARAMETER文で設定された値は変更することはできない. 構文は以下の通り.
parameter文 | parameter (定数名=定数) |
implicit none integer md1,md2 parameter(md1=2,md2=3) real*8 a(md1,md2)parameter文は実行文よりも前になければならない. 配列のサイズを設定したい場合にはその宣言文よりも前にある必要がある.
FORTRANには以下の組み込み関数が用意されている(この授業で用いる可能性があるもののみ. ). これらの関数はいつでも使用することができる. 関数の型と引数の型に注意すること. 引数が整数型なのに倍精度実数型を代入するとエラーになる.
関数 | 関数の名前 | 関数の型 | 引数の型 | 利用法 |
最大値 | max0 | integer | integer | i=max0(I1,I2,..) |
最大値 | dmax1 | real*8 | real*8 | d=dmax1(d1,d2,..) |
最小値 | min0 | integer | integer | i=min0(I1,I2,..) |
最小値 | dmin1 | real*8 | real*8 | d=dmin1(d1,d2,..) |
平方根 | dsqrt | real*8 | real*8 | d=dsqrt(d1) |
指数 | dexp | real*8 | real*8 | d=dexp(d1) |
自然対数 | dlog | real*8 | real*8 | d=dlog(d1) |
常用対数 | dlog10 | real*8 | real*8 | d=dlog10(d1) |
正弦 | dsin | real*8 | real*8 | d=dsin(d1) |
余弦 | dcos | real*8 | real*8 | d=dcos(d1) |
正接 | dtan | real*8 | real*8 | d=dtan(d1) |
逆正弦 | dasin | real*8 | real*8 | d=dasin(d1) |
逆余弦 | dacos | real*8 | real*8 | d=dacos(d1) |
逆正接 | datan | real*8 | real*8 | d=datan(d1) | 双曲線正弦 | dsinh | real*8 | real*8 | d=dsinh(d1) |
双曲線余弦 | dcosh | real*8 | real*8 | d=dcosh(d1) |
双曲線正接 | dtanh | real*8 | real*8 | d=dtanh(d1) |
剰余 | mod | integer | integer | i=mod(i1,i2) |
剰余 | dmod | real*8 | real*8 | d=dmod(d1,d2) |
絶対値 | iabs | integer | integer | i=iabs(i1) |
絶対値 | dabs | real*8 | real*8 | d=dabs(d1) |
符号つけ変え | isign | integer | integer | i=isign(i1) |
符号つけ変え | dsign | real*8 | real*8 | d=dsign(d1) |
切り捨て | dint | real*8 | real*8 | d=dint(d1) |
四捨五入 | dnint | real*8 | real*8 | d=dnint(d1) |
四捨五入して整数化 | idnint | integer | real*8 | i=idnint(d1) |
倍精度実数型から整数型へ変換 | idint | integer | real*8 | i=idint(d1) |
整数型から倍精度実数型へ変換 | dble | real*8 | integer | d=dble(i1) |
フォートランにはデフォルトでいくつかの関数が用意されているが,ユーザー が独自に関数を定義して用いたい場合は「関数副プログラム」というものをつかって関数を定義することが出来る.使い方は
t function f(a1,a2,....aN) ...... f=..... return end
function文 | f=.... | 関数副プログラムの定義をおこなう |
t | 型宣言:real*8, integerなど |
---|---|
a1,a2,...aN | 仮引数:型宣言をすること |
b=f(c1,c2,....cn)のように引数を代入して行う.
たとえば, 1からnまでの総和を求める関数副プログラムは
integer function souwa(n) implicit none integer i,n souwa=0 do i=1,n souwa=souwa+i enddo return end implicit none integer souwa,n read(5,*) n write(6,*) souwa(n) end
注意点
n!を計算する関数副プログラム fact(n)を作成せよ.
アポストロフィ(')で挟まれた文字列を文字定数という. 例:'hoge'
文字定数を格納するためには「文字型」の変数を宣言する必要がある.
文字型宣言文 | character a*10, b(2,2)*5,c |
a,b,c | 変数, 配列, 関数副プログラム名 |
---|---|
*10, *5 | 文字数の指定 |
implicit none character a*5 a='hoge' write(6,*) a end
スラッシュを二つ(//)書くことで 文字型変数や定数を連結することができる.
例:implicit none character a*5,b*10 a='hoge' b=a//'hoge' write(6,*) b end
文字列の一部を指定することができる. a(m:n)によって変数aの第m文字目からn文字目を表す. 配列の場合, a(k)(m: n)とすると, k番目の配列要素のm文字目からn文字目を指定する.
例:implicit none character x*10,y*4,z(3)*5 x='0123456789' y=x(3:6) z(1)(3:5)=x(1:3) write(6,*) x,' ',y,' ',z(1) end
関数名 | 意味 |
char(整数) | 整数値を文字に変換. I=0〜255の値から, その値に対応する文字に変換する. |
---|---|
ichar(文字型変数, もしくは文字定数) | 文字をコード表に対応する整数値に変換. |
index(a,b) | 文字列a中にある文字列bの位置(整数). 文字列bが見付からない場合は0を返す. |
len(文字型変数, もしくは文字定数) | 文字列aの長さ(整数). |
implicit none character a*10,b integer n,m,k a='abcdefghi' b=char(100) n=ichar('d') m=index(a,'de') k=len(a) write(6,*) b,n,m,k end
文字と整数値との間にはコード表によって対応関係がある. この整数値を用いて異なる文字の間の大小関係を定める . 比較には.eq., .ne., .gt., .ge., .lt., .le.を用いる.
例:implicit none character a,b a='c' b='c' if(a.eq.b) write(6,*) a,b end
同様にして, 文字列の大小の比較が行われる. 文字列の先頭の文字が異なる場合, それらの文字同士の大小で文字列 の大小を定める. 先頭の文字が同じ場合, 二文字目以降で最初に異なる文字の大小で大小関係を定める. 文字列の長 さが異なる場合, 短い方の文字列の後ろに空白文字を付け加えて比較する. 空白文字の整数値は32で, どの英数字よ りも小さい.
例: ABA□□ < ABC□□ < ABCDE