データを降順に並び替えた後、探索データをキーボード入力そ、データの何番手にあるかを出力する
なにやら誤字が目立つが,要はやることは3つだ.
- データを降順に並び替えること
- 探索データをキーボードから入力させること
- 関数で二分探索して何番目にあるかを出力すること
それ以外は特段求められていないから,質問内に提示されたコードに存在しているデータ入力処理やソート結果の表示は不要なので捨てて良いだろう.
データについては適当に定義してやれば済む.
ソートの部分はそのまま使える雰囲気があるので残す.
C
1int main(void)
2{
3 //不要な入力処理は適当なデータ定義に置き換え
4 int score[] = { 3, 9, 0, 8, 3, 1 };
5 const int num = 6;
6
7 //ソートの部分は残すことにする
8 for (int i = 0; i < num - 1; i++) {
9 for (int j = i + 1; j < num; j++) {
10 if (score[i] < score[j]) {
11 int tmp = score[i];
12 score[i] = score[j];
13 score[j] = tmp;
14 }
15 }
16 }
17
18 //不要な出力も除去した
19 return 0;
20}
これで,前記1.のみを満たすコードができた.
後は 2. と 3. を追加すればいい.
C
1//「別の関数」
2//二分探索で探索して「何番目」なのかを返す.
3//(ただし,見つからない場合は 0 を返すこととした)
4size_t OtherFunction( const int *Begin, const int *End, int SearchTgtVal )
5{
6 //ここの実装を仕様に従って埋めればおk.
7}
8
9int main(void)
10{
11 //不要な入力処理は適当なデータ定義に置き換え
12 int score[] = { 3, 9, 0, 8, 3, 1 };
13 const int num = 6;
14
15 //ソートの部分は残すことにする
16 for (int i = 0; i < num - 1; i++) {
17 for (int j = i + 1; j < num; j++) {
18 if (score[i] < score[j]) {
19 int tmp = score[i];
20 score[i] = score[j];
21 score[j] = tmp;
22 }
23 }
24 }
25
26 //探索データをキーボードから入力する処理を追加
27 int SearchTarget;
28 printf( "Specify search target value : " );
29 scanf( "%d", &SearchTarget );
30
31 //探索は「別の関数」で処理.配列データはポインタを引数として受け渡す
32 size_t Result = OtherFunction( score, score+num, SearchTarget );
33 //結果(:何番目なのか)を表示
34 if( !Result )
35 { printf( "無ぇよ" ); }
36 else
37 { printf( "%zu番目", Result ); }
38
39 return 0;
40}
配列データはポインタを引数として受け渡す
という指示がイマイチ謎.
ふつーは配列に関しては「先頭のポインタとサイズで」みたく指示されそうに思うのだが,「ポインタ」としか指定されていないから,↑のコードではポインタ2つを渡す形とした.
二分探索の具体実装については「C言語 二分探索」とかでググれば参考にできるコードとかも複数見つかると思うので,好きなのを移植すれば良いかと.
[追記]
「別の関数」の中身をなんとなく書いてみたけど,あまり自信ないっす.
(ダメそうなら 修正 or 無視 されたい)
C
1size_t OtherFunction( const int *Begin, const int *End, int SearchTgtVal )
2{
3 if( SearchTgtVal > *Begin || *(End-1) > SearchTgtVal )return 0;
4
5 const int *p[] = { Begin, End };
6 while( p[0]<p[1] )
7 {
8 const int *M = p[0] + ( (p[1]-p[0])>>1 );
9 int d = SearchTgtVal - *M;
10 if( d==0 )return (M-Begin)+1;
11 if( d<0 )p[0] = M+1;
12 else p[1] = M;
13 }
14 return 0; //when not found
15}