フォートランにはデフォルトでいくつかの関数が用意されているが,ユーザー が独自に関数を定義して用いたい場合は「関数副プログラム」というものをつかって関数 を定義することが出来る.使い方は
t function f(a1,a2,....aN) ...... f=..... return end
function文 | f=.... | 関数副プログラムの定義をおこなう |
t | 型宣言:double precision, 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(*,*) n write(*,*) souwa(n) end
注意点
n!を計算する関数副プログラム fact(n)を作成せよ.
プログラム中で同じ処理を何度も行いたい場合がよくある.そのたびごとに同じプログラムを何度も書くのは馬鹿げている.同じ処理はサブルーチンとして外部手続きとしておくと都合がよい.
サブルーチンを呼び出す側のプログラムは「主プログラム(main program)」と呼ばれる.サブルーチンは主プログラムのend文以降に,主プログラムと独立に次のように書く. subroutine文以下endまでがサブルーチンである.
! main program implicit none double precision d(10),f,g ...... call S(f,g,d,10) ...... end subroutine S(a,b,c,n) implicit none integer n double precision a,b,c(n) ...... ...... return end
サブルーチン文 | S(a,b,c,n) | サブルーチンの定義をおこなう |
S | サブルーチン名:英文字で始まる31文字以内の英数字 |
---|---|
a,b,c | 仮引数:使う変数は型宣言すること |
call 文 | call S(f,g,d,n) | サブルーチンを呼び出す |
f,g,d | 実引数:仮引数と順序, 型を一致させる必要あり |
---|
サブルーチンはend文で終わらなければならない.サブルーチンから,呼ばれた場所に強制的に戻るには
returnを書く.return文は何個あってもよい(endは一個:end文のみでreturn文がない場合はendで呼ばれた場所に戻る).それでは次のプログラム を入力して実行してみよう. プログラム2-1
! main program implicit none double precision a,b,c a = 1.D0 b = 2.D0 call wa(a,b,c) write(*,*) c end ! subroutine subroutine wa(a,b,c) implicit none double precision a,b,c,d c = a + b d = a * c ! このdの値はメインプログラムに渡されない return end呼ぶ方(call wa(a,b))と呼ばれる方(subroutine wa(a,b))の引数は順序,個数,型を一致させなければならない.逆に言うと,引数の個数,型が一致していれば名前は違っていてもよい.サブルーチンを使う場合は, サブルーチンとの変数, 配列のやりとりに注意すること.どれが入力でどれが出力かを頭にいれてプログラムを作成すること. カッコの中に含まれている変数配列のみがメインプログラムとやりとりされることに注意. 次のプログラムは何をするのか考えてみよう.
! main program implicit none double precision a,b,c,d,e a=1.D0 b=2.D0 d=3.D0 e=4.D0 call wa(a,b,c) write(*,*) c call wa(d,e,c) write(*,*) c end subroutine wa(a,b,c) implicit none double precision a,b,c c=a+b return end
プログラム2-3
implicit none double precision a,b a=1.D0 b=2.D0 call wa(a,b) write(*,*) b end subroutine wa(a,b,c) implicit none double precision a,b b=a+b return end
プログラム2-4
implicit none double precision a,b a=1.D0 b=2.D0 call wa(a,b) write(*,*) b end subroutine wa(a,b) implicit none integer a,b b=a+b return end
プログラム2-5
implicit none double precision a(2),b a(1)=1.D0 a(2)=2.D0 b=0.D0 call wa(a,b) write(*,*) b end subroutine wa(a,b) implicit none double precision a,b b=a(1)+a(2) return end
プログラム2-3を,二つの数の積を計算するサブルーチンに書きかえよ. これを用いて変数a,bの積(答えは2.D0)を算出せよ.
変数a,bに代入された値を入れ替えるサブルーチンswap(a,b)を作成せよ.サブルーチンに変数a,bが代入され,実行後はa,bの中身が入れ替わる.a, bは実数とする.
実数が10個格納された配列a(10)を,a(1)から大きい順に並べ替えるサブルーチンsort(a)を作成せよ.サブルーチンには配列aが代入され,実行後は配列aの中身が大きい順に入れ替わっている.