2011-12-07 19 views
3

要素が昇順で入力されたときに、配列に対してバイナリ検索を実行するための次のプログラムを記述しました。このバイナリ検索プログラムでエラーが発生するのはなぜですか?

#include<stdio.h> 
#include<conio.h> 

void main() 
{ 
    int key,high,low,mid,n,i,a[100]; 

    clrscr(); 

    printf("Enter the number of elements:"); 
    scanf("%d",&n); 

    printf("\nEnter the elements:\n"); 
    for(i=0;i<n;i++) 
     scanf("%d",&a[i]); 

    printf("Enter the key element:"); 
    scanf("%d",&key); 

    low=0; 
    mid=n-1; 
    mid=(low+high)/2; 
    while(low <= high && key != a[mid]) 
    { 
     mid=(low+high)/2; 
     if (key > a[mid]) 
      low=mid+1; 
     else 
      high=mid-1; 
    } 

    if (a[mid] == key) 
     printf("\nKey element is present at position %d",mid+1); 
    else 
     printf("\nElement not present."); 
    getch(); 
} 

Dev C++でコンパイルしたプログラムを実行すると、「メモリを読み取れませんでした」というエラーが表示されます。どのようにこれを修正することができますか?

答えて

4

あなたはmid=n-1;代わりのhigh=n-1;を割り当てています。

1

あなたはmid=(low+high)/2;

にいくつかのゴミを使用しているので、あなたは、highの初期化に失敗しましたあなたは、おそらく低い沿って、それを初期化したい:

low=0; 
high=/*whatever*/; 
0

この:

mid=n-1; 
mid=(low+high)/2; 

は、おそらく次のようになります。あなたが代わりに誤ってhighを初期化する、二回midに書き込む方法

high = n-1; 
mid = (low+high)/2; 

注意してください。また、適切なバイナリ検索が正しく行うのは難しいことに注意してください。大規模な配列に対しては厄介なオーバーフロー条件があります。

0

Typoの場合、mid=n-1;high=n-1;に置き換えてください。

0

問題は声明である:

mid=n-1; 

これは次のように変更します。あなただけ初期化されない高い変数を含めているので

high=n-1; 

。これにより、残りのコードでもガベージを使用することになります。 Mid = n-1は論理エラーにつながる。

必ず変数を初期化してください。

関連する問題