2013-11-26 7 views
0

'임의로'8 개의 숫자 집합을 선택하면 사용자는 최대한 많은 숫자를 추측해야합니다. 그러나이 임의의 숫자 배열에서 숫자를 입력하더라도 binary_search 함수는 '임의의'숫자 배열에서 정확한 숫자를 찾지 못합니다. 내 binary_search 함수에서 실수를 발견 할 수없는 것 같습니다 (최소한 문제가있는 것 같아요). 나는 큰 숫자의 숫자와 작은 숫자로 프로그램을 시도했다. 누구든지 제발 도와 주실 수 있습니까?C의 이진 검색 기능

#define SIZE 3 
#define min 1 
#define max 36 

int random(); 
bool binary_search(int value, int values[], int n); 

int main(void) 
{ 
    int numbers[SIZE]; 
    for(int i = 0; i < SIZE; i++) 
     numbers[i] = random(); 
    int score = 0; 
    int n[SIZE]; 
    int number_user; 


    for(int i = 0; i < SIZE; i++) 
    { 
     //Type in a number 
     do 
     { 
      printf("Search number no.%d:\n> ", i + 1); 
      n[i] = GetInt(); 

      //Wrong input number 
      if(n[i] < min || n[i] > max) 
      { 
       printf("\nNumber should be between %d - %d!!!\n\n", min , max); 
      } 
     } 
     while(n[i] < min || n[i] > max); 

     //THE PROBLEMATIC STUFF - START 
     number_user = n[i]; 
     if (binary_search(number_user, numbers, SIZE)) 
     { 
      printf("FOUND!!!\n"); 
      score += 1; 
     } 
     else 
     { 
      printf("NOT IN THE LIST\n"); 
     } 
     //PROBLEMATIC STUFF - FINISH 
    } 

    //scoring 
    printf("\n\n*******SCORE*******\n"); 
     //print your numbers 
     for(int i = 0; i < SIZE; i++) 
     { 
      printf(" %d", n[i]); 
      if(i != SIZE - 1) 
       printf(","); 
      if(i == SIZE - 1) 
       printf(".\n"); 
     } 

     //print right numbers 
     printf("\nRight numbers are:"); 
     for(int i = 0; i < SIZE; i++) 
     { 
      printf(" %d", numbers[i]); 
      if(i != SIZE - 1) 
       printf(","); 
      if(i == SIZE - 1) 
       printf(".\n"); 
     } 

    int result = score/SIZE * 100; 
    printf("Your score is: %d/%d , %d %%\n", score, SIZE, result); 


    return 0;  
} 
//PROBLEM START 
bool binary_search(int value, int values[], int n) 
{ 
    int beginning = 0; 
    int ending = n - 1; 

    int middle; 

    while (ending >= beginning) 
    {  
     middle = (beginning + ending)/2; 
     for(int i = 0; i < SIZE; i++) 
     { 
      //look at middle of list if (binary_search(n, numbers, SIZE)) 
      if(values[middle] == value) 
       //if number found, return true 
       return true; 

      //else if middle higher, search left 
      else if(values[middle] > value) 
       ending = middle - 1; 

      //else if middle lower, search right 
      else if(values[middle] < value) 
       beginning = middle + 1; 
     } 
    } 
    return false; 
} 
//PROBLEM FINISH 

int random() 
{ 
    int r = rand() % ((max - min + 1) + min); 

    return r; 
} 
+0

바이너리 검색에서'for' 루프의 핵심은 무엇입니까? – kviiri

+0

숫자를 검색하기 위해서는 이전까지 정렬해야한다고 생각합니다. – BLUEPIXY

+0

아니요, 정말로 그렇지 않습니다 ... – kviiri

답변

5

이진 검색은 대략 정렬 된 배열/목록/etc ...이며 프로그램은 임의의 숫자를 느낍니다.

https://en.wikipedia.org/wiki/Binary_search_algorithm (두 번째 줄)을 참조하십시오. 이 루프를 이진 검색 기능 내부

+0

고마워요, 그것에 대해 잊어 버렸습니다. – gernud7

2

...

for(int i = 0; i < SIZE; i++) 
{ 
    ... 
} 

그 안에, 당신은 middle을 변경하지 않고 beginningending 값을 여러 번 변경합니다. 즉, middle의 단일 값을 기준으로 beginningending을 여러 번 조정하면 실제로 검색 할 숫자의 배열 범위가 "실격"될 수 있습니다.

또한 MeNa은 답변에서 지적했듯이 이진 검색은 정렬 된 데이터 세트를 검색하기위한 것입니다. 배열은 무작위 순서로 쓸모가 없습니다.

1

숙제가 아닌 경우 bsearch을 사용해 볼 수 있습니다. (이것은 POSIX 함수입니다.)