関数を定義する
main が縦に伸びていく
前章までで、点数を読み込み、条件で分けて、人数ぶんループする、というところまで書けるようになりました。ただ、書けることが増えるほど main の中身は縦に伸びていきます。第4章のつくる回で書いたプログラムを思い出すと、入力の部分、集計の部分、表示の部分がひとつづきに並んでいて、どこからどこまでが何の処理なのか、上から順に読まないと分からない状態でした。
これを整理する道具が 関数 です。まとまった処理に名前を付けて外に出し、main からはその名前を呼ぶだけにします。
関数の形
区切り線を出す処理を関数にしてみます。
int show_line(void) {
printf("------------------------------\n");
return 0;
}1行目が関数の入口で、4つの部品でできています。左から順に、戻り値の型 (int)、関数名 (show_line)、引数リスト ((void))、そして波カッコの中が 本体 です。
引数リストの void は「値を受け取らない」という意味です。C ではカッコの中を空にした () は「引数のことは何も指定しない」という別の意味になってしまうので、受け取らないときは省略せず void と書きます。
呼び出す
定義しただけでは何も起きません。main から名前を書いて呼び出します。
int main(void) {
show_line();
printf("成績管理システム\n");
show_line();
return 0;
}show_line(); と書いた場所で、いったん実行の流れが関数の中に移ります。本体を最後まで実行するか return に出会うと、呼んだ場所の続きに戻ってきます。同じ処理を2回書く代わりに2回呼べばよいので、あとで線の見た目を変えたくなったときも、直す場所は関数の中の1か所だけです。
定義はどこに書くか
今は main より 上 に書いてください。C はソースを上から順に読むので、main の中で show_line を呼ぶ時点で、コンパイラがその名前をまだ知らないとエラーになります。main より下に定義したいときの書き方は、このあとのプロトタイプ宣言の回で扱います。
戻り値の 0 は何か
戻り値の型を int と書いたので、本体のどこかで return を書く必要があります。今回の return 0; は、main の最後にある return 0; と同じで「無事に終わりました」という合図です。値そのものに意味はないので、呼び出し側は戻り値を受け取らずに捨てて構いません。
表示だけして何も返さない関数には、もっと素直な書き方が用意されています。それが void 関数で、この章の後半で扱います。まずは、処理に名前を付けて呼び出す、という感覚をつかみましょう。
要件
- show_line という名前の関数を main より上に定義する
- show_line はハイフン30個の行を表示する
- main から show_line を2回呼び出す
- 1回目と2回目のあいだに 成績管理システム v0.5 を表示する
入出力例
main("") → "------------------------------
成績管理システム v0.5
------------------------------"