プログラムのパタン演習 解説.

Slides:



Advertisements
Similar presentations
メモリとポインタ. プログラムの前提 コンピュータは、0と1で計算をし、 0と1でデータを保存している。 メモリを学ぶのに必要な知識である。
Advertisements

オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
プログラミング基礎I(再) 山元進.
プログラミング言語としてのR 情報知能学科 白井 英俊.
第11回 整列 ~ シェルソート,クイックソート ~
ファーストイヤー・セミナーⅡ 第8回 データの入力.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
文字配列の課題1 解説 /* a */ #include <stdio.h> main( ) { int i;
プログラミング演習(2組) 第12回
第5回C言語講座 ~ポインタと配列.
アルゴリズムとデータ構造 補足資料7-3 「単純選択ソートselsort.c」
第6章 2重ループ&配列 2重ループと配列をやります.
情報理論2 第6回 小林 学 湘南工科大学 2011年11月15日 〒 神奈川県藤沢市辻堂西海岸1-1-25
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
データ構造とアルゴリズム論 第2章 配列(構造)を使った処理
基礎プログラミング演習 第7回 繰り返し.
第11回 整列 ~ シェルソート,クイックソート ~
第7回 条件による繰り返し.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラムの制御構造 選択・繰り返し.
プログラミング2 関数
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
第10回関数 Ⅱ (ローカル変数とスコープ).
プログラミング 4 記憶の割り付け.
講義では、Cプログラミングの基本を学び 演習では、やや実践的なプログラミングを通して学ぶ
第7回 条件による繰り返し.
情報とコンピュータ 静岡大学工学部 安藤和敏
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
関数への道.
プログラミング基礎B 文字列の扱い.
プログラミング 4 整列アルゴリズム.
プログラムの制御構造 配列・繰り返し.
アルゴリズムとデータ構造1 2005年6月24日
プログラミング 4 探索と計算量.
疑似乱数, モンテカルロ法によるシミュレーション
アルゴリズムとデータ構造 2011年7月8日課題の復習
演習07-0 “Hello\n” “World!\n”と
Cプログラミング演習資料.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング序論演習.
プログラミング 3 2 次元配列.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
アルゴリズムとプログラミング (Algorithms and Programming)
第6回:得点を表示しよう! (文字の表示、乱数)
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
確率論・数値解析及び演習 (第7章) 補足資料
ヒープソート.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
演習00-0 “Hello\n” “World!\n”と
プログラミング 4 文字列.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
高度プログラミング演習 (07).
Cプログラミング演習資料.
モバイルプログラミング第2回 C言語の基礎 (1).
プログラミング1 プログラミング演習I 第2回.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
知能情報工学演習I 第11回(後半第5回) 課題の回答
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
知能情報工学演習I 第10回( C言語第4回) 課題の回答
プログラミング演習I 補講用課題
プログラミング論 バイナリーサーチ 1.
ファーストイヤー・セミナーⅡ 第10回 if文による選択処理(2).
Presentation transcript:

プログラムのパタン演習 解説

(1)MIN/MAXパタン 型 関数名(引数の並び) { // 引数には、配列とその要素数(int) // 変数宣言:答えを記憶する変数、繰り返しパラメタ // 答えを記憶する変数に初期値を与える、 // 大抵は配列の先頭の要素 // 繰り返し処理 // return 答え; } 例: int max(int ar[], int n) { // 配列の型と関数の型は一致 // n は配列の要素数なので int になる int ans, i; // ansは答えの候補、iは繰り返しのパラメタ ans = ar[0]; // ansに初期値を入れる for (i = 1; i < n; i++) { // 配列の要素を繰り返しで調べる if ( ans < ar[i]) { // 配列の要素と答え候補を比較 ans = ar[i]; // 答えの候補を更新 } } // ここまで繰り返し処理の内容 return ans; // 答えを返す

問題1. 配列の2番目に大きな要素を求める second ヒント: 答えの候補と、最大の要素の二つを記憶する必要がある この2つの変数に適切に初期値を与えること 繰り返しにおいては、この二つを更新する 答えを返すのは、2番目に大きな要素だけ int 配列の要素を返すので int int second(int ar[], int n) { int f, s, i, tmp; // iは繰り返しのパラメタ, fは最大, sは2番目 f = ar[0]; s = ar[1]; // fとsに仮の値を入れる for (i = 2; i < n; i++) { // 配列の要素を繰り返しで調べる if ( f < ar[i]) { // 最大要素候補があった s = f; f = ar[i]; // fとsの値を更新 } else { // f >= ar[i]の場合はここにくる if (s < ar[i]) // 二番目に最大の候補がきた { s = ar[i]; } // s の値を更新 } } // ここまで繰り返し処理の内容 return s; // 答えを返す 型 関数名(引数の並び) { // 引数には、配列とその要素数(int) // 変数宣言:答えの記憶、繰り返しパラメタ // 答えを記憶する変数に初期値を与える、 // 大抵は配列の先頭の要素 // 繰り返し処理 // return 答え; } // fがsより大きいことを保証する if (s > f) { tmp=f; f =s; s=tmp; } ar[0]とar[1]は調査済みなので ar[2]から繰り返しを始める

問題2. 目標値(引数で与えられる)に最も近い配列の要素を求める nearest int 配列の要素を返すので int ヒント: 配列の要素と答えの候補の比較には、「目標値との差の2乗」を用いる その値を記憶する変数 dif を用意し、また答えの候補が変わるたびにこの変数も更新するとよい 注意: math.hをincludeして使えるようになる「絶対値」関数 abs を用いても良い 目標値の変数を target とした int nearest(int ar[], int n, int target) { int ans, i; // iは繰り返しのパラメタ, ansは答え候補 int dif, dif2; // difで答え候補と目標値との差の2乗を記憶 ans = ar[0]; dif = (ans – target)* (ans – target); // 初期値 for (i = 1; i < n; i++) { // 配列の要素を繰り返しで調べる // これは基本的に「最小」の要素を求める関数 // ただし「目標値との差の2乗」を最小にする dif2 = (ar[i] – target)* (ar[i] – target); if (dif > dif2) { dif = dif2; ans = ar[i]; } // 値の更新 } // ここまで繰り返し処理の内容 return ans; // 答えを返す } 型 関数名(引数の並び) { // 引数には、配列とその要素数(int) // 変数宣言:答えの記憶、繰り返しパラメタ // 答えを記憶する変数に初期値を与える、 // 大抵は配列の先頭の要素 // 繰り返し処理 // return 答え; }

問題3. 条件が複数ある例:配列の要素のうち、奇数で最大のものを求める oddMax 注意: 配列の要素に奇数がない場合は「ない」と答えなければならない いろいろなやり方がある。 (1) 奇数があるかどうかをチェックし、あった場合はその中で「最大」の要素 を求める (2) 配列の要素から奇数だけを抜き出して配列を作り、その中で「最大」の要 素を探す などなど… 注意: 整数 x が偶数 ⇔ xが2で割り切れる  条件 x % 2 == 0 が成立 整数 x が奇数 ⇔ xが2で割り切れない  条件 x % 2 != 0 が成立

(1) 奇数があるかどうかをチェックし、あった場合はその中で「最大」の要素を求める int oddMax(int ar[], int n) { // 配列の型と関数の型は一致 // n は配列の要素数なので int になる int ans, i; // ansは答えの候補、iは繰り返しのパラメタ ans = ar[0]; // ansに初期値を入れる for (i = 1; i < n; i++) { // 配列の要素を繰り返しで調べる if ( ans < ar[i]) { // 配列の要素と答え候補を比較 ans = ar[i]; // 答えの候補を更新 } } // ここまで繰り返し処理の内容 return ans; // 答えを返す 型 関数名(引数の並び) { // 引数には、配列とその要素数(int) // 変数宣言:答えの記憶、繰り返しパラメタ // 答えを記憶する変数に初期値を与える、 // 大抵は配列の先頭の要素 // 繰り返し処理 // return 答え; } if (i == n) { return 0;} // 奇数がなかった場合0を返す for (i++ ; i < n; i++) { if ((ar[i] % 2 !=0) && (ar[i] > ans)) //奇数でansより大きい { ans = ar[i]; // ansの値の更新 } for (i=0; i<n; i++) { if (ar[i] % 2 !=0) { ans = ar[i]; break; } この後、 i == nの時は、奇数がなかった! そうでない場合は 続けて(ar[i+1]の要素から)調べれば良い

(2) 配列の要素から奇数だけを抜き出して配列を作り、その中で「最大」の要素を探す int oddMax(int ar[], int n) { // 配列の型と関数の型は一致 int odds[NUM], i, j=0 ; // odds配列に奇数を入れる。 // iは繰り返しのパラメタ、jはodds配列のどこまで数を入れたかを記憶する for (i = 0; i < n; i++) { // 配列の要素を繰り返しで調べる if (ar[i] % 2 != 0) { // 奇数ならば odds[j++] = ar[i]; // odds配列に奇数を記憶 } } // ここまで繰り返し処理の内容 if (j == 0) // 奇数がなかった場合 { return 0; } // 0を返すことで「奇数がなかった」ことを表すものとする // それ以外の場合はここにくる return maxInArray(odds, j ); // 配列oddsの中の最大要素を求める(関数maxInArrayを利用) }

課題1. 配列の最小の要素のインデックスを返す関数 IndexOfMin 整数型の配列 ar とその要素数nを引数とし、最小要素のインデッ クスを返す関数を作れ。 例えば int array[] = { 5,4,3,2,1,6,7}; と宣言されているとき、この要素数は7であり、最小要素は1でそ のインデックスは 4 (つまり array[4] = 1)であるから、 IndexOfMin(array, 7) は 4 を返す。 0 1 2 3 4 5 6 インデックス

課題2. 配列において指定された範囲における最小の要素を返す関数 MinInRange 整数型の配列 ar 、最小要素を探すインデックスの値k、arの要素数nを 引数とし、最小要素を返す関数を作れ。 例えば int array[] = { 1,2,3,5,7,9,4,6,8}; と宣言されているとき、この要素数は9 MinInRange(array,0,9) は 1を返す⇒全範囲での最小値 MinInRange(array, 1,9) は 2を返す⇒array[0]は除外 MinInRange(array, 2,9) は 3を返す⇒array[2]からarray[8]での最小値 MinInRange(array, 3,9) は 4を返す⇒array[3]からarray[8]での最小値

課題3.配列において指定された範囲における最小の要素のインデックスを返す関数 findMinValue 整数型の配列 ar 、最小要素を探すインデックスの値k、arの要素 数nを引数とし、最小要素を返す関数を作れ。 例えば int array[] = { 1,2,3,5,7,9,4,6,8}; と宣言されているとき、この要素数は9 MinInRange(array,0,9) は 0を返す⇒全範囲でarray[0](=1)最小値 MinInRange(array, 1,9) は 1を返す⇒範囲内でarray[1](=2)が最小値 MinInRange(array, 2,9) は 2を返す⇒範囲内でarray[2](=3)が最小値 MinInRange(array, 3,9) は 6を返す⇒範囲内でarray[6](=4)が最小値 0 1 2 3 4 5 6 7 8 インデックス