概要 プログラミング 関数 http://www.ns.kogakuin.ac.jp/~ct40/progc/ A- 関数の作り方を学ぶ 関数名, 引数, 戻り値 プログラミング で最も重要な事項 関数 プログラミング で最も重要な事項 制御 (for, if) プログラミング で最も重要な事項 ポインタ A- 関数名 引数 戻り値 E- E-4 関数の概要 0/ 関数とは, 複数の処理をひとまとめにしたもの. 同じ処理 / 似た処理を何度も記述するような場合に便利. 関数は 引数 を受け取り, 戻り値 を返すことができる. 実は,printf() も main() も関数. E-5 関数の概要 / printf("hello,"); 4 printf("world"); 5 printf("!!!! n"); 6 printf("------------ n"); 7 printf("hello,"); printf("world"); 9 printf("!!!! n"); 0 printf("############ n"); printf("hello,"); printf("world"); printf("!!!! n"); 4 この 行まとめて, 個のグループにしたい. ------------ ############ E-6 関数の概要 / 7 プログラムは main() から始まる. 9 0 printhw(); printf("------------ n"); printhw(); printf("############ n"); 4 printhw(); 5 関数を 呼び出す と言う. この 行が 個のグループになった. グループ名は printhw printhw(); で, printhw グループを一括して実行できる. 正しくは, グループではなく 関数 と呼ぶ E-7 関数の動作 0/ 4 7 9 5 0 printhw(); 6 printf("------------ n"); printhw(); printf("############ n"); 4 printhw(); 5 E-
関数の動作 / 9 7 9 0 0 printhw(); 7 printf("------------ n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 ( 後述 ) printhw である. 7 main() の書き方と同じである.main() も関数である. 引数 ( 後述 ) 空である. 関数の中身 理解すべきは 点. 関数名, 引数, 戻り値 void sankaku(){ printf(" n"); 4 printf(" n"); 5 printf(" n"); 6 printf(" n"); 7 void gyaku_sankaku(){ 9 printf(" n"); 0 printf(" n"); printf(" n"); printf(" n"); 4 5 sankaku(); 6 gyaku_sankaku(); 7 sankaku(); sankaku(); 9 gyaku_sankaku(); 0 関数の作り方 関数の作り方 ( 例 ) この 行で, sankaku() の全てが一括して実行される. E-9 E- E- 関数の作り方 ( 例 ) void printhw(){ printf("hello,"); printf("world"); printf("!!!! n"); void phw0(){ int i; for(i=0; i<0; i++){ printf("hello,world! n"); printhw(); phw0(); 練習 ( い ) printf("hello, n"); printf("world! n"); 関数名に数字も使用可. ただし, 数字から始まる関数名は NG. 例 : 0pHW は NG E-0 関数の中で変数を使うことも可能. この変数は phw0 の中でしか使えない. これはローカル変数. ( 後述 ) を行う関数を作成し, それを main 関数から呼び出すプログラムを記述せよ. 関数名は pr_hl_wld とせよ. 戻り値の欄は void, 引数の欄は () とせよ. E- E-4 関数の作り方 ( 引数 ) この部分に, 引数について記述する. この例では引数はなし ( 空,void). 7 E-6 E-7
引数とは, 関数に与える情報. 関数に情報を与えることが可能. 関数では, 与えられた情報を使用して処理することが可能. 情報 とは,int 型の値,double 型の値などである. 引数は, 何個でも用意できる. 関数に行くときに値を持っていく E- 引数を受け取る関数. 戻り値 ( 後述 ) void である. 関数名. print_int. 引数. int 型変数 個. それを i とする. 厳密には仮引数と言う. E-9 関数に引数を渡す. print_int(); 変数 i が宣言されており, i を使用可能. i = として関数が 引数が int 型 個なので, int 型 個 ( この例では ) を与えて関数呼び出し. 始まる. i= void printhw_n(int n){ int i; printf("hello,world"); for(i=0; i<n; i++){ printf("!"); / n 個の! を表示 / printf(" n"); printhw_n(4); printhw_n(7); for 文を使う例!!! E-0 E- 呼び出される関数と, 呼出し処理をまとめると, print_int() を呼び出すには, 呼び出すよりも前に print_int() が宣言 ( 記述 ) されていなくてはならない. ( あるいは, 宣言されていることが推奨される. C 言語では推奨. C++ では必須.) ただし, プロトタイプ宣言を行えばこの限りでない. print_int(); プログラムは, 必ず main() から始まる. 引数 個の例引数 個の例.,( カンマ ) で区切る void print_sum(int a, int b){ printf("%d + %d = %d n", a, b, (a+b)); 実引数に, 変数を使った例. int x=, y=7; print_sum(x,y); + 7 = 0 E- E- void print_nchar(char c, int n){ int i=0; for(i=0; i<n; i++){ printf("%c", c); printf(" n"); char 型と int 型を受け取った例. char 型は 文字 型. 文字 個を表す. 引数は,char 型と,int 型なので, char 型の値と,int 型の値を入れて呼び出す char ch = ''; int x = 7; print_nchar(ch,x); E-4 関数の作り方 ( 戻り値 ) E-5
この部分に, 戻り値について記述する. この例では引数はなし ( 空,void). 7 E-6 戻り値とは, 関数が呼び出しもとに返す情報. 関数から, 関数の呼び出しもとに情報を返すことが可能. 戻り値は, 関数の終了時に返される. 情報 とは,int 型の値,double 型の値などである. 戻り値は, 最大でも 個. void なら,0 個. 関数から戻るときに値を持って帰る E-7 戻り値を返す関数. 戻り値. int である. 関数名. square. 引数. int square(int n){ int sq; int 型変数 個. sq = nn; printf("%d^ = %d n", n, sq); E- 戻り値を返す関数. 引数 5 n=5 int square(int n){ int sq; sq = nn; sq=5 printf("%d^ = %d n", n, sq); int s; s = square(5); printf("square=%d n", s); 4 戻り値 5 戻り値が "5" なので, square(5) が 5 となる. よって, s = 5; E-9 int square(int n){ int sq; 4 sq = nn; 5 printf("%d^ = %d n", n, sq); 7 9 0 int s; s = square(5); printf("square=%d n", s); 5^ = 5 square=5 E-0 double double_square(double d){ 引数がdouble 型 個なら, double sq; double 型の値 個を 4 sq = dd; 入れて, 呼び出す. 5 printf("%lf^ = %lf n", d, sq); 7 9.500000^ =.50000 0 double s; square=.50000 s = double_square(.5); printf("square=%lf n", s); E- double double_square(double d){ 戻り値がdouble 型なら, double sq; double 型の値を 4 sq = dd; return する. 5 printf("%lf^ = %lf n", d, sq); 7 9.500000^ =.50000 0 double s; square=.50000 s = double_square(.5); printf("square=%lf n", s); E- int one(){ return ; 4 5 int two(){ 6 return ; 7 int three(){ 9 return ; 0 i=, j=, k= int i, j, k; i = one(); 4 j = two(); 5 k = three(); 6 printf("i=%d, j=%d, k=%d n", i, j, k); 7 E-
int one(){ return ; 4 5 int two(){ 6 return ; 7 int three(){ 9 return ; 0 i=, j=, k= printf("i=%d, j=%d, k=%d n", one(), two(), three()); printf() の中に直接記述しても OK. one() が "",two() が "" と思えば良い. 関数の作り方 ( まとめ ) E-4 関数の作り方 ( 戻り値がない例 ) void one(){ printf(" n"); 4 5 void two(){ 6 printf(" n"); 7 void three(){ 9 printf(" n"); 0 int i, j, k; one(); 4 two(); 5 three(); 6 関数 : 戻り値を捨てる E-5 戻り値の型関数名 ( 引数の型変数名, ){ 関数の中身... ( 変数の宣言なども可能 ) return ; ( 戻り値が void なら, 省略可 ) E-6 double d_sq(double d){ double sq = dd; printf("%lf^ = %lf n", d, sq); double x; x = d_sq(.); d_sq(.4);.00000^ =.440000.400000^ =.560000 戻り値を受け止めて,x に代入. 戻り値を受け止めずに, 捨てる. 特に問題ない. 戻り値情報は失われるが, 関数は正しく実行される. E-7 関数内に return が 関数 : 複数の return 何個あってもよい. x= x = x=-4 x =4 int zettaichi(int n){ if( n<0 ){ 4 return (-n); 5 else { 6 return n; 7 9 0 int x, z; x = ; z = zettaichi(x); printf("x=%d x =%d n", x, z); 4 x = -4; 5 z = zettaichi(x); 6 printf("x=%d x =%d n", x, z); 7 関数 : ローカル変数 void funct(){ int x; x = ; 4 abcd = 4; 5 6 7 int abcd; abcd = 5; 9 funct(); ブロックの外で使おうとしている. これは,NG. コンパイルエラーとなる. 0 ブロックの範囲 E- int abcd は, このブロック内で宣言されているため, このブロックの中でしか使用できない. ブロック内の変数をローカル変数という. E-40 return により, 関数は強制的に終了する. AAAA BBBB 戻り値が無いときは, 単に return; と記述 関数 :return void funct(){ 4 printf("aaaa n"); 5 printf("bbbb n"); 6 return; 7 printf("cccc n"); 9 0 funct(); E-9 関数 : 仮引数と実引数 void func0(int x){ x = ; xが仮引数 4 void func(int i){ 5 i = ; 6 7 int i = 5; 9 0 func0(i); func(i); iが実引数 4 main の i と,func0 の x は別の変数. main の i の値が,func0 の x に代入 ( コピー ) される. func0 の x を変更しても, main の i には影響なし. main の i と,func の i は別の変数. 名前が同じ別の変数. main の i の値が,func の i に代入 ( コピー ) される. func の i を変更しても, main の i には影響なし. E-4