73234


タイトルにもあるように、int型配列に対して探索鍵を二分探索で調べて結果を表示するプログラムを作成したいのですが、  
探索鍵にどのような数字を入力しても、見つからないという意の表示がされてしまいます。

とりあえず私は以下のようにプログラムを作成しました。

[code]

    #include <stdio.h>
    #define MAX_SIZE 100
    
    int bsearch(int a[],int p,int q,int x)
    {
       int t=(p+q)/2;
       if(p>q){
         return -1;
       }
       if(a[t]==x){
         return t;
       }
       if(a[t]>x){
         q=t-1;
       } else {
         p=t+1;
       }
       return bsearch(a,p,q,x);
    }
    
    void get_array(int a[],int size)
    {
        int i;
        for(i=0;i<size;i++){
            printf("a[%d]: ",i); scanf("%d",&a[i]);
        }
    }
    
    void put_array(int a[],int size)
    {
        int i;
        for(i=0;i<size;i++){
            printf("%d ",a[i]);
        }putchar('\n');
    }
    
    int main(void)
    {
        int a[MAX_SIZE],size,key,pos;
        printf("データ数: "); scanf("%d",&size);
        get_array(a,size);
        put_array(a,size);
        printf("探索鍵: ");  scanf("%d",&key);
        pos=bsearch(a,0,MAX_SIZE-1,key);
        if(pos>=0){
            printf("探索鍵%dがa[%d]に見つかりました。\n",key,pos);
        } else{
            printf("探索鍵%dは見つかりませんでした。\n",key);
        }
        return 0;
    }
    
    
[/code]

実行結果

[code]

    $ ./a.out
    データ数: 4
    a[0]: 1
    a[1]: 2
    a[2]: 3
    a[3]: 4
    1 2 3 4 
    探索鍵: 3
    探索鍵3は見つかりませんでした。
    
[/code]

自分が見た限りでは関数に問題があるようにも思えなかったので、どこを修正したらいいのかがよくわからず困っています。  
どこに問題があるのでしょうか。また、どのように修正したらいいのでしょうか。


CC BY-SA 4.0
2021-01-11T12:26:21.837
73217
2021-01-12T01:11:49.270
2021-01-12T01:11:49.270
3060
41837
question
c
探索鍵を二分探索で調べて結果を表示するプログラムを作成したい


main関数に問題があります。bsearch関数は問題ないと思います。  
metropolisさんのコメントのとおり、`pos=bsearch(a,0,MAX_SIZE-1,key);` の
`MAX_SIZE-1`はsizeの間違いだと思います。  
bsearchで配列aの入力していない要素を参照しているために意図通り動作していないのだと思います。


CC BY-SA 4.0
2021-01-12T00:43:46.163
73234
2021-01-12T00:43:46.163
35558
73217
answer