2011-12-23 11 views
0

バイナリ検索で作業しています。以下のコードは私がしようとしていることを説明する必要があります。ユーザが単語を入力した後、バイナリ検索を実施して単語リストを検索する。問題はバイナリ検索です。それは実行されているが、私はそこにそれを知っているにもかかわらず、ワードリストの単語を見つけることはありません。私はコードが良いかもしれないが、それは動作するはずです知っている。誰でも光を放つ?あなたのバイナリ検索機能が渡された値leftrightを無視している検索には何らかのアドバイスが必要です

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


char dictionary[400000][45]; 

int main(void) 
{ 
FILE infile; 
int i=0; 
int num; 
int index; 
char buffer[45]; 
char userword[45]; 

fp1 = fopen("C:/Users/Aaron/ProgrammingAssignment/dictionary.txt","rb"); 

    if (fp1 == NULL) 
    { 
    printf("The dictionary file did not open\n"); 
    exit(0); 
    } 

    else 
    { 
    printf("Dictionary file is open\n"); 
    } 

    while(fgets(buffer,45, fp1)!=NULL) 
     { 
      strcpy(wordlist[i],buffer); 
      //printf("Line %d: %s",i,wordlist[i]); 
      i++; 
     } 

    printf("Your wordlist is now in the dictionary array"); 

    do 
    { 
    //fscanf(fp2,"%s", userword); 
    printf("Enter a word to be spell checked: "); 
    fgets(userword, 43, stdin); 

    //and do a binary search 
    index = BinarySearch(userword,0,i); 
    if(index > -1) 
     printf("%s was found in the wordlist", userword); 
    else 
     printf("%s was not found in the dictionary", wordcheck); 
    } 
    while(wordlist != NULL); 

    if(index>-1) //The word was found 
    { 
     printf("That is correctly spelled\n"); 
    } 
    else 
    { 
     printf("That word is spelt wrong\n"); 
    } 


return 0; 
} 

int BinarySearch(const char userword[],int left,int right) 
    { int high = 400000; 
    int low = 0; 
    int target; 
    int count = 0; 

    while (high >= low) 
     { target = low + ((high - low)/2); 

     // show tries for demonstration only 
     printf("%d, ",target); 

     if (strcmp(userword, wordlist[target]) < 0) 
      high = target -1; 
     else if (strcmp(userword, wordlist[target]) > 0) 
      low = target + 1; 
     else 
     return target; 
     } 
    return -1; 
    } 
+0

私は 'dictionary.txt'の最初の入力を受け取りますか? – fge

+0

はい既に注文されているテキスト – adohertyd

答えて

1

それはいけません。

それはおそらく開始する必要があります:あなたはそれを読み終えた後

int BinarySearch(const char userword[], int left, int right) 
{ 
    int high = right; 
    int low = left; 

あなたは辞書を閉じる必要があります。

rightが最後の有効な要素のインデックスか「最後の要素のインデックスの後のもの」かどうかを検討する必要があります。これは、関数の呼び出しでi - 1を渡す必要がある可能性があります。

strcmp()を呼び出してその戻り値を取得することを検討してください。それは比較的高価です:

int rc = strcmp(userword, wordlist[target]); 

if (rc == 0) 
    return target; 
else if (rc < 0) 
    high = target - 1; 
else 
    low = target - 1; 
+0

右は最後の有効な要素のインデックスです。バイナリ検索を使うことについて本当に分かりませんが、もう少し説明できますか? – adohertyd

+0

メインプログラムの 'i'は配列の最初の無効な要素のインデックスなので、' main() 'の呼び出しはおそらく' index = BinarySearch(userword、0、i-1); 'になります。考えられるもう1つの問題は、ループ終了条件です。while(high> = low)です。私は座っていないし、これがあなたのコードに適しているかどうかを調べました。しかし、バイナリ検索は100%の権利を得るには非常に難しいと知っています(Jon Bentleyの「Programming Pearls」と「Programming Pearls」を読んでから)。あなたは、フルサイズの辞書に行く前に、サイズ0,1,2,3,4ワードの '辞書'をテストする必要があります。 –

関連する問題