PROGRAM EXERCISE12 IMPLICIT NONE INTEGER :: N DO N = 1, 30 PRINT *, "N = ", N, " N! = ", factorial(N) ! 下で定義された関数factorialを使って階乗を計算 END DO ! メインのプログラムはここまで CONTAINS ! このプログラムEXERCISE12に含まれている内部副プログラム FUNCTION factorial(n) !関数副プログラムfactorial、引数はn INTEGER, INTENT(IN) :: n ! 引数nは整数型でINTENT(IN)属性をつける(関数内で値を変更できない) INTEGER :: k DOUBLE PRECISION :: factorial ! 関数の戻り値は関数と同名の変数で倍精度実数型とした !階乗ではn>=0でしか計算できないので負の数が入力されたときのエラー処理 factorial = 0.0d0 IF(n .LT. 0) RETURN ! n<0であればこの時点でのfactorial(ゼロ)を返す(関数副プログラムを終了) factorial = 1.0d0 ! 初期値1をセット IF(n .EQ. 0) RETURN ! n=0の場合は 0! = 1 なので1を返して関数副プログラムを終了 ! ここまで来る処理はnが正の場合 ! 通常の方法で階乗を倍精度実数として計算 DO k = 1, n ! このDOループはn=0の場合は期待通りの振る舞いをしないため手前で例外的に処理をした factorial = factorial * DBLE(k) END DO RETURN ! n>0の場合はDOループで計算されたfactorialの値を返す END FUNCTION factorial END PROGRAM EXERCISE12