【課題4−1 関数の仕組み】
<関数とは>
まとまりのある機能を実行する処理単位.C言語のプログラムは関数の集まりであり,main関数を頂点に,処理系が用意したライブラリ関数と,プログラマが用意したユーザ関数をリンクして,実行形式を作成する.
<関数化のメリット>
特定の機能を関数という処理単位にまとめると,わかりやすいプログラムになる.プログラムのテストや修正も関数単位で行えばよいので,開発効率も上がる.複数のプログラマによる分業も可能になる.関数を別のプログラムで活用することもできる.
関数は,一つ一つを独立した機能単位にまとめ,なるべく他の関数との関連性は断つべきである.ある関数を修正すると,他の関数にも修正の影響が及ぶようなつくりにはすべきではない.
<ユーザ関数を使ったプログラム>
ユーザ関数を使ったプログラムは一般に
1. #include行
2. ユーザ関数のプロトタイプ宣言
3. main関数定義
4. ユーザ関数定義
の順で記述される.
<ユーザ関数定義>
(構文) 返却値型 関数名(引数型と仮引数名の並び)
{
関数内変数の宣言;
文;
return文;
}
(例) int is_leap_year( int y )
{
int
rc = 0;
if
(y%4==0 && (y%100!=0 || y%400==0))
rc
= 1;
return
rc;
}
関数名:識別子なので,名前の付け方には変数と同じルールが適用される.
引数型:関数に引き渡す数のデータ型
仮引数名:関数が受け取る引数名.(関数に渡す引数は実引数と呼ぶ)
返却値型:関数が呼び出し元に返す値のデータ型
内部処理:仮引数と関数内変数を使って文を実行.
return文:関数の実行を終了させ,呼び出し元に制御を返す.
(構文) return 式;
または return;
<main関数定義>
main関数からユーザ関数を呼び出す.もちろんユーザ関数から他のユーザ関数を呼び出すこともできる.
(構文) 関数名(実引数の並び);
(例1) if(is_leap_year(year) == 0)
(例2) int r;
...
r =
is_leap_year(year);
if (r == 0)
<プロトタイプ宣言>
(構文) 返却値型 関数名(引数型と仮引数名の並び);
(例) int
is_leap_year(int y);
コンパイラに対して関数の情報を与える.プロトタイプ宣言を記述しておくと,コンパイル時に関数の呼び出しと定義が異なっている場合にはエラーを出力する.プロトタイプ宣言では,仮引数名は省略可能.
<#include文>
ライブラリ関数のプロトタイプ宣言(やさまざまな定数の定義)が記述されている.プログラム内で使おうとしているライブラリ関数の宣言を含むヘッダファイルをincludeしておく.