プログラムのパタン演習 解説 (1)MIN/MAXパタン 型 関数名(引数の並び) { // 引数には、配列とその要素数(int) // 変数宣言:答えを記憶する変数、繰り返しパラメタ 例: 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 答え; } return ans; } // 答えを返す 問題1. 配列の2番目に大きな要素を求める second ヒント: 答えの候補と、最大の要素の二つを記憶する必要がある この2つの変数に適切に初期値を与えること 繰り返しにおいては、この二つを更新する int 配列の要素を返すので int 答えを返すのは、2番目に大きな要素だけ 型 関数名(引数の並び) { // 引数には、配列とその要素数(int) // 変数宣言:答えの記憶、繰り返しパラメタ // 答えを記憶する変数に初期値を与える、 // 大抵は配列の先頭の要素 // 繰り返し処理 // return 答え; } int second(int ar[], int n) { int f, s, i, tmp; // iは繰り返しのパラメタ, fは最大, sは2番目 f = ar[0]; s = ar[1]; // fとsに仮の値を入れる // fがsより大きいことを保証する if (s > f) { tmp=f; f =s; s=tmp; } 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; // 答えを返す ar[0]とar[1]は調査済みなので ar[2]から繰り返しを始める } 問題2. 目標値(引数で与えられる)に最も 近い配列の要素を求める nearest int 配列の要素を返すので int ヒント: 配列の要素と答えの候補の比較には、「目標値との差の2乗」を用いる その値を記憶する変数 dif を用意し、また答えの候補が変わるたびにこの変数も更新するとよい 注意: math.hをincludeして使えるようになる「絶対値」関数 abs を用いても良い 型 関数名(引数の並び) { // 引数には、配列とその要素数(int) // 変数宣言:答えの記憶、繰り返しパラメタ // 答えを記憶する変数に初期値を与える、 // 大抵は配列の先頭の要素 // 繰り返し処理 // return 答え; } 目標値の変数を 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; // 答えを返す } 問題3. 条件が複数ある例:配列の要素の うち、奇数で最大のものを求める oddMax 注意: 配列の要素に奇数がない場合は「ない」と答えなければならない いろいろなやり方がある。 (1) 奇数があるかどうかをチェックし、あった場合はその中で「最大」の要素 を求める (2) 配列の要素から奇数だけを抜き出して配列を作り、その中で「最大」の要 素を探す などなど… 注意: 整数 x が偶数 ⇔ xが2で割り切れる 条件 x % 2 == 0 が成立 整数 x が奇数 ⇔ xが2で割り切れない 条件 x % 2 != 0 が成立 (1) 奇数があるかどうかをチェックし、 あった場合はその中で「最大」の要素を 求める 型 関数名(引数の並び) { // 引数には、配列とその要素数(int) // 変数宣言:答えの記憶、繰り返しパラメタ // 答えを記憶する変数に初期値を与える、 // 大抵は配列の先頭の要素 // 繰り返し処理 // return 答え; } int oddMax(int ar[], int n) { // 配列の型と関数の型は一致 // n は配列の要素数なので int になる int ans, i; // ansは答えの候補、iは繰り返しのパラメタ ans = ar[0]; // ansに初期値を入れる iffor (i (i ===n) 0;}{ // 配列の要素を繰り返しで調べる // 奇数がなかった場合0を返す 1;{i return < n; i++) for (i++ i < <n;ar[i]) i++) { // 配列の要素と答え候補を比較 if (; ans if ((ar[i] % 2 !=0) (ar[i] > ans)) //奇数でansより大きい ans =&& ar[i]; // 答えの候補を更新 {} ans = ar[i]; // ansの値の更新 } }// ここまで繰り返し処理の内容 } return 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を引数とし、最小要素のインデッ クスを返す関数を作れ。 例えば 0 1 2 3 4 5 6 インデックス int array[] = { 5,4,3,2,1,6,7}; と宣言されているとき、この要素数は7であり、最小要素は1でそ のインデックスは 4 (つまり array[4] = 1)であるから、 IndexOfMin(array, 7) は 4 を返す。 課題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を引数とし、最小要素を返す関数を作れ。 例えば 0 1 2 3 4 5 6 7 8 インデックス 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)が最小値
© Copyright 2024 ExpyDoc