240 likes | 336 Views
第11回[平成15年7月3日(木)]:PN03 - 11 . ppt. 関数(1). 今日の内容. 1 関数とは、関数の必要性 2 戻り値のある関数 3 引数と関数呼び出し 4 戻り値の無い関数 5 関数による配列の取扱い. 関数の必要性. 複数のN × Nの掛け算表を出力する. int a , b ;. b 1 2 3. a 1. printf(" まず、 3 × 3 の表 <br>"); for ( a =1; a <= 3 ; a ++) { for ( b =1; b <= 3 ; b ++)
E N D
第11回[平成15年7月3日(木)]:PN03-11.ppt第11回[平成15年7月3日(木)]:PN03-11.ppt 関数(1) 今日の内容 1 関数とは、関数の必要性 2 戻り値のある関数 3 引数と関数呼び出し 4 戻り値の無い関数 5 関数による配列の取扱い
関数の必要性 複数のN×Nの掛け算表を出力する int a, b; b 1 2 3 a1 printf("まず、3×3の表\n"); for ( a=1; a<=3; a++) { for( b=1; b<=3;b++) printf("%3d",a*b); printf("\n"); } 1 2 3 2 4 6 3 6 9 2 3 1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24 5 10 15 20 25 30 6 12 18 24 30 36 printf("次に、6×6の表\n"); for ( a=1; a<=6; a++) { for ( b=1; b<=6; b++) { printf("%3d",a*b); printf("\n"); } /*つづく*/
printf("次に、9×9の表\n"); for ( a=1; a<=9; a++) { for ( b=1; b<=9; b++) printf("%3d",a*b); printf("\n"); } 結局、3,6,9という数値Nが違うだけ for ( a=1; a<=N; a++) { for ( b=1; b<=N; b++) printf("%3d",a*b); printf("\n"); } これをNをいろいろ変えて実行できると良い ひとまとまりの仕事を関数 NN_Table(N) で与える
関数の導入 戻り値の無い関数 ひとまとまりの仕事を何回か呼び出したい例[定まった形式で何回か 印刷する] 値を返さない関数 ある計算方法で何回か結果を得たいとき例[複雑な計算を何回か 行う] 値を返す関数 戻り値のある関数
戻り値のある関数 • 自分独自の関数を定義し、標準関数[sqrt, pow, sinなど]と同じように利用する例 z = myfn(2.5); • 関数値(戻り値)を返す返す値の型を指定して関数定義する 関数頭部 doublemyfn(double x) { double f; f = x + 2.0*x - 5.5*x*x; return (f); } 関数本体
戻り値のある関数の定義 例:整数値を受け取り、その値が偶数ならば 0、 奇数ならば 1 を与える関数を作成せよ。 int evod( int k ) { int q; q = k % 2; return (q); } 関数の定義はmain()関数の外に記述する
関数の定義と実行 #include <stdio.h> int evod(int k) { int q; q = k % 2; return (q); } int main(void) { int i, n; for ( i=1; i<=10; i++) { printf("整数を入力="); scanf("%d",&n); printf("偶数か?>%d\n",evod(n)); } return (0); }
関数の定義と実行(補足) #include <stdio.h> int main(void) { int i, n; for ( i=1; i<=10; i++) { printf("整数を入力="); scanf("%d",&n); printf("偶数か?>%d\n",evod(n)); } } int evod(int k) { return ( k % 2 ); } int evod(int k); main()関数より後で定義する場合
間違い探し問題(1) int Sum(int A, int B, int C) { int k; k = A+B+C; return k; } double Sum(double X, Y) { double S; S = X+Y; return; }
間違い探し問題(2) #include <stdio.h> int Upper(char X) { if (X <= 'Z') return (1); else return (0); } int main(void) { char A,B,C; int T1, T2, T3; ・・・ T1 = Upper(A); ・・・ T2 = Upper(B,C); ・・・ T3 = Upper(T1); ・・・ }
引数と呼び出しにつて 引数:関数の中に入る式(変数、値) 仮引数 関数の定義の中での引数 実引数 関数を呼び出す時の引数 呼び出し方(値呼び出し) 式(変数や定数など)の値 実引数の値を仮引数にコピー 実引数の値は変化しない !!
間違い探し問題(3) int Sum(int A, int B, int C) { int Sum; Sum = A+B+C; return (Sum); } double S1(double A, double B) { double Sum; Sum = A+B; if ( B > 0 ) return (A/B); else return (Sum); }
戻り値のある関数の特徴と一般形 特徴 • 関数の計算結果をreturnで呼出し側に返す • 変数名は命令の定義を行うところでのみ有効 一般形 intfff(int a, int b, double d)//関数の型関数名(型 変数名, 型 変数名, ...) { int x,y;{関数の中だけで使う変数を宣言} ・・・ return(関数の結果値); ・・・ }
関数の呼出し 戻り値の無い関数の定義と実行 #include <stdio.h> voidNN_Table(int N) { ..(関数定義の本体).. } int main(void) { printf("3×3の表\n"); NN_Table(3); printf("6×6の表\n"); NN_Table(6); printf("9×9の表\n"); NN_Table(9);} 関数の定義
#include <stdio.h> void NN_Table(int N) { int i, j; for (i=1; i<=N; i++) { for (j=1; j<=N; j++) printf("%3d",i*j); printf("\n"); } } int main(void) { ・・・ printf("6×6の表\n"); NN_Table(6); ・・・ }
戻り値の無い関数の特徴と一般形 特徴 • 一連の文を一まとまりの命令として定義 • 仮引数と実引数の関係、関数内で宣言された変数の扱いは、戻り値のある関数の場合と同じ 一般形 voidZZZ(int a, int b, double d) //void関数名(型 変数名,....) { int x,y; //関数内で使う変数を宣言 命令の集まり(仕事の手順) }
戻り値の有無による関数の違い 戻り値のある関数 戻り値の無い関数 returnの型(関数の型)で宣言 void で宣言される 式を伴ったreturn は無い(returnそのものはあっても良い) return 式 で呼び出し側に値を返す 関数は呼び出し側では、文の一部となる ..; x=ff(a);.. 文そのものとなる ..; xyz(7);.. 引数に関する考え方は全く同じである
引数の無い関数の特徴と一般形 特徴 • 戻り値のある場合、無い場合がある • 呼び出し側からは引数を書かない関数名() • 関数定義で引数のところはvoidとする 一般形 intZZZ(void) //戻り値の型関数名(void) { int x,y; /*関数内の変数の宣言*/ 命令の集まり(仕事の手順) }
関数(引数、戻り値)のまとめ 戻り値有り 戻り値無し int fn(void) { double x; int k; ・・・ return (k); ・・ } 引数有り int fn(int a) { double x; int k; ・・・ return (k); ・・ } void fn(int a){ double x, y; ・・・ return; ・・・ } 引数無し void fn(void) { double x, y; ・・・ return; ・・・ }
(標準)ライブラリ関数 • よく用いられる関数などをまとめたファイル • ヘッダファイル[***.h] • #include <***.h>で取り込む 入出力関係scanf,printf stdio.h 数学関数cos, sin, tan, exp, log, log10, sqrt math.h 一般ユーティリティabs, rand, srand stdlib.h
配列の受け渡し • 仮引数の配列に[]を付け、要素数は別引数で与える int max_of(int vc[], int no) • 実引数には、配列名と要素数を与えるint eng[100];max_e = max_of(eng, 100) int max_of(intvc[], intno) { int i; int max = vc[0]; for ( i=1; i<no; i++) ・・・return (max); } 配列vc[i]を使う
#include <stdio.h> #define NUMBER 5 int max_of(int vc[], int no) {int i; int max = vc[0]; for (i=1; i<no; i++) { if (vc[i]>max) max=vc[i]; return (max); } int main(void) { ・・・ int eng[NUMBER]; k = max_of(eng, NUMBER); ・・・ }
多次元配列の受け渡し • 仮引数の配列の[]の中に要素数を明記するint max( int vc[5][10]) • 実引数には、配列名だけを与えればよい。define Num1 5define Num2 10int eng[Num1][Num2];max_e = max(eng); • 仮引数の配列は実引数の配列そのもの → 書き換えが可能 ただし、第1添え字は省略可能int max( int vc[][10], int no1) max(eng , int Num1);
P入門(第11回)は終了です。次回(第12回)は7月10日P入門(第11回)は終了です。次回(第12回)は7月10日 続いて、P演習に入ります。では、しばらく休憩します。