情報基礎演習Ⅱ 第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とする. 字下げ、コメントがないプログラムは減点する. 金曜日までに送られたレポートへの返信は,出張中のため対応できない ことがある.
© Copyright 2024 ExpyDoc