プログラミング入門2 芝浦工業大学情報工学科青木 義満 第6回関数(2). プログラミング入門2 2 今回の講義内容 関数 配列データの受け渡し ( p.130 ~) 入出力と文字 ( p.198 ~) 文字列の基本 ( p.208 ~)

Slides:



Advertisements
Similar presentations
プログラミング入門2 芝浦工業大学情報工学科青木 義満 第11回構造体. プログラミング入門2 2 構造体 5 人分のサッカー選手データ 全てのデータを関数に渡して,処理する場合 char name[5][256]; int assist[5]; int score[5]; void func( char.
Advertisements

プログラミング 関数編 情報科学科. プログラミングにあたって C 言語では、 main 内に処理を記述 1000 行になるような大きなプログラムでは、 プログラム全体が何をしているのかを把握 することが困難になる 他人が見ると非常に理解しにくい 作成者であっても時が経てば内容を忘れて、他 人が見た時と同じ状況になる.
プログラミング演習( 2 組) 第 9 回
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
関数(1) 第11回 [6月29日、H.16(‘04)] 今日のメニュー 1 前回の課題 2 前回の宿題 3 いろいろな関数の演習 4 課題
ポインタ プログラミング入門2 第10回 芝浦工業大学情報工学科 青木 義満
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第6回 関数(2) 芝浦工業大学情報工学科 青木 義満
プログラミング演習(2組) 第12回
情報理論2 第6回 小林 学 湘南工科大学 2011年11月15日 〒 神奈川県藤沢市辻堂西海岸1-1-25
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月6日、H.16(‘04)] 今日のメニュー 1 前回の課題の復習
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
プログラミング入門2 総合演習課題 2008年 1/7, 1/21 実施 これまでの講義内容についての腕試し
関数 関数とスタック.
プログラミング入門2 第3回 繰り返し文 芝浦工業大学情報工学科 青木 義満
構造体 プログラミング入門2 芝浦工業大学情報工学科 青木 義満
C言語講座 第3回 ポインタ、配列.
プログラミング入門2 第5回 関数(1) 芝浦工業大学情報工学科 青木 義満
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
プログラミング入門2 ファイルの入出力 ポインタ 芝浦工業大学情報工学科 青木 義満
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング入門2 第2回 演算と型 条件分岐 芝浦工業大学情報工学科 青木 義満
知能情報工学演習I 第12回(後半第6回) 課題の回答
プログラミング入門2 第11回 情報工学科 篠埜 功.
今までの練習問題の復習.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
講義では、Cプログラミングの基本を学び 演習では、やや実践的なプログラミングを通して学ぶ
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第11回 プログラミングⅡ 第11回
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
Cプログラミング演習資料.
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
プログラミング 3 2 次元配列.
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
湘南工科大学 2013年10月22日 情報理論2 湘南工科大学情報工学科 准教授 小林 学.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
プログラミング演習I 補講用課題
プログラミング 2 静的変数.
Presentation transcript:

プログラミング入門2 芝浦工業大学情報工学科青木 義満 第6回関数(2)

プログラミング入門2 2 今回の講義内容 関数 配列データの受け渡し ( p.130 ~) 入出力と文字 ( p.198 ~) 文字列の基本 ( p.208 ~)

プログラミング入門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 のデータを受け取り,そ の要素の中で最大・最小を求める 配列データをそのまま受け取る関数が必要!

プログラミング入門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 ) { ・・・・・・ } 関数定義部 判定する値の数が増えたら・・・配列でまとめてデータを渡す!

プログラミング入門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 関数

プログラミング入門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); } 配列を関数に受け渡し 関数による 配列の受け取り

プログラミング入門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); } 実引数 仮引数 実引数 na, nb の値が,仮引数 x, y に それぞれコピーされる (変数そのものでなく,中に格納されている値 が受け渡される!) 実引数 na, nb の値が,仮引数 x, y に それぞれコピーされる (変数そのものでなく,中に格納されている値 が受け渡される!) 重要 return か,関数最後の } で 呼び出し元へ戻る return か,関数最後の } で 呼び出し元へ戻る 62

プログラミング入門2 8 受け取った配列への書込み ( p.132 ) 関数への値の受け渡し(配列以外) 実引数の値が,仮引数にコピーされる (変数そのものでなく,中に格納されている値が受け渡さ れる!) 実引数の値が,仮引数にコピーされる (変数そのものでなく,中に格納されている値が受け渡さ れる!) 重要 関数への値の受け渡し(配列の場合) 呼び出された側の関数で仮引数として受け取った配列は,呼び 出し側で与えた実引数の配列そのものである。 重要 詳しい理由は,後日の ” ポインタ ” で説明

プログラミング入門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); } 表示結果は?

プログラミング入門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 = =

プログラミング入門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); }

プログラミング入門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); } ① ② ③ ④ ①~④ : どんな値が表示?

プログラミング入門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 関数,自作関数) ・ブロック有効範囲:ある関数内のみで仕様できる

プログラミング入門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 関数内) ファイル有効範囲とブロック有効範囲を 持つ同じ名前の変数が存在する場合は, ブロック有効範囲のものが “ 見えて ” ,フ ァイル有効範囲のものは隠される!

プログラミング入門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 表示結果

プログラミング入門2 16 プログラム全体( main 関数とその他の関数内)で変 数を使いたい場合 → ファイル有効範囲の変数を使う → 宣言は #include, #define の後, main 文の前 ※使いすぎはメモリーの消費量大 ある関数内のみで使用する変数 → ブロック有効範囲の変数を使う → 使いたい関数内で宣言 ※ 関数を抜けると,メモリー上から消滅 用途に応じて,上手に使い分ける 変数の有効範囲と寿命 ( p.140 )

プログラミング入門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); } ファイル有効範囲

プログラミング入門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 ・・・・・・・・

プログラミング入門2 19 1.配列データ中からの値の探索プログラム 以下の手順により,配列中にある値のデータがあるかどうかを判 定する関数を作成し,動作を確認せよ。見つかった場合には,そ の要素番号を,見つからなかった場合には, -1 を返すようにせよ。 ( kadai6-1.c ) 演習課題 (第6回) ・ int 型配列(要素 5 )を用意 ・配列にキーボードから 5 個の整数値を入力,配列に値をセット ・探したい値をキーボードから入力 ・ search_value 関数に配列データと探したい値を渡し,データをサーチ ・ search_value 関数の返却値により,結果を表示 見つかった場合には,データが見つかった位置(要素番号)と値 見つからなかった場合には,見つからなかった旨 を表示せよ。 int search_value( int x[ ], int key ); 探索対象データ 5 個の整数値が格納された配列 探索キーとなる値 探したい値 見つかったらそのデータの要素番号を 見つからなかったら -1 を返す

プログラミング入門2 20 2. 1~ 20 人分のテストの点数を繰り返し入力し,データに応じて以下のような分布 グラフを表示する プログラムを作成せよ。 ( kadai6-2c ) ただし,分布グラフの表示には以下の関数を作成・使用せよ。 分布グラフ A : **** B : ******* C : **** D : ** void display_graph( int tensu[ ], int num ); 点数データの格納 されている配列 人数 3. 上記2のプログラムに、全得点データの平均と分散の値を表示する関数 ( kadai6-3.c ) void heikin_bunsan( int tensu[ ], int num ); を作成し,分布グラフと共に結果を表示せよ。

プログラミング入門2 21 提出方法 演習課題1〜3のプログラムを作成し,動作確認した上で ソースファイル( kadai6-1.c 〜 kadai6-3.c ) をメールに添付して 提出せよ。 提出方法: メールの題名( subjet )を, “pro2-6” + “ 学籍番号 ” + ” 自分の苗字 ” (全て半 角英数文字にて)とする。 例) pro2-6 L02001 aoki 提出先: ( 青木アドレス ) 提出期限: 11 月 12 日(月) 13:00 まで(時間厳守)

プログラミング入門2 22中間テスト 日時:11月19日(月)13:00〜 ※12時50分までに入室すること。座席は指定。 場所:斉藤記念館大教室 試験範囲:初回〜第6回までの講義内容 期末試験と並び、重要な評価指標となるので、し っかり準備すること。