関数を定義する

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 関数で、この章の後半で扱います。まずは、処理に名前を付けて呼び出す、という感覚をつかみましょう。

要件

  1. show_line という名前の関数を main より上に定義する
  2. show_line はハイフン30個の行を表示する
  3. main から show_line を2回呼び出す
  4. 1回目と2回目のあいだに 成績管理システム v0.5 を表示する

入出力例

main("") → "------------------------------ 成績管理システム v0.5 ------------------------------"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.c
学習モード

メモ

関数を定義する

⌘S で保存