プログラミング(4)「関数」
関数
C言語のプログラムは関数の集まりで出来ています。 普通は関数というと y = f ( x ) という数学の関数が思い浮かびますが、 C言語の関数は数学の関数と少し違っています。 数学での関数はある値 x を与えると、 それに対応する計算を行って y という値が得られます。 C言語の関数は、ある値を与えるとその関数固有の処理を行って値を返します。 与える値を引数(ひきすう)、返ってくる値を返り値や戻り値と呼びます。
C言語の関数が数学の関数と違うのは、 引数や戻り値のない関数も作れるということです。 つまり、値は返さずに関数固有の処理だけ行うためにも関数が使われます。
また、C言語の main 関数は特別な意味を持っていて、 プログラムはこの main関数から実行が行われます。
関数の書式は
戻り値の型 関数名(引数) { 処理 }
となっています。
関数の作成
例えばある数の自乗を求める関数は
double jijo(double x) { return x*x; }
と書くことが出来ます。ついでに得られた値の表示も関数内で行いたいときは
double jijo(double x) { double y; y = x*x; printf("%f\n",y); return y; }
と書けます。C言語の特徴として値を返さない関数も作れるので、 表示だけ行う関数も作ることが出来て
void jijo(double x) { double y; y = x*x; printf("%f\n",y); }
と書けます。引数や戻り値がない場合は void を使います。
実際に関数を呼び出すサンプルを作ってみます。
#include <stdio.h> double jijo(double x) { return x*x; } main() { double x,y; x = 4.0; y = jijo(x); printf("%f の自乗は %f\n",x,y); }
このプログラムの実行結果は
> jijo 4.000000 の自乗は 16.000000
となります。
また、関数を使って次のようなプログラムも作ることが出来ます。
#include <stdio.h> void hello(void) { printf("Hello, World!\n"); } main() { hello(); }
関数helloは引数も戻り値もない関数で、文字の表示だけを行います。 このように特定の処理だけをする関数も作れます。
複数の引数
関数は複数の引数を持つことが出来ます。
double wa(double x, double y) { return x + y; }
また、配列変数を引数にすることも出来ます。
double wa(double x[10]) { int i; double wa; wa = 0; for(i = 0; i < 10; i++){ wa += x[i]; } return wa; }
上記の和を求める関数を利用して、 1から10までの和を求めるプログラムを作成せよ。
引数の値の変更
関数を呼び出すときに使用する引数の値を関数内で変更した場合、 引数の値が変更されるかどうかは引数の渡し方に依存します。
#include <stdio.h> void func(int i) { i = 2; } main() { int i = 1; func(i); printf("i = %d\n",i); }
上記の例の場合結果は
i = 1
となります。 これは関数に i の値を渡しただけなのでこのような結果となります。
#include <stdio.h> void func(int *i) { *i = 2; } main() { int i = 1; func(&i); printf("i = %d\n",i); }
この結果は
i = 2
となります。int *i の * はポインタを表す演算子で、 変数の値ではなく変数の入れ物を受け取ることを意味します。 呼び出すときも &iと書いて、 変数の値ではなく変数の入れ物を渡すように指示します。
配列を引数にする場合も実はポインタを渡しています。 従って関数内で値を変更した場合は、引数の値も変更されます。
#include <stdio.h> void func(int v[4]) { int i; for(i = 0; i < 4; i++){ v[i] *= 2; } } main() { int i; int value[4]; for(i = 0; i < 4; i++){ value[i] = i; } func(value); for(i = 0; i < 4; i++){ printf("%d\n",value[i]); } }の結果は
0 2 4 6
となります。 このように、関数内で値を変更できることを利用して、 戻り値が複数あるような関数も作ることが出来ます。