Download presentation
Presentation is loading. Please wait.
Published byさなえ たかはし Modified 約 8 年前
1
プログラミング入門2 芝浦工業大学情報工学科青木 義満 第6回関数(2)
2
プログラミング入門2 2 今回の講義内容 関数 配列データの受け渡し ( p.130 ~) 入出力と文字 ( p.198 ~) 文字列の基本 ( p.208 ~)
3
プログラミング入門2 3 最大体重と最小体重を求めるプログラム ( 一部 ) 例えば・・・・ double weight[NUM]; double min, max; min = max = weight[0]; for( i= 1; i < NUM; i++ ){ if ( weight[i] > max ) max = weight[i]: if ( weight[i] < min ) min = weight[i]: } double weight[NUM]; double min, max; min = max = weight[0]; for( i= 1; i < NUM; i++ ){ if ( weight[i] > max ) max = weight[i]: if ( weight[i] < min ) min = weight[i]: } 最大値・最小値を求める処 理 配列 weight のデータを受け取り,そ の要素の中で最大・最小を求める 配列データをそのまま受け取る関数が必要!
4
プログラミング入門2 4 関数での配列データの必要性 整数値を2つ受け取り,最大値を求める関数 整数値を3つ受け取り,最大値を求める関数 呼び出し側 maxof(a, b); int maxof( int x, int y ) { ・・・・・・ } 関数定義部 呼び出し側 maxof(a, b , c); int maxof( int x, int y , int z ) { ・・・・・・ } 関数定義部 判定する値の数が増えたら・・・配列でまとめてデータを渡す!
5
プログラミング入門2 5 配列の受け渡し ( p.130 ) 構文 main 関数は eng という配列を渡し,関数 maxof は,その配列データを vc という名前で 受け取る。 int eng[5]; /* 英語の点数 */ int max_e; /* 英語の最高点 */ 配列 eng に5つの得点データを読み込み max_e = maxof( eng, 5 ); main 関数(呼び出し側) 配列名 ( [] は不要) 配列の要素数 int maxof( int vc[], int no ) { ・・・配列 vc[0] ~ vc[4] を使った処理・・・ } 関数 int の配列を受け取 る時の宣言 配列の要素数 eng[4] eng[3] eng[2] eng[1] eng[0] main 関数 vc[4] vc[3] vc[2] vc[1] vc[0] maxof 関数
6
プログラミング入門2 6 例題 関数による配列の受け渡し ソースファイル名: list0611.c (p.130) 英語の点数と数学の点数を配列として受け取り,それぞれの最高点を求め る関数を作成せよ #include #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 i; int eng[NUMBER]; int mat[NUMBER]; int max_e, max_m; printf("%d 人の点数を入力してください。 \n", NUMBER); for (i = 0; i < NUMBER; i++) { printf("[%d] 英語: ", i + 1); scanf("%d", &eng[i]); printf( " 数学: "); scanf("%d", &mat[i]); } max_e = max_of(eng, NUMBER); max_m = max_of(mat, NUMBER); printf(" 英語の最高点= %d\n", max_e); printf(" 数学の最高点= %d\n", max_m); return (0); } 配列を関数に受け渡し 関数による 配列の受け取り
7
プログラミング入門2 7 関数呼び出しと引数の引渡し過程 (先週の復 習) int main(void) { int na, nb, max; na = 24; nb = 62; ・・・・ } int main(void) { int na, nb, max; na = 24; nb = 62; ・・・・ } max = maxof( na, nb ); main 関数 int maxof( int x, int y ) { if (x > y) return (x); else return (y); } int maxof( int x, int y ) { if (x > y) return (x); else return (y); } 62 24 実引数 仮引数 実引数 na, nb の値が,仮引数 x, y に それぞれコピーされる (変数そのものでなく,中に格納されている値 が受け渡される!) 実引数 na, nb の値が,仮引数 x, y に それぞれコピーされる (変数そのものでなく,中に格納されている値 が受け渡される!) 重要 return か,関数最後の } で 呼び出し元へ戻る return か,関数最後の } で 呼び出し元へ戻る 62
8
プログラミング入門2 8 受け取った配列への書込み ( p.132 ) 関数への値の受け渡し(配列以外) 実引数の値が,仮引数にコピーされる (変数そのものでなく,中に格納されている値が受け渡さ れる!) 実引数の値が,仮引数にコピーされる (変数そのものでなく,中に格納されている値が受け渡さ れる!) 重要 関数への値の受け渡し(配列の場合) 呼び出された側の関数で仮引数として受け取った配列は,呼び 出し側で与えた実引数の配列そのものである。 重要 詳しい理由は,後日の ” ポインタ ” で説明
9
プログラミング入門2 9 受け取ったデータへの書込み 例1 #include void set_value( int x, int y ) { x = 0; y = 0; } int main(void) { int na, nb; na = 10; nb = 5; set_value( na, nb ); printf(“na= %d\n”, na ); printf(“nb= %d\n”, nb ); return (0); } #include void set_value( int x, int y ) { x = 0; y = 0; } int main(void) { int na, nb; na = 10; nb = 5; set_value( na, nb ); printf(“na= %d\n”, na ); printf(“nb= %d\n”, nb ); return (0); } 表示結果は?
10
プログラミング入門2 10 受け取った配列への書込み 例2 #include void set_value( int vc[] ) { vc[0] = 0; vc[1] = 0; } int main(void) { int x[2]; x[0] = 10; x[1] = 5; set_value( x ); printf(“x[0]= %d\n”, x[0] ); printf(“x[1]= %d\n”, x[1] ); return (0); } #include void set_value( int vc[] ) { vc[0] = 0; vc[1] = 0; } int main(void) { int x[2]; x[0] = 10; x[1] = 5; set_value( x ); printf(“x[0]= %d\n”, x[0] ); printf(“x[1]= %d\n”, x[1] ); return (0); } 表示結果は? x[1] x[0] main 関数 vc[1] vc[0] set_value 関数 0 0 = =
11
プログラミング入門2 11 例題 ~受け取った配列への書込み ソースファイル名: list0612.c (p.132) 内容:受け取った配列の全要素の値を0にする関数 #include void int_set( int vc[], int no ) { int i; for (i = 0; i < no; i++) vc[i] = 0; } int main(void) { int i; int ary1[] = {1, 2, 3, 4, 5}; int ary2[] = {3, 2, 1}; int_set(ary1, 5); int_set(ary2, 3); #include void int_set( int vc[], int no ) { int i; for (i = 0; i < no; i++) vc[i] = 0; } int main(void) { int i; int ary1[] = {1, 2, 3, 4, 5}; int ary2[] = {3, 2, 1}; int_set(ary1, 5); int_set(ary2, 3); for (i = 0; i < 5; i++){ printf(“ary1[%d] = %d\n”, i, ary1[i]); } for (i = 0; i < 3; i++){ printf(“ary2[%d] = %d\n”, i, ary2[i]); } return (0); } for (i = 0; i < 5; i++){ printf(“ary1[%d] = %d\n”, i, ary1[i]); } for (i = 0; i < 3; i++){ printf(“ary2[%d] = %d\n”, i, ary2[i]); } return (0); }
12
プログラミング入門2 12 変数の有効範囲と寿命 ( p.140 ) いろいろな場所にある x, それぞれの値はいく つ? #include int x = 77; void print_x1(void) { int x = 777; printf( "x = %d\n", x ); } void print_x2(void) { printf( "x = %d\n", x ); } #include int x = 77; void print_x1(void) { int x = 777; printf( "x = %d\n", x ); } void print_x2(void) { printf( "x = %d\n", x ); } int main(void) { int x=7; printf( "x = %d\n", x ); print_x1(); print_x2(); printf( "x = %d\n", x ); return(0); } int main(void) { int x=7; printf( "x = %d\n", x ); print_x1(); print_x2(); printf( "x = %d\n", x ); return(0); } ① ② ③ ④ ①~④ : どんな値が表示?
13
プログラミング入門2 13 変数の有効範囲と寿命 ( p.140 ) ファイル有効範囲,ブロック有効範囲 #include int x = 77; void print_x1(void) { int x = 777; printf( "x = %d\n", x ); } void print_x2(void) { printf( "x = %d\n", x ); } #include int x = 77; void print_x1(void) { int x = 777; printf( "x = %d\n", x ); } void print_x2(void) { printf( "x = %d\n", x ); } int main(void) { int x=7; printf( "x = %d\n", x ); print_x1(); print_x2(); printf( "x = %d\n", x ); return(0); } int main(void) { int x=7; printf( "x = %d\n", x ); print_x1(); print_x2(); printf( "x = %d\n", x ); return(0); } ファイル有効範囲 ブロック有効範囲 (関数内) ブロック有効範囲 ( main 関数内) ・ファイル有効範囲: プログラム全体に渡って使用することができる( main 関数,自作関数) ・ブロック有効範囲:ある関数内のみで仕様できる ・ファイル有効範囲: プログラム全体に渡って使用することができる( main 関数,自作関数) ・ブロック有効範囲:ある関数内のみで仕様できる
14
プログラミング入門2 14 変数の有効範囲と寿命 ( p.140 ) ファイル有効範囲,ブロック有効範囲 #include int x = 77; int main(void) { int x=7; printf( "x = %d\n", x ); print_x1(); print_x2(); printf( "x = %d\n", x ); return(0); } #include int x = 77; int main(void) { int x=7; printf( "x = %d\n", x ); print_x1(); print_x2(); printf( "x = %d\n", x ); return(0); } ファイル有効範囲 ブロック有効範囲 ( main 関数内) ファイル有効範囲とブロック有効範囲を 持つ同じ名前の変数が存在する場合は, ブロック有効範囲のものが “ 見えて ” ,フ ァイル有効範囲のものは隠される!
15
プログラミング入門2 15 変数の有効範囲と寿命 ( p.140 ) いろいろな場所にある x, それぞれの値はいく つ? #include int x = 77; void print_x1(void) { int x = 777; printf( "x = %d\n", x ); } void print_x2(void) { printf( "x = %d\n", x ); } #include int x = 77; void print_x1(void) { int x = 777; printf( "x = %d\n", x ); } void print_x2(void) { printf( "x = %d\n", x ); } int main(void) { int x=7; printf( "x = %d\n", x ); print_x1(); print_x2(); printf( "x = %d\n", x ); return(0); } int main(void) { int x=7; printf( "x = %d\n", x ); print_x1(); print_x2(); printf( "x = %d\n", x ); return(0); } ① ② ③ ④ ① 7 ② 777 ③ 77 ④ 7 ① 7 ② 777 ③ 77 ④ 7 表示結果
16
プログラミング入門2 16 プログラム全体( main 関数とその他の関数内)で変 数を使いたい場合 → ファイル有効範囲の変数を使う → 宣言は #include, #define の後, main 文の前 ※使いすぎはメモリーの消費量大 ある関数内のみで使用する変数 → ブロック有効範囲の変数を使う → 使いたい関数内で宣言 ※ 関数を抜けると,メモリー上から消滅 用途に応じて,上手に使い分ける 変数の有効範囲と寿命 ( p.140 )
17
プログラミング入門2 17 ファイル有効範囲を持つ変数の使用例 複数の関数の呼び出し回数をカウント ソースファイル名: count.c #include int count = 0; void func1(void) { printf( “fun1 was called\n" ); count++; } void func2(void) { printf( “fun2 was called\n" ); count++; } #include int count = 0; void func1(void) { printf( “fun1 was called\n" ); count++; } void func2(void) { printf( “fun2 was called\n" ); count++; } int main(void) { int i; func1(); func2(); for(i=0; i < 5; i++){ func1(); } for(i=0; i < 3; i++){ func2(); } printf( “count = %d\n", count ); return(0); } int main(void) { int i; func1(); func2(); for(i=0; i < 5; i++){ func1(); } for(i=0; i < 3; i++){ func2(); } printf( “count = %d\n", count ); return(0); } ファイル有効範囲
18
プログラミング入門2 18 自動記憶域期間と静的記憶域期間 ソースファイル名: list0619.c 内容: 変数の寿命を理解する #include int fx = 0; void func(void) { static intsx = 0 ; intax = 0; printf("%3d%3d%3d\n", ax++, sx++, fx++); } int main(void) { int i; puts(" ax sx fx"); puts("----------"); for (i = 0; i < 10; i++) func(); puts("----------"); return (0); } #include int fx = 0; void func(void) { static intsx = 0 ; intax = 0; printf("%3d%3d%3d\n", ax++, sx++, fx++); } int main(void) { int i; puts(" ax sx fx"); puts("----------"); for (i = 0; i < 10; i++) func(); puts("----------"); return (0); } 静的記憶域期間 自動記憶域期間 表示結果を確認 ax sx fx -------------- 0 0 0 0 1 1 0 2 2 0 3 3 ・・・・・・・・
19
プログラミング入門2 19 1.配列データ中からの値の探索プログラム 以下の手順により,配列中にある値のデータがあるかどうかを判 定する関数を作成し,動作を確認せよ。見つかった場合には,そ の要素番号を,見つからなかった場合には, -1 を返すようにせよ。 ( kadai6-1.c ) 演習課題 (第6回) ・ int 型配列(要素 5 )を用意 ・配列にキーボードから 5 個の整数値を入力,配列に値をセット ・探したい値をキーボードから入力 ・ search_value 関数に配列データと探したい値を渡し,データをサーチ ・ search_value 関数の返却値により,結果を表示 見つかった場合には,データが見つかった位置(要素番号)と値 見つからなかった場合には,見つからなかった旨 を表示せよ。 int search_value( int x[ ], int key ); 探索対象データ 5 個の整数値が格納された配列 探索キーとなる値 探したい値 見つかったらそのデータの要素番号を 見つからなかったら -1 を返す
20
プログラミング入門2 20 2. 1~ 20 人分のテストの点数を繰り返し入力し,データに応じて以下のような分布 グラフを表示する プログラムを作成せよ。 ( kadai6-2c ) ただし,分布グラフの表示には以下の関数を作成・使用せよ。 分布グラフ A 80 - 100 : **** B 70 - 79 : ******* C 60 - 69 : **** D 0 - 59 : ** void display_graph( int tensu[ ], int num ); 点数データの格納 されている配列 人数 3. 上記2のプログラムに、全得点データの平均と分散の値を表示する関数 ( kadai6-3.c ) void heikin_bunsan( int tensu[ ], int num ); を作成し,分布グラフと共に結果を表示せよ。
21
プログラミング入門2 21 提出方法 演習課題1〜3のプログラムを作成し,動作確認した上で ソースファイル( kadai6-1.c 〜 kadai6-3.c ) をメールに添付して 提出せよ。 提出方法: メールの題名( subjet )を, “pro2-6” + “ 学籍番号 ” + ” 自分の苗字 ” (全て半 角英数文字にて)とする。 例) pro2-6 L02001 aoki 提出先: yaoki@sic.shibaura-it.ac.jp ( 青木アドレス ) yaoki@sic.shibaura-it.ac.jp 提出期限: 11 月 12 日(月) 13:00 まで(時間厳守)
22
プログラミング入門2 22中間テスト 日時:11月19日(月)13:00〜 ※12時50分までに入室すること。座席は指定。 場所:斉藤記念館大教室 試験範囲:初回〜第6回までの講義内容 期末試験と並び、重要な評価指標となるので、し っかり準備すること。
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.