そのために、この関数を定義して、いつでも呼び出せるようにすると便利です。
あたかも、
のように
を入れれば、計算してくれるようにすれば非
常に便利です。一つの解決方法が文関数ですが、これは1行で関数を定義
する必要があるので、式(1)のようにIF文を使って、
場合分けが必要の時には使えません。文関数で定義できない複雑な関数を定義す
るときに、関数副プログラムを使います。
もう一度、文関数と関数副プログラムの違いをまとめておくと次のようになり ます。
メインルーチンを見るだけで、このプログラムの動作が分かると思います。関 数F(X)の値をX=0.5から0.1ステップで1.5まで計算して、書き出していると想 像できます。実際の関数は、関数副プログラムを見ればすぐに分かるようになっ ています。
関数F(X)はどこからでも使うこともでき便利です。同じ処理を何回も書かない ですむということです。これは、関数を変えたい場合、プログラムを書き直す のは1箇所で済みます。これにより、プログラムは分かりやすくなり、作成時 間も非常に短くできます。
*=======================================================
* MAIN ROUTINE
*=======================================================
PROGRAM MAIN
DO 10 X=0.5, 1.5, 0.1
Y=F(X)
WRITE(6,601) X,Y
601 FORMAT(2E20.8)
10 CONTINUE
STOP
END
*=======================================================
* USEER DEFINEDED FUNCTION
*=======================================================
FUNCTION F(X)
IF(ABS(X).LE.1.0)THEN
F=SQRT(1.0-X*X)
ELSE
F=0.0
ENDIF
RETURN
END
これを関数副プログラムを使わないで書くと、以下のようになります。これだ とプログラムの意図した内容がわかりにくく、保守が難しくなります。また、 長いプログラムを書く場合も大変です。
PROGRAM KEISAN
DO 10 X=0.5, 1.5, 0.1
IF(ABS(X).LE.1.0)THEN
Y=SQRT(1.0-X*X)
ELSE
Y=0.0
ENDIF
WRITE(6,601) X,Y
601 FORMAT(2E20.8)
10 CONTINUE
STOP
END
同様に、関数の戻り値の型と代入される変数の型も一致させる必要があります。
代入される変数=関数名(実引数並び)
ただし、関数の名前と型が暗黙の型宣言に従わない場合、呼び出し側でも型宣 言が必要である。たとえば、次のように場合である。
*=======================================================
* MAIN ROUTINE
*=======================================================
INTEGER WA
I=2
J=3
K=WA(2,3)
STOP
END
*=======================================================
* FUNCTION
*=======================================================
INTEGER FUNCTION WA(M,N)
WA=M+N
RETURN
END
仮引数並びと実引数並びは、同じ数で型でなくてはなりません。ただし、引数 の変数名は異なっても、何ら問題はありません。関数の処理の部分は、今まで 学習してきたFORTRANのプログラムを書けばよいのです。計算のみならず、 WRITE文やREAD文も書けます。ただし、最後に関数名に値を代入する必要があ ります。これが戻り値になります。
関数副プログラム内で使われた変数は、引数以外は全く、メインルーチンに影 響を及ぼしません。メインルーチンと同じ名前の変数が使われていても、その 結果が反映されることはありません。
関数の型 FUNCTION 関数名(仮引数並び)
宣言文
実行文(関数の値を求めるための処理)
関数名=処理の結果の関数の値
RETURN
END