• 検索結果がありません。

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

N/A
N/A
Protected

Academic year: 2021

シェア "関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数"

Copied!
27
0
0

読み込み中.... (全文を見る)

全文

(1)

関数

関数

C

C

言語は

言語は

関数の言語

関数の言語

関数の定義:

f(x) = x * x ;

使うときは:

y = f(x)

関数とは

関数とは

引数

戻り値

(2)

関数の定義

関数の定義

int funcname ( int

a, char

b

) {

int c ;

c = a * b ;

return c

;

} ;

引数の型 戻り値 戻り値の型 関数名 引数の名前 引数の型 引数の名前 戻り値の型は int 変数 c の型も int return c で, 戻り値の型と,変数の型が一致

(3)

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 に戻される

(4)

関数の定義

関数の定義

void

funcname (

int a

) {

printf("答えは %d です.¥n", a) ;

} ;

戻り値なし

戻り値がない場合

void funcname (

void

) {

printf("エラーです.¥n", a) ;

} ;

戻り値なし

引数がない場合

引数もなし

(5)

int main(void) {

int a,b ;

a = 5 ;

b

= a * a ;

printf("b = %d¥n", b) ;

return 0 ;

} ;

関数の定義

関数の定義

#include <stdio.h>

引数なし 戻り値

main も関数

コンパイラは main() という関数を探して,main() から

実行を開始するようにプログラムを生成します.

(6)

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 ; }

(7)

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 ; } ;

(8)

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 ; } ; 定義が後ろに ある時は,関数 の形だけを宣言 しておく. プロトタイプ宣言

(9)

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 ; } ; 値のコピー 値のコピー

(10)

関数

関数

(変数の領域)

(変数の領域)

メモリ空間

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 ; } ; ここまで実行

(11)

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:

(12)

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: 25

(13)

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: 25

解放

(14)

関数

関数(

(

再帰呼び出し

再帰呼び出し

)

)

関数の中で,自分自身を呼び出したら?

階乗関数の定義

n! = 0 if n = 1 ;

n * (n - 1)! if n > 1

{

注意! 階乗計算に再帰を使うのは 説明が簡単 でも とても非効率

(15)

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 ここまで実行

(16)

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) 実行中

(17)

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) 実行中

(18)

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) 実行中

(19)

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) が呼ばれる

(20)

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:

(21)

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: 1

(22)

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: 1 戻り値

(23)

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 * 1

(24)

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) 実行中 戻り値

(25)

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 * 1

(26)

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) 実行中 戻り値

(27)

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 ここまで実行 main 実行中 fact 関数の領域 int n: 2 int y: 2 解放

参照

関連したドキュメント

We aim at developing a general framework to study multi-dimensional con- servation laws in a bounded domain, encompassing all of the fundamental issues of existence,

東京都は他の道府県とは値が離れているように見える。相関係数はこう

We provide an accurate upper bound of the maximum number of limit cycles that this class of systems can have bifurcating from the periodic orbits of the linear center ˙ x = y, y ˙ =

In the second section, we study the continuity of the functions f p (for the definition of this function see the abstract) when (X, f ) is a dynamical system in which X is a

We study a Neumann boundary-value problem on the half line for a second order equation, in which the nonlinearity depends on the (unknown) Dirichlet boundary data of the solution..

Algebraic curvature tensor satisfying the condition of type (1.2) If ∇J ̸= 0, the anti-K¨ ahler condition (1.2) does not hold.. Yet, for any almost anti-Hermitian manifold there

Some of the known oscillation criteria are established by making use of a technique introduced by Kartsatos [5] where it is assumed that there exists a second derivative function

『国民経済計算年報』から「国内家計最終消費支出」と「家計国民可処分 所得」の 1970 年〜 1996 年の年次データ (