◎第9回 手続きと関数
◇下へ・一覧へ
○テキスト
5章(5.1)
手続き(procedure)とは:
"段階的詳細化をプログラミング言語上で記述する機構"
ある一連の操作を、分離して記述したもの。
◇下へ・上へ
○「手続き」を使う利点
・区切りのいいところをまとめて、別に記述する
プログラムが見やすくなる
・大きな(複雑な)処理を分割してデバッグなどをしやすくする
→ モジュール化
・似かよった操作がしばしば行なわれるとき、
同じプログラムを何度も書かないですむ
○手続きの種類
・メインルーチン(main routine):プログラムを起動したとき最初に実行される手続き。
・サブルーチン(subroutine):あるまとまった処理(「値」を返さない)をする手続き。
・関数(function):結果として1つの「値」を返す、サブルーチンの変種。
*返す値の「型」に注意が必要
◇下へ・上へ
○手続き中の「パラメタ」と「変数」の扱い
・パラメタ(引数):手続き間で渡されるデータ(変数)。
手順は同じだが「対象」は異なる
仮パラメタ(仮引数 formal parameter)・・・サブルーチンや関数内で使われる
操作記述のための仮の名前
実パラメタ(実引数 real parameter) ・・・サブルーチンや関数に対して呼び出し側が
指定する実際の操作対象
・変数の扱い
局所変数(local variable):プログラム中のあるサブルーチン、関数内のみで使われる変数
大域変数(global variable):プログラム中の全ての実行単位で使うことのできる変数
*注意:これまで出てきた変数はすべてlocal変数である
・データの受け渡し方法
値渡し・・・値パラメタ(value parameter)の使用: 変数(式)の値そのものを渡す
手続き内で仮パラメタを変更しても、呼出側の実パラメタは変わらない
変数渡し・・・変数パラメタ(variable paramter)の使用: 変数のアドレスを渡す
手続き内で仮パラメタを変更すると、呼出側の実パラメタも変わる
<言語による違い> 伝票の例え
変数渡し (Fortran) 伝票そのものを渡す
伝票に書き込むことで結果を返せる
(呼ばれたルーチンが元の引数にアクセスできる)
値渡し (C) コピーを渡す
書き込んでも元の伝票はそのまま
(値しか受け渡すことができない)
* Cで変数渡しをしたければ、ポインタ変数を使う
指定可能(var パラメタ) Pascal
◇下へ・上へ
○C言語における関数
Pascalの手続きあるいは関数、Fortranのサブルーチンあるいは関数を、
C言語ではまとめて「関数」と呼ぶ。
(C言語における関数の例)
最初に実行される関数 ... main( )
あらかじめ用意されている関数 ... sqrt( )、sin( )、cos( )
あらかじめ用意されている「サブルーチン的関数」... printf( )、scanf( )
・自分で「関数」を定義できる
関数の名前は自分で適当につければよい(実はすでにmainという名の関数を定
義していることに注意)。しかし、あらかじめ用意されている関数と同じ名前
は使えない(使える場合もある)。
・関数の作成方法
1. まとまった処理を切り出して独立した関数にする
a) その部分を切り出して、{ }でくくってブロックにする
b) 関数名を考え、a)のブロックを関数定義する
c) 元の部分に関数呼び出しを書く
d) 処理のために必要な変数定義部分をブロックに入れる
2. 関数と呼び出し側のデータの受け渡しの方法を決める
戻す値はいくつか(0 or 1 or 複数)
値渡しをするか → 「関数」
変数渡しをするか → サブルーチン的「関数」(ポインタ)
3. 元の関数(呼び出し側)で、不要な変数宣言を取り除く
分離した処理と、呼び出し側に残す処理に共通の変数に注意
◇下へ・上へ
・関数の定義と使用法
(例) 二つのデータの和の平方根を求める関数 (一部)
関数が返す値の型 関数名(仮パラメタ型宣言) double kansuu(double x, double y)
{ ブロック {
local変数zの型宣言; double z;
関数の本体 z=sqrt(x+y);
計算した値をreturn文でmainに返す(cに代入) return z;
} }
関数kansuuを呼び出す関数main main()
{ {
local変数a,b,cの型宣言 double a, b, c;
: :
関数名(実パラメタリスト) c=kansuu(a, b);
: :
} }
(関数の詳細)
◇下へ・上へ
・Cにおける関数の返す値の個数
1. 「関数」なので関数の値として返す …… 1つだけ
2. パラメタとして変数のアドレスを渡す(ポインタ変数の使用) …… いくつでも可
・ポインタ変数 ……アドレス(実際のメモリ上の位置)を操作するために作った変数
(ポインタの使用法)
呼び出し側 : 変数のアドレス(ポインタ)を渡す
実パラメタ …… 「& 変数」と書く
呼ばれた側 : パラメタがポインタであることを宣言し、ポインタを通して実際の変数を参照
仮パラメタ …… 「*変数」と書く
・関数内の仮パラメタの宣言
例1:値パラメタ
型 仮パラメタ名;
(宣言例) int a;
(使い方) a
例2:変数パラメタ
型 *仮パラメタ名;
(宣言例) int *a;
(使い方) *a
例3:配列変数パラメタ
型 *仮パラメタ名;
(宣言例) int a[ ]; (または int *a) -> 注:配列=ポインタ変数
(使い方) a[i]
◇下へ・上へ
○演習9
9.1 次の c プログラムの指定した各処理や条件判断が実行される順番を考えよ。
また、このプログラムは、
% c-order ファイル名
で実行した部分が表示されるので確認せよ。
c-order4.c
9.2 第7回演習の数値積分プログラム(integral.c)に
おいて、処理部分を「積分値を値として返す関数」として切り出し、
全体を書き直して、コンパイル・実行し動作を確認せよ。
( 解答例(integral-f.c) )
9.3 2つの整数の値を交換する関数
swap (int x, int y)
を作成したが、正しく動作しない(swap.c)。
それはなぜか。修正して動作を確認せよ。( 解答例 )
◇一覧へ・上へ
○レポート課題9
9.1 第5回課題5-2で作成した5個のデータの平均と標準偏差を求める
プログラムにおいて、データの総和を求める部分を関数として
書き直し、コンパイル・実行して動作を確認せよ。
(テキストp.102【例題5.1】からp.112までをよく読むこと)
プログラムリストおよび実行結果を提出せよ。
9.2 第5回課題5.4の整列プログラム(seiretu0.c)において、
整列部分,データ入力,データ出力を関数として書き直し、
コンパイル・実行して動作を確認せよ。(テキストp.112【演習5.6】)
プログラムリストおよび実行結果を提出せよ。
(ヒント:seiretu10.c)
9.3 値パラメタと変数パラメタとはどのように違うか。
200字程度で説明せよ。(テキストp.122【復習5.2】)
【余裕のある人】はここをクリック