関数
関数
C
C
言語は
言語は
関数の言語
関数の言語
関数の定義:
f(x) = x * x ;
使うときは:
y = f(x)
関数とは
関数とは
引数
戻り値
関数の定義
関数の定義
int funcname ( int
a, char
b
) {
int c ;
c = a * b ;
return c
;
} ;
引数の型 戻り値 戻り値の型 関数名 引数の名前 引数の型 引数の名前 戻り値の型は int 変数 c の型も int return c で, 戻り値の型と,変数の型が一致int main(void) {
int a,b ;
a = 5 ;
b
= square(
a) ;
printf("b = %d¥n", b) ;
return 0 ;
} ;
関数の定義と使用
関数の定義と使用
#include <stdio.h>
int square(int
x) {
関数の定義int y ;
y = x * x ;
return y
;
} ;
引数 戻り値 a の内容が x に渡され return y の y の内容が b に戻される関数の定義
関数の定義
void
funcname (
int a
) {
printf("答えは %d です.¥n", a) ;
} ;
戻り値なし
戻り値がない場合
void funcname (
void
) {
printf("エラーです.¥n", a) ;
} ;
戻り値なし
引数がない場合
引数もなしint main(void) {
int a,b ;
a = 5 ;
b
= a * a ;
printf("b = %d¥n", b) ;
return 0 ;
} ;
関数の定義
関数の定義
#include <stdio.h>
引数なし 戻り値main も関数
コンパイラは main() という関数を探して,main() から
実行を開始するようにプログラムを生成します.
main(void) { char a=10, b=0, c=11, d=2, e ; e = myDiv(a,b) ; e = myDiv(c,d) ; return 0 ; } ;
関数の利用
関数の利用
int main(void) { char a=10, b=0, c=11, d=2, e ; if (b == 0) { printf("Error!¥n") ; e = 0 ; } else { e = a / b ; } ; if (d == 0) { printf("Error!¥n") ; e = 0 ; } else { e = c / d ; } ; return 0 ; } ;int myDiv(int x, int y) { int z ; if (y == 0) { printf("Error!¥n!) ; z = 0 ; } else { z = x / y ; } ; return z ; }
int main(void) { char a=10, b=0, c=11, d=2, e ; e = myDiv(a,b) ; e = myDiv(c,d) ; return 0 ; } ;
関数の利用
関数の利用
int myDiv(int x, int y) { int z ; if (y == 0) { printf("Error!¥n!) ; z = 0 ; } else { z = x / y ; } ; return z ; }
機能のブロック化
•
ブラックボックス化で隠蔽する
•
変更箇所を集約する
分かりやすい関数名をつける
int main(void) { initial_work() ; /* 初期化 */ main_work() ; /* 主処理 */ closing_work() ; /* 終了処理 */ return 0 ; } ;int main(void) { int a,b ; a = 5 ; b = square(a) ; printf("b = %d ¥n", b) ; return 0 ; } ;
関数の定義
関数の定義
(プロトタイプ宣言)
(プロトタイプ宣言)
#include <stdio.h> int square(int x) { int y ; y = x * x ; return y ; } ; 前に定義があるので,関数 の呼び出しができる. #include <stdio.h> int main(void) { int a,b ; a = 5 ; b = square(a) ; printf("b = %d ¥n", b) ; return 0 ; } ; int square(int ) ; int square(int x) { int y ; y = x * x ; return y ; } ; 定義が後ろに ある時は,関数 の形だけを宣言 しておく. プロトタイプ宣言int main(void) { int a,b ; a = 5 ; b = square(a) ; printf("a = %d ¥n", a) ; printf("b = %d ¥n", b) ; return 0 ; } ;
関数
関数
(
(
変数の受け渡し
変数の受け渡し
)
)
#include <stdio.h> int square(int x) { 関数の定義 int y ; y = x * x ; x = 7 ; return y ; } ; 値のコピー 値のコピー関数
関数
(変数の領域)
(変数の領域)
メモリ空間
main 関数の領域 int a: 5 int b: int main(void) { int a,b ; a = 5 ; b = square(a) ; printf("b = %d ¥n", b) ; return 0 ; } ; #include <stdio.h> int square(int x) { int y ; y = x * x ; x = 7 ; return y ; } ; ここまで実行int main(void) { int a,b ; a = 5 ; b = square(a) ; printf("b = %d ¥n", b) ; return 0 ; } ;
関数
関数
(変数の領域)
(変数の領域)
#include <stdio.h> int square(int x) { int y ; y = x * x ; x = 7 ; return y ; } ;メモリ空間
main 関数の領域 int a: 5 int b: ここまで実行 square 関数の領域 int x: 5 int y:int main(void) { int a,b ; a = 5 ; b = square(a) ; printf("b = %d ¥n", b) ; return 0 ; } ;
関数
関数
(変数の領域)
(変数の領域)
#include <stdio.h> int square(int x) { int y ; y = x * x ; x = 7 ; return y ; } ;メモリ空間
main 関数の領域 int a: 5 int b: 25 ここまで実行 square 関数の領域 int x: 7 int y: 25int main(void) { int a,b ; a = 5 ; b = square(a) ; printf("b = %d ¥n", b) ; return 0 ; } ;
関数
関数
(変数の領域)
(変数の領域)
#include <stdio.h> int square(int x) { int y ; y = x * x ; x = 7 ; return y ; } ;メモリ空間
main 関数の領域 int a: 5 int b: 25 ここまで実行 square 関数の領域 int x: 7 int y: 25解放
関数
関数(
(
再帰呼び出し
再帰呼び出し
)
)
関数の中で,自分自身を呼び出したら?
階乗関数の定義
n! = 0 if n = 1 ;
n * (n - 1)! if n > 1
{
注意! 階乗計算に再帰を使うのは 説明が簡単 でも とても非効率int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: fact(2) 実行中int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: n=2 なので fact(1) が呼ばれる fact(2) 実行中int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: fact 関数の領域 int n: 1 int y: fact(1) 実行中int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: fact 関数の領域 int n: 1 int y: fact(1) 実行中 n=1 なので fact(0) が呼ばれるint main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: fact 関数の領域 int n: 1 int y: fact(0) 実行中 fact 関数の領域 int n: 0 int y:int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: fact 関数の領域 int n: 1 int y: fact(0) 実行中 fact 関数の領域 int n: 0 int y: 1int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: fact 関数の領域 int n: 1 int y: fact(0) 実行中 fact 関数の領域 int n: 0 int y: 1 戻り値int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: fact 関数の領域 int n: 1 int y: 1 fact(1) 実行中 fact 関数の領域 int n: 0 int y: 1 解放 fact(0) = 1 n=1 なので y = 1 * 1int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: fact 関数の領域 int n: 1 int y: 1 fact(1) 実行中 戻り値int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: 2 fact(2) 実行中 fact 関数の領域 int n: 1 int y: 1 解放 fact(1) = 1 n=2 なので y = 2 * 1int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;
関数
関数
(再帰呼び出し)
(再帰呼び出し)
#include <stdio.h> int fact(int n) { int y ; if ( n == 0 ) { y = 1 ; } else { y = n * fact(n-1) ; } ; return y ; } ;メモリ空間
main 関数の領域 int n: 2 ここまで実行 fact 関数の領域 int n: 2 int y: 2 fact(2) 実行中 戻り値int main(void) { int n ; n = 2 ; printf("fact(%d) = %d ¥n", n,fact(n)) ; return 0 ; } ;