これまで言葉としては書いてありましたが、いよいよ関数について説明します。
関数は大きく分けて3種類あります。
1.main関数 2.標準関数 3.ユーザ関数
main関数は、毎回使われている関数です。
特別な関数で、基本的にプログラムはmain関数から開始されます。
標準関数は、C言語に標準的に用意されている関数です。
scanfやprintfなど様々な関数があり、ヘッダファイルをインクルードすることで使えるようになります。
この2つの関数はこれまで使ってきましたので、何となくイメージ出来ると思います。
最後のユーザ関数が今回のメインです。
ユーザ関数とは、ユーザ(皆さん)自身が作る関数のことです。
これまでは、main関数に全てのプログラムを打ち込んできましたが、長いプログラムになると見づらくなり、デバッグも難しくなってきます。
そこでユーザ関数を作って、プログラムを分割する必要が出てくる訳です。
※プログラムを分割することだけが関数の目的ではありませんが、その話はまたの機会にします。
まずは、小さいプログラムで関数の基礎を説明します。
<sample program 126-01>
#include <stdio.h> int main(void) { printf("Hello\n"); printf("こんにちは\n"); printf("Tiger\n"); printf("キリン\n"); return 0; } |
<実行結果>
Hello こんにちは Tiger キリン 続行するには何かキーを押してください・・・
ほぼ意味のないプログラムですが、これを関数に分けていきたいと思います。
関数に分ける基準は色々ありますが、プログラムの機能ごとに分けることを考えてみます。
4行のプログラムですが、表示される文字から「挨拶」と「動物」に分けることが出来そうです。
そこで、「Greet」と「Animal」という関数に分割することにします。
ここで、関数を作る上で重要なことを書きます。
1.関数名 他の関数や変数名とかぶってはならない。 アルファベットか「_(アンダーバー)」から始まらなければならない。 処理内容に即した名前を付けなければならない。 ※この講座では、関数名の1文字目は大文字で書くことにします。 2.戻り値 関数が戻す値の型(intやfloatなど)。 無い場合は「void」と書く。 3.引数 関数が受け取るデータを入れる変数。 無い場合は「void」と書く。
上の「Greet」や「Animal」は関数名にあたります。
戻り値や引数は今回使いません。(つまり、無し「void」です)
では、関数を作る方法を書きます。
関数を作るためには、プロトタイプ宣言というものが必要です。
プロトタイプ宣言は次のように書きます。
<プロトタイプ宣言>
戻り値の型 関数名(引数); ※戻り値の型は1つしか書けない。 ※引数が複数ある場合は「,(コンマ)」で区切る。 |
今から作る「Greet」や「Animal」は戻り値も引数もありませんので、次のようになります。
void Greet(void); |
void Animal(void); |
それでは、プログラムに追加してみましょう。
<sample program 126-02>
#include <stdio.h> void Greet(void); void Animal(void); int main(void) { printf("Hello\n"); printf("こんにちは\n"); printf("Tiger\n"); printf("キリン\n"); return 0; } |
<実行結果>
Hello こんにちは Tiger キリン 続行するには何かキーを押してください・・・
宣言しただけなので、特に何も変わっていません。
宣言した上で関数本体を作る必要があります。
本体の作り方は次のようになります。
<関数本体>
戻り値の型 関数名(引数) { /* ここにプログラムを書きます。 */ } |
main関数を見ていただければ分かると思います。
main関数はプロトタイプ宣言はありませんので、本体だけ書いてあります。
int main(void) { } |
関数名は「main」、戻り値の型は「int」、引数は無し「void」です。
「Greet」と「Animal」の本体は次のようになります。
void Greet(void) { } |
void Animal(void) { } |
※引数の括弧の後ろにセミコロンが無いことを確認してください。
※プロトタイプ宣言と間違えてセミコロンを付けるとエラーになります。
それでは、プログラムに追加してみましょう。
<sample program 126-03>
#include <stdio.h> void Greet(void); void Animal(void); int main(void) { printf("Hello\n"); printf("こんにちは\n"); printf("Tiger\n"); printf("キリン\n"); return 0; } void Greet(void) { } void Animal(void) { } |
<実行結果>
Hello こんにちは Tiger キリン 続行するには何かキーを押してください・・・
本体には何も書いてありませんので、何も変わりません。
これで枠組みが出来ましたので、main関数にあるプログラムをそれぞれの関数に移しましょう。
<sample program 126-04>
#include <stdio.h> void Greet(void); void Animal(void); int main(void) { return 0; } void Greet(void) { printf("Hello\n"); printf("こんにちは\n"); } void Animal(void) { printf("Tiger\n"); printf("キリン\n"); } |
<実行結果>
続行するには何かキーを押してください・・・
「挨拶」部分と「動物」部分をそれぞれの関数に移動させました。
実行結果を見ると何も出てこなくなっています。
main関数には何もプログラムが無く、始まった途端に終了していることが原因です。
プロトタイプ宣言を行い、本体を作成しただけでは関数は動作しません。
関数を動作させるには、「呼び出す」ことが必要になります。
関数を呼び出すには、関数名と引数が必要です。
関数名(引数として渡すデータ); |
これを呼び出したい箇所に書いておけば該当する関数が呼び出されます。
それではGreet関数とAnimal関数を呼び出しましょう。
<sample program 126-05>
#include <stdio.h> void Greet(void); void Animal(void); int main(void) { Greet(); Animal(); return 0; } void Greet(void) { printf("Hello\n"); printf("こんにちは\n"); } void Animal(void) { printf("Tiger\n"); printf("キリン\n"); } |
<実行結果>
Hello こんにちは Tiger キリン 続行するには何かキーを押してください・・・
関数を呼び出す際に引数が無い場合は、括弧内に何も書きません。
実行結果は元に戻りました。
まず、Greet関数が呼び出され、"Hello"と"こんにちは"を表示します。
その後、Animal関数が呼び出され、"Tiger"と"キリン"が表示されます。
余り意味のない内容なので、「打ち込むプログラムが増えただけ?」と感じる方もいらっしゃるかもしれません。
しかし、この関数が無ければ、「長くて読みにくいプログラム」になったり「複数の人員でプログラムを分担する」といったことが出来なくなります。
非常に大事な項目なので、しっかりと身に付けてください。