フォートランにはデフォルトでいくつかの関数が用意されているが,ユーザー
が独自に関数を定義して用いたい場合は「関数副プログラム」というものをつかって関数を定義することが出来る.使い方は
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)
integer i,n
souwa=0
do i=1,n
souwa=souwa+i
enddo
return
end
integer souwa
read(5,*) n
write(6,*) souwa(n)
end
注意点
- 関数副プログラムを定義する部分では()はつかない(関数の名自体に値が入る)
- 関数副プログラムを使用する時は, 定義した時と同じ型をで関数名を宣言する必要がある
練習問題1
1) n!を計算する関数副プログラム fact(n)を作成せよ.
2) n個のものからm個のものを取り出す組み合わせの数 nCmを計算する関数副
プログラムを作成せよ.
3) 二項定理によると,f(x,y,n)=(x+y)**nは
(x+y)**n=ΣnCm x**(n-m)y**m
となる.f(x,y,n)を計算する関数副プログラムを作り,x=0.3,y=0.7,n=10として実行し,結果が1.0になることを確かめよ.
プログラム中で同じ処理を何度も行いたい場合がよくある.そのたびごとに同
じプログラムを何度も書くのは馬鹿げている.同じ処理はサブルーチンとして
別のユニットにしておくと都合がよい.
主プログラムと独立に次のように書く. subroutine文以下endまでがサブルーチンである.
c main program
real*8 d(10)
......
call S(f,g,d)
......
end
subroutine S(a,b,c)
real*8 a,b,c(10)
......
......
return
end
サブルーチン文 |
S(a,b,c) |
サブルーチンの定義をおこなう |
S |
サブルーチン名:英文字で始まる6文字以内の英数字 |
a,b,c |
仮引数:使う変数は型宣言すること |
call 文 |
call S(f,g,d) |
サブルーチンを呼び出す |
f,g,d |
実引数:仮引数と順序, 型を一致させる必要あり |
サブルーチンはend文で終わらなければならない.サブルーチンから主プログラムに戻る場所では
return
を書く.return文は何個あってもよい(endは一個:end文のみでreturn文がない場合はendで呼ばれた場所に戻る).それでは次のプログラム
を入力して実行してみよう.
プログラム1
c main program
real*8 a,b,c
a=1.D0
b=2.D0
call wa(a,b,c)
write(6,*) c
end
c subroutine
subroutine wa(a,b,c)
real*8 a,b,c
c=a+b
return
end
呼ぶ方(call wa(a,b))と呼ばれる方(subroutine wa(a,b))の引数は順序,個数,型を一致させなければならない.逆に言うと,引数の個数,型が一致していれば名前は違っていてもよい.サブルーチンを使う場合は, サブルーチンとの変数, 配列のやりとりに注意すること.
どれが入力でどれが出力かを頭にいれてプログラムを作成すること.
次のプログラムは何をするのか考えてみよう.
プログラム2
c main program
real*8 a,b,c,d,e
a=1.D0
b=2.D0
d=3.D0
e=4.D0
call wa(a,b,c)
write(6,*) c
call wa(d,e,c)
write(6,*) c
end
subroutine wa(a,b,c)
real*8 a,b,c
c=a+b
return
end
練習問題2
以下のプログラムを正しく修正せよ.
c 2-1
real*8 a,b
a=1.D0
b=2.D0
call wa(a,b)
write(6,*) b
end
subroutine wa(a,b,c)
real*8 a,b
b=a+b
return
end
c 2-2
real*8 a,b
a=1.D0
b=2.D0
call wa(a,b)
write(6,*) b
end
subroutine wa(a,b)
integer a,b
b=a+b
return
end
c 2-3
real*8 a(2),b
a(1)=1.D0
a(2)=2.D0
b=0.D0
call wa(a,b)
write(6,*) b
end
subroutine wa(a,b)
real*8 a,b
b=a(1)+a(2)
return
end
練習問題3
プログラム2に, 二つの数の積を出力するサブルーチンを書き加えよ. これを用いて変数a,bの積および変数d,eの積を算出せよ.
練習問題4
先週の問題(大きい順に並び変えるプログラム)をサブルーチンを用いて改造せよ. データ読みとり部(subroutine input(m)), 入れ換え部(subroutine sort(m)), 出力部(subroutine output(m))と三つのサブルーチンに分割せよ. それぞれの役割がわかるようにコメント文を挿入しておくこと.