情報基礎演習Ⅰ

情報基礎演習Ⅱ
第8回 演習
担当 光武 雄一
授業のWebsite: http://web.me.saga-u.ac.jp/~mitutake/info2/info2.html
メールアドレス: [email protected]
第8回 演習内容




復習 サブルーチンと呼び出し側プログラムの記述法
データの並び替え
分数の計算 (教科書P.125)
組立除法(教科書P.126)
サブルーチンの呼び出し側
プログラムでの記述方法
★メインプログラムでの型宣言
メインプログラムで使用する変数の型宣言文(サブルーチン側の型宣言と同じ)
INTERFACE
SUBROUTINE サブルーチン名(仮引数の並び)
IMPLICIT NONE
型名,INTENT(IN) : : 仮引数の中で入力のために用いる引数の並び
型名,INTENT(OUT) : : 仮引数の中で出力のために用いる引数の並び
型名,INTENT(INOUT) : : 仮引数の中で入力と出力の両方に用いる引数の並び
END SUBROUTINE サブルーチン名
END INTERFACE
必要に応じて
使い分ける
★メインプログラムからのサブルーチンの呼び出し方法
CALL サブルーチン名(実引数の並び)
(注意)
引数とは,呼び出し側プログラムと副プログラムとの間で引き渡される数値或いは変数のこと.
仮引数とは,副プログラムの定義のために用いる引数のこと.
実引数とは,副プログラムを実際に使用するときに値を渡すために用いる引数のこと.
メインプログラムと副プログラムでの変数は,それぞれ独立して管理される,各プログラム単位で使用
する変数は,各プログラムでそれぞれ型宣言して使用しなければならない.同じ変数名でも,メインプ
ログラムと副プログラムでは,独立な変数として取り扱われる.
サブルーチン側の記述方法
★サブルーチンのプログラム記述
SUBROUTINE サブルーチン名(仮引数の並び)
IMPLICIT NONE
型名,INTENT(IN) : : 仮引数の中で入力のために用いる引数の並び
型名,INTENT(OUT) : : 仮引数の中で出力のために用いる引数の並び
型名,INTENT(INOUT) : : 仮引数の中で入力と出力の両方に用いる引数の並び
必要に応じて
使い分ける
サブルーチンの中で用いるローカル変数の型宣言文
サブルーチンの処理内容を記述
RETURN
END SUBROUTINE サブルーチン名
サブルーチンは,独立したプログラム
単位なので,メインプログラムと同様に
サブルーチン内で使用する変数の
型宣言文が必要
仮引数はINTENT文とともに型宣言
(注意)メインプログラムと副プログラムでの変数はそれぞれ独立して管理される,それぞ
れのプログラム単位の中で使用する変数は,各プログラムで 型宣言して使用しなけ
ればならない.例え同じ変数名であっても,メインプログラムと副プログラムでは,独立
な変数として取り扱われる.
サブルーチンの記述上の注意1

サブルーチン名
サブルーチンの名前は変数名の付け方と同じ規則が適用される.半角英数
文字とアンダーバー‘_’が使える.必ず英文字で始めて,Fortranの命令語,
関数名或いはメインプログラム名や他の副プログラムの名前やそこで使わ
れている変数名と重複させてはいけない.

プログラム中で使用する変数の管理
メインプログラムとサブルーチンプログラムは,全く独立したプログラムであ
り,各プログラム単位で使用される変数(ローカル変数)は別々に管理される.
各プログラムで使用する変数は,各プログラム内で型宣言して使う.同じ
変数名で宣言しても,メインプログラムとサブルーチンでは全く別の変数とし
て取り扱われるので注意が必要である.
メインプログラムと副プログラムとの間でデータのやりとりを行うには,サブ
ルーチンの引数に変数の並びを指定してデータの受け渡しを行なう.
サブルーチンの記述上の注意2
引数の指定(とても重要)
引数の並びには,定数,変数名或いは配列変数名をカンマで区切って並べて指
定する.
サブルーチン側の仮引数とメインプログラム側の実引数の変数名は,一致させ
なくて良いが,仮引数の並びは実引数の並びと対応づけられるので,
1)仮引数の並びの個数と順番
2)対応する仮引数の型(整数型,実数型,文字型)
3)仮引数の配列変数の型,次元,配列サイズ
は,実引数と一致させておかなければいけない.厳格な一致を保証するため,
FORTRAN90/95では,INTERFACE文およびINTEND文により,仮引数の仕様と
型を明示しなければならない.
仮引数とは,副プログラムの定義のために使う引数である.一方,実引数とは
副プログラムを呼び出すときに実際に値が渡される引数のことである.副プログ
ラムが呼び出される時,実引数の値が仮引数にコピーされて渡される.
課題1 例題6.1 分数の計算




ポイント
サブルーチンの引数の設計
INTERFACE文の記述方法に慣れる
メインプログラムと副プログラムの変数の独立性
INTENT(IN)指定の変数を書き換える場合の注意
(重要)サブルーチン側でローカル変数にコピーして使う
課題2 例題6.2 組立除法


ポイント
メインプログラムと副プログラム間の配列変数の受
け渡し方法(INTERFACE文の記述法)
配列変数を用いた漸化式の計算
引数が配列変数の場合の注意
INTENT文の仮引数の配列変数の寸法指定
1)実引数の宣言寸法と一致させる
2)自動割り当て(*)を用いて書く
PROGRAM PROG0615
REAL , DIMENSION(20, 10) :: A
INTEGER , DIMENSION(10) :: B
INTEGER :: N
INTERFACE
SUBROUTINE ABC(A, B, N)
IMPLICIT NONE
REAL, INTENT(IN), DIMENSION(20,*) :: A
INTEGER, INTENT(OUT), DIMENSION(*) :: B
INTEGER, INTENT(IN) :: N
END SUBROUTINE ABC
END INTERFACE
:
CALL ABC(A, B, N)
:
STOP
END PROGRAM PROG0615
SUBROUTINE ABC(A, B, N)
IMPLICIT NONE
REAL, INTENT(IN), DIMENSION(*, *) :: A
INTEGER, INTENT(OUT), DIMENSION(*) :: B
INTEGER, INTENT(IN) :: N
ローカル変数の型宣言
サブルーチン内での処理内容
RETURN
END SUBROUTINE ABC
アスタリスク“*”は,配列変数の最終次元の上限サイズ
(2次元配列では列数)の自動割り当てを指示するための
文字である.*を指定すると,サブルーチンの引数が参照
するメインプログラムの配列変数の宣言文にある最終次
元のサイズが自動的に割り当てられる.
右のプログラム例では,2次元配列Aの
DIMENSION(20,*)の”*”には10が,1次元配列Bの
DIMENSION(*)の”*”には, 10がそれぞれ設定される. *
を用いなくても直接配列サイズの上限値を指定しても構わ
ないが,配列サイズがメインプログラムでの宣言サイズと
サブルーチンで一致しない場合は,他の変数領域のデー
タを破壊するなどプログラム実行時に深刻な障害を与える
可能性がある.
課題3 バブルソート法による
データの並び替え


教科書p.105の例題5.4のプログラムにおいて,配列変数
X(I)とX(I+1)のデータの入れ替えを行うIF THEN~END IFの
中の3行の処理部分を先週作成したサブルーチンSWAPを用い
たプログラムに書き換えよ.
ただし,プログラムの動作確認は, 教科書の実行例と同じ入
力データを用いること.
ソースプログラム
READ(*,*) X(1:N) は,
部分配列を用いた記述法(p.83)であり,
READ(*,*) (X(I), I = 1, N)
と同じことである.
課題4 バブルソート法による
データの並び替え


教科書p.105の例題5.4のプログラムを参考にして,データ
個数Nの配列変数Xのデータの並べ替えを行うサブルーチン
SORT(X, N)を作成し、例題5.4のプログラムをSORTを呼び出
すプログラムに書き換えよ。ただし、サブルーチンSORTでは、
作成したサブルーチンSWAPを用いて2つの変数のデータの入
れ替えを行うこと。プログラムの動作確認は, 教科書の実行例
と同じ入力データを用いて行うこと.
ポイント
メインプログラムからサブルーチンSORTの呼び出し
サブルーチンSORTからサブルーチンSWAPの呼び出し
今週の課題 〆切6月2日 17時
メール送付先:[email protected]
レポート課題(Subject:report0529) 3点
課題4のデータの並び替えのプログラムをサブルーチン
SWAPとSORTを用いて書き換えたプログラムを作成し,その
実行結果とともにメールで送付せよ.ただし,正しい結果が得
られていることを確認した上で送付すること.
注意




プログラム名は,REPORT0529とする.
ソースファイル名および実行結果スクリプトファイル名は,それぞれ
report0529.f95,result0529.txtとする.
字下げ、コメントがないプログラムは減点する.
金曜日までに送られたレポートへの返信は,出張中のため対応できない
ことがある.