自作関数を作る
プログラムの部品化
ここまでで、すでにC言語の基本的な命令はほとんど解説しました。
これまでに作成してきた、さまざまなプログラムが思い出されます。
ところで、1度作ったプログラムを、もう一度使いたいと思った場合、
1番単純なのは、コピーしてmain関数内に貼りつけることですが、
プログラムが大量にあった場合には、ごっちゃごっちゃになってしまい、
わけのわからないプログラムになってしまうことは間違いありません。
以前に作成したプログラムを再び使うことを
再利用と呼び、
関数として再利用することを
部品化と呼びます。
部品をたくさん用意しておけば、巨大なプログラムであっても、
その部品を組み合わせるだけで完成してしまうので、非常に効率的です。
【再利用】
以前に作成したプログラムを使うことで手間を省くこと。
【部品化】
単独の機能を持つ小さなプログラムを作り、
それを組み合わせることで大きなプログラムを作る方法。
ここでは、以前、4章2節3項で解説した、1~100の合計を表示するプログラムを、
関数化することで、手軽に部品として再利用できるようにします。
自作関数を作る
部品化するには、1~100の合計を求めるプログラムを関数にしなくてはなりません。
しかし、実は、
関数を作ること自体は、あなたにとってはじめてのことではありません。
1番初めに、main関数の作り方を説明したことを覚えているでしょうか?
あれ以来、main関数は当然のごとく作っていたので、意識していなかったと思います。
自作関数の作り方も、main関数となんら変わりません。
main関数の名前を変えるだけで、新しい自作の関数が作れてしまいます。
もちろん、その中身の処理も自由に記述できます。
ここまでわかれば、非常に簡単なことです。
名前を変えて、中身を1~100の合計を表示するプログラムに詰め替えるだけです。
新しく作成したsum関数は、次のようになります。
#include <stdio.h>
int main(void)
{
return 0;
}
int sum(void)
{
printf("%d\n", (1 + 100) * 100 / 2);
return 0;
}
これで、sum関数は完成しました。
後は、sum関数の使い方さえわかれば、プログラムの再利用ができます。
プロトタイプ宣言
さて、早速sum関数の使い方を説明したい所なのですが、
実は、その前に、もう1つ準備しておかなければならないことがあります。
先ほど、新しくsum関数を作ってみましたが、
実は、これだけでは、sum関数を使うことができません。
コンパイラは、新しく
sum関数が作られていることを知らないからです。
場合によっては、コンパイラに新しく作られた関数を教える必要はありません。
コンパイラは、新しい関数を発見すれば、自動的に認識してくれるからです。
ただし、新しい関数が使えるのは、その関数よりも後に発見された関数の中だけです。
先の例では、まずmain関数を作り、次にsum関数を作りました。
この場合、main関数を解析している段階では、sum関数は発見されておらず、
したがって、main関数の中では、sum関数を使うことは出来なくなってしまいます。
これを解決する方法の1つは、sum関数を先に書いてしまう方法です。
次のプログラムは、sum関数を先に書いた例です。
#include <stdio.h>
int sum(void)
{
printf("%d\n", (1 + 100) * 100 / 2);
return 0;
}
int main(void)
{
return 0;
}
この様にすれば、問題なくmain関数からsum関数を使うことができます。
しかし、関数がたくさんある場合、常に順序関係を気にかけて、
必要な関数を先頭に持ってくるのは面倒です。
どんな関数が作られているのか、前もって一覧にしておくようにすれば、
いちいち関数を前に書いたり後に書いたりする心配はなくなります。
関数の一覧を作るには、
関数の形を、プログラムの初めの方に並べます。
関数の形とは、関数の1行目の後ろに ; をつけたもののことです。
正確には、関数名、関数の型、引数の型、の3つを書いておくことです。
次のプログラムは、sum関数の概要をあらかじめ書いておいた例です。
#include <stdio.h>
/* プロトタイプ宣言 */
int sum(void);
int main(void)
{
return 0;
}
int sum(void)
{
printf("%d\n", (1 + 100) * 100 / 2);
return 0;
}
この様な関数の概要を
プロトタイプ宣言と呼んでいます。
プロトタイプ宣言さえしておけば、関数をどんな順序で書いても関係ありません。
【プロトタイプ宣言】
あらかじめ先頭で関数の形を宣言しておくことで、
他のすべての関数からその関数を使えるようにすること。
唯一、main関数だけはプロトタイプ宣言が必要ありませんが、
他の関数ではすべてプロトタイプ宣言が必要になります。
実は、今まで使用してきたprintf関数などのプロトタイプ宣言は、
毎回先頭に書いていた、stdio.h ファイルの中に書かれていたのです。
これが、 #include を書く最大の理由です。
自作関数を呼び出す
自作関数であっても、使い方は今までの関数とまったく同じです。
printf関数の場合、printfの後に()をつけて、
その中に表示させたい文字列や変数を指定して呼び出しました。
sum関数も、これと同じように呼び出すことができます。
ただ、sum関数の場合、引数が void なので、渡す情報がありません。
この場合でも()は省略できませんから、()だけを指定します。
次のプログラムは、main関数からsum関数を呼び出す例です。
#include <stdio.h>
int sum(void); /* プロトタイプ宣言 */
int main(void)
{
sum(); /* 呼び出し部分 */
return 0;
}
int sum(void)
{
printf("%d\n", (1 + 100) * 100 / 2);
return 0;
}
このプログラムの実行結果は、次の通りになります。
このプログラムの流れを順番に説明します。
1、main関数が呼び出される。
2、main関数内のsum()が実行され、sum関数にジャンプする。
3、sum関数内のprintf関数が実行される。
4、sum関数内のreturnが実行され、元のmain関数内のsum()の直後に戻る。
5、main関数内のreturnが実行され、プログラムが終了する。
ここで重要なのは、具体的な処理はすべてsum関数の中で行われていることです。
1~100の合計を計算して表示することを、
sum関数に任せることができます。
この部品化によって、sum関数を好きな時に呼び出して、
1~100の合計の結果をいつでも画面に表示できるようになりました。