第11回[平成15年7月3日(木)]:PN03-11.ppt 関数(1) 今日の内容 1 2 3 4 5 関数とは、関数の必要性 戻り値のある関数 引数と関数呼び出し 戻り値の無い関数 関数による配列の取扱い 関数の必要性 複数のN×Nの掛け算表を出力する int a, b; printf("まず、3×3の表\n"); for ( a=1; a<=3; a++) { for ( b=1; b<=3; b++) printf("%3d",a*b); printf("\n"); } ab 1 1 1 2 2 3 3 1 2 3 2 4 6 3 6 9 4 8 12 5 10 15 6 12 18 printf("次に、6×6の表\n"); for ( a=1; a<=6; a++) { for ( b=1; b<=6; b++) { printf("%3d",a*b); printf("\n"); } /*つづく*/ 2 2 4 6 4 8 12 16 20 24 3 3 6 9 5 10 15 20 25 30 6 12 18 24 30 36 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); • 関数値(戻り値)を返す 返す値の型を指定して関数定義する 関数頭部 double myfn(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 evod(int k); 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 ); } 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); int main(void) { else char A,B,C; return (0); 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で呼出し側に返す • 変数名は命令の定義を行うところでのみ有効 一般形 int fff(int a, int b, double d) //関数の型 関数名(型 変数名, 型 変数名, ...) { int x,y; {関数の中だけで使う変数を宣言} ・・・ return (関数の結果値); ・・・ } 戻り値の無い関数の定義と実行 #include <stdio.h> void NN_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); ・・・ } 戻り値の無い関数の特徴と一般形 特徴 • 一連の文を一まとまりの命令として定義 • 仮引数と実引数の関係、関数内で宣言された変 数の扱いは、戻り値のある関数の場合と同じ 一般形 void ZZZ(int a, int b, double d) //void 関数名(型 変数名,....) { int x,y; //関数内で使う変数を宣言 命令の集まり(仕事の手順) } 戻り値の有無による関数の違い 戻り値のある関数 戻り値の無い関数 returnの型(関数 の型)で宣言 void で宣言される return 式 で呼び 出し側に値を返す 式を伴ったreturn は無い(returnその ものはあっても良い) 関数は呼び出し側では、 文の一部となる ..; x=ff(a);.. 文そのものとなる ..; xyz(7);.. 引数に関する考え方は全く同じである 引数の無い関数の特徴と一般形 特徴 • 戻り値のある場合、無い場合がある • 呼び出し側からは引数を書かない 関数名( ) • 関数定義で引数のところは void とする 一般形 int ZZZ(void) //戻り値の型 関数名(void) { int x,y; /*関数内の変数の宣言*/ 命令の集まり(仕事の手順) } 関数(引数、戻り値)のまとめ 戻り値有り 引 int fn(int a) { 数 double x; int 有 k; ・・・ り 戻り値無し void fn(int a){ double x, y; ・・・ return; ・・・ } return (k); ・・ } 引 int fn(void) { 数 double x; int 無 k; し ・・・ void fn(void) { double x, y; ・・・ return; ・・・ } (標準)ライブラリ関数 • よく用いられる関数などをまとめたファイル • ヘッダファイル[***.h] • #include <***.h> で取り込む 入出力関係 stdio.h scanf,printf math.h 数学関数 cos, sin, tan, exp, log, log10, sqrt stdlib.h 一般ユーティリティ abs, rand, srand 配列の受け渡し • 仮引数の配列に[]を付け、要素数は別引数で 与える int max_of(int vc[], int no) • 実引数には、配列名と要素数を与える int eng[100]; = max_of(eng, 100) intmax_e max_of(int vc[], int no) { int i; int max = vc[0]; 配列vc[i] for ( i=1; i<no; i++) ・・・ を使う return (max); } #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]) ただし、第1添え字は省略可能 int max( int vc[][10], int no1) • 実引数には、配列名だけを与えればよい。 define Num1 5 define Num2 10 int eng[Num1][Num2]; max_e = max(eng); max(eng , int Num1); • 仮引数の配列は実引数の配列そのもの → 書き換えが可能 P入門(第11回)は 終了です。 次回(第12回)は 7月10日 続いて、P演習に入ります。 では、しばらく休憩します。
© Copyright 2024 ExpyDoc