position_search (binary search)
挿入位置の探索

ミニレポート第 3 回課題

第2回課題で作成した プログラムに以下に述べる関数 position_search を追加する. (report02.c を report03.c という名前でコピーし, report03.c のほうに書き加える)

関数 position_search は,データを挿入するときに配列 table 中の挿入するべき場所の添字を返すを関数である. 仕様は以下の通りとする.

position_searchの仕様

ヒント1: 教科書 List 2.1 の search は整数を引数とする関数で, 配列 table の要素の中にメンバ key の値が引数で指定した ものがあれば,そのメンバ data の値を返し, 無ければ -1 を返す関数である.これを参考に position_search を 作ることができる.余裕のある学生は教科書 List 2.2 の binary_search を ベースに作るほうが難易度は高いが高速なのでチャレンジして欲しい.

ヒント2: いきなり完成品を作ろうとせずに以下の順で作ってテストしてみるとよい.

  1. まずは関数の入力値 key が table 内に存在するキー (1,3,4,8,14,18,20,21,25)だったときだけ 正しく動くものでいいので, そのキーがある番号(配列tableの添字,0から9)を返す 関数を作る.
  2. まず,key の値が table 内の table[i].key の最大値 より小さい場合(上の例ではkeyが24以下のとき)だけを 考えて,そういうときに正しく課題 3 の答えを 計算するプログラムを作る. 上の段階のプログラムは i を 0 から増やしてゆき, table[i].key が key と等しくなるまで i を増やす, という形になるはずである.これを変更して table[i].key が key の値を初めて超えたとき, その i を返すようにする.この i の値が この課題で求める挿入すべき場所の添字 i の値になる.
  3. 残りは key の値が table 内の table[i].key の最大値 以上の場合にも正しく動くように調整することである. この場合は table[i].key が key の値を超えないので 上記プログラムだけでは対応できない.その対応を考える.

プログラム全体についての注意

注意事項

受理した学生のリストを 1 クラス提出者 2 クラス提出者 3 クラス提出者 に掲載する. 締切までに提出したにもかかわらず締切後一週間を過ぎても掲載されていない 場合は山本 <hiroshi@tokai.ac.jp>まで連絡せよ. 未提出の学生はすみやかに再提出せよ. 再提出後一週間経っても掲載されない場合も 山本まで連絡せよ.


Updated in October 25, 2022, index.html, Yamamoto Hiroshi Web