Ameba Ownd

アプリで簡単、無料ホームページ作成

10. 関数

2017.08.24 10:00

 まとまった処理をする命令を組み合わせたプログラムを関数と呼びます。これに対して、最初に実行されるのが主プログラム(メインプログラム)であり、関数は主プログラムや他の関数から呼び出された時に実行され、一つの値を返します。この返す値を「戻り値」といい、関数内のreturn文で指定します。(戻り値のない関数もある。)C言語では主プログラムはmainという名前が付けられ、必ずこれが最初に実行される。また、関数には呼び出した時に引き渡される値が存在してもよく、この値を引数(ひきすう)と呼ぶ。呼び出すプログラム内の変数と関数内の変数は独立しており、戻り値と引数で主にやり取りする。

(1) 関数の例1
 下記に関数を使ったプログラム例を示します。新しいプロジェクトno15にソースmax1.cを追加して入力してください。このプログラムはa,b,c,dの4つの変数の最大値を表示するプログラムです。まず、プログラムはmainの{ }内が先に実行されます。16行目は単なる代入文です。宣言と一緒にしてしまっても問題ありません。18行目で関数max1が呼び出されます。

関数の呼び出しには関数名(今回はmax1)で指定します。関数の後のカッコ内で変数で指定しているのが引数です。18行目で呼び出された時には、関数内の変数xには引数1のaの値である1が、yには引数bの値である40が入り、戻り値として40が返される。2度目に呼び出された時には、関数内の変数xには40、yには10が入る。戻り値として40が返される.という事でこのプログラムは3つの値の最大値を表示するプログラムである。

演習1 4つの整数型の引数を持ち4つの値の最大を返す関数max4を作り、(1)のプログラムを書き換えなさい。

(2) 関数の例2
 新しいプロジェクトno16を作成し、ソースast.cを追加し次のプログラムを入力してください。

 このプログラムの関数print_astは型がvoid型であり、この型では戻り値を持ちません。何をする関数かというと整数型の値を一つ受け取ってその数だけ*を改行なしに出力して最後に改行する、という関数です。main側からは、print_astに1から9の値を渡して実行しています。ここで、mainにも関数にもiという変数が出てきます。関数内の変数は独立していて呼び出し側と関数内で変数名が同じでも関係ありません。つまり、関数内で同じ名前の変数の値が変更されてもmain側の変数には影響を与えません。引数についても同じで値を渡しているので、引き渡された先の変数(上のプログラムでn)の値が変更されてもmain側のiの値に影響ありません。

演習2 整数型の引数を1つを持ち、引数の値の個数だけ空白を出力して改行はしない関数
int print_spc(int n){
を作成し、(2)のプログラムを変更して、

という出力をするプログラムを作成せよ。

(3) 配列を引数とする関数
 次は配列を引数とする関数です。変数を引数とするのと配列を引数とするのでは大きな違いがあります。変数を引数とする場合には関数に値が渡され、関数内で受け取った変数の値を変更しても、呼び出した側の変数には影響ありませんでした。変数の要素(例えば、data[1], data[j])を引数とした場合も影響なしでした。これを値引き渡しといいます。しかし、

 配列の場合は配列のポインタ(配列のメモリ上の場所)を関数に渡します。そのため関数内で配列の値を変更すると呼び出し側の配列の値も変化します!

 【変数が引数の場合の確認】 次のプログラムを実行してみて下さい。プロジェクト名no17、ファイル名swap1.c 

実行結果は、

となり、出力の1行目はソースの16行目の出力、出力の2行目はソースの18行目の出力です。値に変更がない事が確認できました。

【配列が引数の場合】続いて次のように引数を配列で書いてみましょう。引数の書き方は呼び出し側は配列名xだけ、関数側はint x[]とすると配列が使えます。

 関数側で値が更新されたのが呼び出し側でも更新されていることが分かりますね。

演習3 関数

int findmax(int x[], int n);

は、与えられた配列xのx[0]からx[n-1]の中の最大値を戻り値とするプログラムとする。これを作成せよ。