ソフトウェア会社の研修時代に作成したプログラムです。
参考になればうれしいです。
今回の研修プログラムではバイナリサーチのアルゴリズムを使用しています。
バイナリサーチの特徴はこんな感じです。
・探索するデータが昇順または降順に整列してある必要がある。
・探索する範囲を半分ずつ絞っていく。
この「半分に絞る」という動きがキモで、例えば検索するデータが1万件あっても1回の処理で5,000件に絞ることが出来ます。
バイナリサーチの流れは大きく3つです。
1.基準となる中央値を選択する。
2.中央値と検索するデータを比較する。
3.一致しなければ探索範囲を半分に絞る。
サンプルでは100名のテストデータを例にしています。
なお、バイナリサーチの処理は関数にしてあります。
Sample Code
/******************************************************************************
【バイナリサーチ】
100名のテストの点数が配列test[]に降順で格納されている。
点数を入力して順位を検索して表示するプログラム。
<lesson_009.c> ver1.00
------------------------------------------------------------------------------
作成日:
作成者:
*****************************************************************************/
//---ヘッダファイル---
#include <stdio.h>
//---マクロ宣言---
#define PEOPLE_NUM 100
//---プロトタイプ宣言---
//main関数で使用する関数をデータ型のみ定義しておく
int BinarySearch(int*, int, int);
/*****************************************************************************
---main関数---
******************************************************************************/
int main(viod)
{
int i;
int targetScore; //検索する点数
int result; //順位を表示する
int test[PEOPLE_NUM]; //点数を格納する配列
//配列test[]に点数を降順に格納する。(100~1)
for(i = 0; i < PEOPLE_NUM; i++)
{
test[i] = 100 - i;
}
//テストの点数を入力
printf("点数を入力してください。\n");
scanf("%d", &targetScore);
result = BinarySearch( /* 戻り値:順位 失敗:-1 */
test, /* 検索する配列 */
PEOPLE_NUM, /* 配列要素数 */
targetScore /* 検索する点数 */
);
if(result == -1) //BinarySearch関数の戻り値が-1だったら
{
printf("該当する点数はありません。\n");
return -1; //エラーの場合はー1を返す。(ここでmain関数終了)
}
printf("%d点の人の順位は %3d位です。\n", targetScore, result);
return 0;
}
/*****************************************************************************
* 関数名 : BinarySearch
* 機 能 : バイナリサーチで順位を検索する
* 戻り値 : int 正常:順位 失敗:-1
******************************************************************************/
int BinarySearch( /* 戻り値:順位 失敗:-1 */
int* array, /* 検索する配列 */
int length, /* 配列要素数 */
int score /* 検索する点数 */
)
{
int front = 0; //サーチする範囲の先頭
int last = length - 1; //サーチする範囲の後端
int center = length / 2; //サーチする範囲の中央(中央値)
int true = 1; //ループの条件
int answer = -1; //正常:順位 失敗:-1
while(true) //trueは1ずっと1のままなので無限ループ
{
/* 検索した点数が見つかった場合 */
if(score == array[center])
{
answer = center + 1;
break; //無限ループを抜ける
}
if(score < array[center]) //検索点数が中央値よりも小さい場合
{
front = center + 1; //検索範囲前端を中央値+1へ移動
}
else //検索点数が中央値よりも大きい場合
{
last = center - 1; //検索範囲後端を中央値-1へ移動
}
/* 検索範囲の前端と後端が逆転した場合=検索結果なし */
if(front > last)
{
answer = -1; //検索結果がないので失敗:-1を代入
return answer; //answer = -1を返して関数終了
}
else
{
center = (front + last) / 2; //検索範囲を半分に絞る
}
} //ループ後端
return answer;
}
実行例
その他:研修で作成したC言語プログラム
その他のC言語プログラムはこの投稿にまとめてあります!
C言語の初心者用コードなので是非活用して下さい。
【C言語】研修 サンプルプログラム集
コメント