2016-10-03 4 views
-4

문제 : 1 이 코드에서는 배열에없는 숫자를 검색하면 Value not found이 표시되지만 표시 될 때마다 대신 해당 메시지가 표시되지 않습니다. Found value in element -5 그렇지 않습니다. 그것이 일어나는 이유를 전혀 모른다.C에서 재귀 선형 검색

#include<stdio.h> 
#define SIZE 100 

size_t linearSearch(const int array[], int key, size_t size); 

int main(void) 
{ 

    int a[SIZE]; 
    size_t x; 
    int searchKey; 
    size_t element; 


    for(x=0; x<SIZE; ++x){ 
     a[x] = 2*x; 
    } 

    for(x=0; x<SIZE; ++x){ 
     if(x%10 == 0){ 
      puts(""); 
     } 
     printf("%5d", a[x]); 
    } 

    puts("\n\nEnter integer search key:"); 
    scanf("%d", &searchKey); 

    // attempt to locate searchKey in array a 
    element = linearSearch(a, searchKey, SIZE); 

    // display results 
    if(element != -1){ 
     printf("Found value in element %d", element); 
    } 
    else{ 
     puts("Value not found"); 
    } 
} 

size_t linearSearch(const int array[], int key, size_t size) 
{ 
    if(size<0){ 
     return -1; 
    } 
    if(key == array[size-1]){ 
     return size-1; 
    } 
    return linearSearch(array, key, size-1); 

} 

문제점 : 알 수없는 2

방법

linearSearch (CONST의 int 배열 [], INT 키를 size_t 크기)

함수 특별히 작업 size_t가 이 라인

if(key == array[size-1]){ 
     return size-1; 
return linearSearch(array, key, size-1); 
+4

부호없는 값인 경우 (크기 <0)'바보입니다. –

+0

디버거를 배우는 좋은 예입니다. 디버거를 사용하십시오. 각 명령을 단계별로 진행하면서 변수 값을 표시 할 수 있습니다. –

+0

나를 제안합니다. 대신에 무엇을 써야합니까 (크기 <0) – Claudia

답변

2

, 당신은 if(size==0)하지 if(size<0).

size_t linearSearch(const int array[], int key, size_t size) 
{ 
    if(size == 0){ 
     return -1; 
    } 
    else 
     if(key == array[size-1]){ 
      return size-1; 
    } 
    else{ 
     return linearSearch(array, key, size-1); 
    } 
} 

당신이 같은 입력 198을 준 가정 나를 linearSearch() 기능에 반복적으로 무슨 일이 일어나고 있는지 설명 할 수 있도록 작성해야 검색 키. 당신은 당신이 인수로 array[], searchKey 198, and Size 100에 대한 참조를 전달하는 문

element = linearSearch(a, searchKey, SIZE); 

에 의해 linearSearch() 함수를 호출합니다.

linearSearch 함수에서 먼저 문 if(size==0)은 크기가 0과 같지 않은지 검사하고 else if 문이 실행되는지 확인합니다.

else if 문 If(198 == array[100-1]) 조건이 점검됩니다. 이고 198array[99]에 있으므로 else if 조건이 true이므로 linearSearch 함수는 결과로 99를 반환합니다.

이제 배열 목록에없는 55을 입력하면 무슨 일이 일어나는 지 알 수 있습니다. (size == 0)이 참이 아니기 때문에 프로그램에서 건너 뛰고 다음 명령문으로 넘어갑니다. if(55 == array[100-1]이 true가 아닌 것으로 확인되면 linearSearch(array, 55, 100-1)이 호출됩니다. 다시 if(55==array[99-1])이 선택됩니다. 어느 지점에서 크기가 0이되고 첫 번째 if(size==0) 문이 실행됩니다.

2

1) 주요 문제는 if(size<0){입니다. 조건식은 항상 거짓입니다. 왜냐하면 size_t는 부호없는 정수이기 때문입니다. 따라서 발견 된 값 (정의되지 않은 동작)이 우연히 많은 값 (예 : -5는 부호가없는 4294967291)이 아닌 임의의 위치를 ​​반환합니다 (발견되지 않음).

if(size<0){

if(size==0){

2) 마지막 요소 키 일치하는 경우, 그 위치를 반환해야합니다. 그렇지 않은 경우 짧은 하나의 크기로 반복하십시오. 크기가 0 인 경우 키를 찾을 수 없습니다. 모두가 당신이 약간의 실수를 가지고 말했듯이

1

if 문을 if(size<0)에서 if(size==0)으로 변경하면 코드가 작동합니다.