第4回:関数(2) (5/2)

関数ですが,関数を使うことはできても,関数を定義するのが難しい様です。今週は,引き続きいろいろな関数の定義を演習を通して学習する。

キーワード:「関数」「引数」「戻り値」


関数とは

関数とは,引数を渡すと,関数の定義に基づいて戻り値を届けてくれる。

3-1


関数の定義のしかた,関数の引数と戻り値




戻り値の型 関数名(引数1の型 変数名1,引数2の型 変数名2, ...)
{
 
    /*  ここに処理を記述  */
 
    return xxx;    /*  xxxが戻り値  */
}

関数の書き方のルール


関数の呼び出しにともない実行される処理の順序.

3-2

  1. 関数の呼び出し元(ここではmain関数内の bekijo(a, b) の部分)から「引数」a, b を伴って関数bekijoに処理が移る。
  2. 関数が呼び出された時点での変数 a, b の値がコピーされ, c, d として受け取る。
  3. 関数内でいろいろな処理をした後,return文に到達すると,値を返す(return文)動作が行われ,ここで関数の処理が終了する。(return文以降に記述された処理は実行されない)
  4. 関数の戻り値(ここでは関数bekijo 内の return で指定された変数 x の値)を,main内のwaに代入。

処理の流れ,引数(変数)のコピーや,return による値の戻りをよく理解すること。


変数の有効範囲(スコープ)

関数の中で宣言する変数のことをローカル変数という. ローカル変数を利用できる範囲は,変数を宣言した関数の中,即ち { から } までのブロック内に限られる.この変数の有効範囲のことを変数のスコープと呼ぶ.したがって,異なる関数内に「同じ名前」の「異なる変数」を用いる事が可能である.

以下のプログラムで,どのような結果が得られるか,考えなさい.


#include <stdio.h>
 
void funca(int x)
{
	/*この変数は main 内の x とは別物*/
	
	printf("funca_xの初期値:%d¥n",x);	  /* funca内のxの初期値の表示 */

	x += 5;
	
	printf("funca_xの結果:%d¥n",x);	  /* funca内で演算した結果の表示 */
}
 
void main()
{
	int x;      /*  この変数は funca 内の x とは別物  */
	x = 3;
	
	printf("main_xの初期値:%d¥n",x); /*  main内のxの初期値の表示  */
	
	funca(x);
	
	printf("main_xの結果:%d¥n",x);	/*  funca実行後のmain内のxの値の表示  */
}

画面に表示される結果

main_xの初期値:3
funca_xの初期値:?
funca_xの結果:?
main_xの結果:?

さて,それぞれなんと表示されるだろう。まずは考えて見て,次にプログラムを実行して確認すること。


三角形

三角形の底辺の長さと高さを入力する時,面積を求めて戻す関数を作成せよ

#include <stdio.h>

float sankaku(int a, int b) 
{
    float s;

    s = a * b / 2.0;

    return s;
}

void main()
{
    int a, b;
    float s;

    printf("三角形の面積を求めます\n");
    printf("底辺の長さを入力してください:");
    scanf("%d", &a);
    printf("高さを入力してください:");
    scanf("%d", &b);

    s = sankaku(a, b);        //関数を呼び出す

    printf("三角形の面積は,%fです.", s);
}

演習課題

(1)よく使う関数を用意しておこう.

1.二つの整数を渡すと,大きい方を答える関数
2.整数の2乗を計算する関数
3.整数の3乗を計算する関数
4.整数のn乗を計算する関数
5.整数の階乗を計算する関数

main関数の部分はこんな感じ.あとは,関数の定義部分を作ってみよう.

void main()
   {
   int a, b, n;
   printf("aの値を入力してください:");
   scanf("%d", &a);
   printf("bの値を入力してください:");
   scanf("%d", &b);
   printf("n乗のnの値を入力してください:");
   scanf("%d", &n);
   printf("大きい数の値は%d\n", large(a, b));
   printf("aの2乗は%d\n", square(a));
   printf("bの3乗は%d\n", cube(b));
   printf("aの%d乗は%d\n", n, power(a, n));
   printf("bの階乗は%d\n", factorial(b));
   }

(2)半径を入力すると,球の表面積および体積を求めるプログラムを,関数square, cubeを用いて作成せよ.面積は実数であることに注意.ただし,円周率は3.14とする.

(3)実数xの値を入力し,y=5x5-12x4+3x+1を求めるプログラムを関数powerを用いて作成せよ.

(アドバンスド)先週の階乗を求める関数を,n! = n * (n-1)! であることを利用してプログラムを書くと,どうなるか?考えてみよう.C言語では,関数の中から自分自身を呼び出すことができます.(これを再帰呼出といいます)