8. 関数目的: 同じプログラムが繰り返し現れた時一ケ所にまとめる。例 |
|
[ 流れ図 ] 数式に対する流れ図 |
|
#include<stdio.h> int Subss(int x, int y){ int z; z = x*x + y*y; return z; } int main(void){ int a, b, c, d, e, f, g; printf("Input b, c, e, f"); scanf("%d %d %d %d", &b, &c, &e, &f); a = Subss( b, c ); d = Subss( e, f ); g = a+d; printf("g=%d\n", g); } |
|
[文法] ・形式 関数は次の形: 返却値 関数名(仮引数の宣言){ 関数本体 ・・・ } ・呼び出し部分 関数名(実引数,・・・) |
|
[return文] return文に出会うと、ただちに呼び出し側に戻る。 その際、return文に続いて書かれている式を返す。 return文が省略されている時は、関数の終わりを示す}で代用。 [main()] C言語では、プログラムのすべてを関数の形で記述 main()も関数。 [void型] 関数に返却値がない場合、型指定子にはvoidと記述。 |
|
例 (サブルーチン+配列) ・A,B,C,X,Yは3×3行列 |
|
#include<stdio.h> void MtrxMlt( int X[3][3], int Y[3][3] ); /* 関数原型宣言 */ int C[3][3]; int main(void){ int i; int A[3][3], B[3][3]; for(i=0;i<3;i++) scanf("%d %d %d", &A[i][0], &A[i][1], &A[i][2]); for(i=0;i<3;i++) scanf("%d %d %d", &B[i][0], &B[i][1], &B[i][2]); MtrxMlt(A,B); /* 関数呼び出し */ for(i=0; i<3; i++) printf("%d, %d, %d\n", C[i][0], C[i][1], C[i][2]); return 0; } |
|
void MtrxMlt( int X[3][3], int Y[3][3] ){ int i,j,k; for(i=0; i<3; i++){ for(j=0; j<3; j++){ C[i][j] = 0; for(k=0; k<3; k++){ C[i][j] = C[i][j] + X[i][k] * Y[k][j]; } } } } |
|
[ 関数原形宣言 ] 関数を使用する時、あらかじめ宣言しなければならない。 関数の宣言では、関数の返却値、関数の渡す値(引数)の型を 明らかにする。 ・形式 型指定子 関数名(仮引数型並び); または 型指定子 関数名(識別子並び); 型指定子:関数の返却値の型 仮引数型並び:関数に渡す引数と識別子の並び(識別子は省略可) |
|
再帰 [再奇関数呼び出し] 関数が、自分自身を呼び出すことを関数の再帰呼出しという。 例 ハノイの塔 (3枚の石盤を1から2の棒に移す) |
|
#include<stdio.h> void Hanoi(int n, int a, int b, int c){ if(n>0){ Hanoi(n-1, a, c, b ); printf("%d:%d -> %d \n", n, a, b); Hanoi(n-1,c,b,a); } } int main( void ) { Hanoi(3, 1, 2, 3); return 0; } |