8. 関数

目的: 同じプログラムが繰り返し現れた時一ケ所にまとめてプログラムのサイズを小さくする.保守性、作り易さが高まる.


subss_setu.gif
space.gif
line.gif
space.gif
[ 流れ図 ] 上の数式に対する流れ図
subss_flowS.gif
subss_fncS.gif
space.gif
line.gif
space.gif
#include<stdio.h>

int Subss(int x, int y){
space.gifint z;
space.gif z = x*x + y*y;
space.gif return z;
}

int main(void){
space.gifint a, b, c, d, e, f, g;
space.gifprintf("Input b, c, e, f");
space.gifscanf("%d %d %d %d", &b, &c, &e, &f);
space.gifa = Subss( b, c );
space.gifd = Subss( e, f );
space.gifg = a+d;
space.gifprintf("g=%d\n", g);

}
space.gif
line.gif
space.gif
[文法]
・形式 関数は次の形の文字列:

  返却値 関数名(仮引数の宣言){
space.gif 関数本体
space.gif ・・・
  }

・呼び出し部分
関数名(実引数,・・・)
space.gif
line.gif
space.gif
[return文]
return文に出会うと、ただちに呼び出し側に戻る。
その際、return文に続いて書かれている返す。
return文が省略されている時は、関数の終わりを示す}で代用。

[main()]
C言語では、プログラムのすべてを関数の形で記述
main()も関数。

[void型]
関数に返却値がない場合、型指定子にはvoidと記述。
space.gif
line.gif
space.gif
例 (サブルーチン+配列)
mtrxmlt_flowS.gif
・A,B,C,X,Yは3×3行列
space.gif
line.gif
space.gif
#include<stdio.h>
void MtrxMlt( int X[3][3], int Y[3][3] ); /* 関数原型宣言 */
int C[3][3];

int main(void){
space.gif int i;
space.gif int A[3][3], B[3][3];
space.gif for(i=0;i<3;i++)
space.gif scanf("%d %d %d", &A[i][0], &A[i][1], &A[i][2]);
space.gif for(i=0;i<3;i++)
space.gif scanf("%d %d %d", &B[i][0], &B[i][1], &B[i][2]);
space.gif MtrxMlt(A,B); /* 関数呼び出し */
space.gif for(i=0; i<3; i++)

space.gif
printf("%d, %d, %d\n", C[i][0], C[i][1], C[i][2]);

space.gif return 0;

}
space.gif
line.gif
space.gif
void MtrxMlt( int X[3][3], int Y[3][3] ){
space.gif int i,j,k;
space.gif for(i=0; i<3; i++){
space.gif for(j=0; j<3; j++){
space.gif C[i][j] = 0;
space.gif for(k=0; k<3; k++){
space.gif C[i][j] = C[i][j] + X[i][k] * Y[k][j];
space.gif }
space.gif }
space.gif }
}
space.gif
line.gif
space.gif
[ 関数原形宣言 ]
関数を使用する時、あらかじめ宣言しなければならない。
関数の宣言では、関数の返却値、関数の渡す値(引数)の型を明らかにする。

・形式
space.gif 型指定子 関数名(仮引数型並び); または
space.gif 型指定子 関数名(識別子並び);

型指定子:関数の返却値の型
仮引数型並び:関数に渡す引数と識別子の並び(識別子は省略可)
space.gif
line.gif
space.gif
再帰
[再帰関数呼び出し]
関数が、自分自身を呼び出すことを関数の再帰呼出しという。

例 ハノイの塔
(3枚の石盤を1から2の棒に移す)

hanoi_flowS.gif
space.gif
line.gif
space.gif
#include<stdio.h>
void Hanoi(int n, int a, int b, int c){
space.gif if(n>0){
space.gif Hanoi(n-1, a, c, b );
space.gif printf("%d:%d -> %d \n", n, a, b);
space.gif Hanoi(n-1,c,b,a);
space.gif}
}

int main( void ) {
space.gif Hanoi(3, 1, 2, 3);
space.gif return 0;
}