プログラムの構造化 〜関数と構造体〜 (1/4)
作成:2011-02-05 21:20
更新:2011-02-05 21:20
更新:2011-02-05 21:20
■関数は、処理を構造化すること
先に、制御構文というのを覚えて、プログラムの流れを制御することを学びました。が、より複雑なプログラムを作ろうとすると、単純な制御ではどうしようもなくなってきます。
例えば、たくさんのデータを扱うことを考えてみましょう。そして、多数のデータを集計したり表示したりする必要があったとします。それは、まぁ繰り返しなどを使えばできそうですね。が、問題は、そうした処理を「プログラムのあちこちで実行する必要がある」ということなんです。ここでもあそこでもやらないといけない。こういうこと、よくあります。
もちろん、その繰り返し構文の処理をコピーして、プログラムのあちこちにペーストしていってもいいでしょう。が、そうすると、同じ処理がプログラムのあちこちに書かれることになります。これはちょっと気持ち悪い。更に、「やっぱり、これ、こんな具合に変えて」となったとき、プログラムのあちこちに書いた処理を全部探して書き換えないといけません。これはかなり大変ですね。
制御構文のように、もっと便利な仕組みはないのでしょうか。例えば、必要な処理の部分だけをメインプログラムから切り離して、そこだけいつでもどこからでもぱっと呼び出せるような仕組みです。こういうことができたら、ずいぶんと楽になりますね?
これが「関数」の考え方です。関数というのは、プログラムの一部分を切り取って、外部からいつでも呼び出して利用出来るようにしたものです。これは以下のような形で定義します。
返り値――関数を呼び出した側に結果を渡すようなときに使うものです。ここで、返す値のタイプを指定します。
関数名――関数の名前です。変数などと同じように半角英数字でつけます。
引数の指定――関数を呼び出すときに、必要な値などを受け渡すのに使うものです。「int x」というように、受渡した値を収める変数の宣言を書いておきます。複数の値を渡すときは、カンマで区切って記述できます。
return 値;――返値がある場合、最後に「return」というもので値を返します。これで、その値が、関数を呼び出した側に戻されます。
これを見ていると、「どこかで見たことあるな……」と想いませんでしたか。そうです「main」です。Cのプログラムは、
下のリスト欄に、簡単な関数の利用例をあげておきましょう。「元になるソースコード」で、名前を出力している部分を関数として切り分けたのが「関数を使ったソースコード」です。printHelloという名前の関数を定義していますね。これは返値に「void」というのが指定されていますが、これは「何も値を返さない」ことを示す特別なキーワードです。値を返さないので、最後に「return」はありません。
関数を使うと、ただprintHello();と呼び出すだけで、いつでもその機能を呼出実行させることができます。ここでは簡単なprintfを実行しているだけですが、もっと面倒くさい処理を関数として用意しておけば、「処理を書くのは関数定義の1度だけ」で済みます。後で機能を修正するときも、関数を変えれば、それを呼び出しているすべてのところでちゃんと変更されるわけですね。
例えば、たくさんのデータを扱うことを考えてみましょう。そして、多数のデータを集計したり表示したりする必要があったとします。それは、まぁ繰り返しなどを使えばできそうですね。が、問題は、そうした処理を「プログラムのあちこちで実行する必要がある」ということなんです。ここでもあそこでもやらないといけない。こういうこと、よくあります。
もちろん、その繰り返し構文の処理をコピーして、プログラムのあちこちにペーストしていってもいいでしょう。が、そうすると、同じ処理がプログラムのあちこちに書かれることになります。これはちょっと気持ち悪い。更に、「やっぱり、これ、こんな具合に変えて」となったとき、プログラムのあちこちに書いた処理を全部探して書き換えないといけません。これはかなり大変ですね。
制御構文のように、もっと便利な仕組みはないのでしょうか。例えば、必要な処理の部分だけをメインプログラムから切り離して、そこだけいつでもどこからでもぱっと呼び出せるような仕組みです。こういうことができたら、ずいぶんと楽になりますね?
これが「関数」の考え方です。関数というのは、プログラムの一部分を切り取って、外部からいつでも呼び出して利用出来るようにしたものです。これは以下のような形で定義します。
返値 関数名 ( 引数の指定 ) {
……実行する処理……
return 値;
}
返り値――関数を呼び出した側に結果を渡すようなときに使うものです。ここで、返す値のタイプを指定します。
関数名――関数の名前です。変数などと同じように半角英数字でつけます。
引数の指定――関数を呼び出すときに、必要な値などを受け渡すのに使うものです。「int x」というように、受渡した値を収める変数の宣言を書いておきます。複数の値を渡すときは、カンマで区切って記述できます。
return 値;――返値がある場合、最後に「return」というもので値を返します。これで、その値が、関数を呼び出した側に戻されます。
これを見ていると、「どこかで見たことあるな……」と想いませんでしたか。そうです「main」です。Cのプログラムは、
int main (int argc, const char * argv[]) {こんな形になっていました。これも「main」という関数だったのですね。mainは、プログラムを実行すると最初に呼び出される、特別な関数だったのです。そして関数というのは、C言語に用意されているものだけでなく、プログラマが自分で定義して利用出来るものだったのです。
……処理……
return 0;
}
下のリスト欄に、簡単な関数の利用例をあげておきましょう。「元になるソースコード」で、名前を出力している部分を関数として切り分けたのが「関数を使ったソースコード」です。printHelloという名前の関数を定義していますね。これは返値に「void」というのが指定されていますが、これは「何も値を返さない」ことを示す特別なキーワードです。値を返さないので、最後に「return」はありません。
関数を使うと、ただprintHello();と呼び出すだけで、いつでもその機能を呼出実行させることができます。ここでは簡単なprintfを実行しているだけですが、もっと面倒くさい処理を関数として用意しておけば、「処理を書くのは関数定義の1度だけ」で済みます。後で機能を修正するときも、関数を変えれば、それを呼び出しているすべてのところでちゃんと変更されるわけですね。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※元になるソースコード #include <stdio.h> int main (int argc, const char * argv[]) { printf("Hello, World !!"); return 0; } ※関数を使ったソースコード #include <stdio.h> void printHello(){ printf("Hello, World !!\n"); } int main (int argc, const char * argv[]) { printHello(); printHello(); return 0; }
※関連コンテンツ