2016-10-03 3 views
-4

Проблема: 1 В этом коде, если я ищу номер, который не находится в массиве, он должен отображать Value not found, но я не знаю, что он не отображает это сообщение, а каждый раз, когда он показывает Found value in element -5 Я не есть подсказки, почему это происходит.Рекурсивный линейный поиск в C debug

#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

Я не могу понять, как

size_t linearSearch (Const целочисленный массив [], Int ключ, size_t размера)

функция работает специально эти строки

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

'if (размер <0)' глупо для значения без знака –

+0

Похож на хороший пример для изучения отладчика. Используйте отладчик. Он может показывать значения переменных при прохождении каждой инструкции. –

+0

подскажите мне, что я должен писать вместо if (size <0) – Claudia

ответ

2

Как все говорили, что у вас есть небольшая ошибка, то есть, вы должны написать if(size==0) не if(size<0).

позвольте мне объяснить, что происходит рекурсивно в linearSearch() функции

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, как searchkey. При вызове функции linearSearch() заявлением

element = linearSearch(a, searchKey, SIZE); 

вы передаете ссылку на array[], searchKey 198, and Size 100 в качестве аргумента.

В функции linearSearch сначала, если оператор if(size==0) проверяет, равен ли размер нулю, если нет, то else if выполняется.

in else if заявление If(198 == array[100-1]) состояние проверено. и мы видим, что 198 присутствует в array[99], так что условие else if истинно, поэтому функция linearSearch возвращает результат 99.

Теперь давайте посмотрим, что произойдет, если вы введете 55, которого нет в списке массивов. if (size == 0) неверен, поэтому программа пропустит его и перейдет к следующему утверждению. if(55 == array[100-1] будет проверен как недействительный, тогда будет называться 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) Если ключ матч последний элемент, возвращает его позицию. Если нет, повторите с более коротким одним размером. ключ не найден, если размер равен нулю.

1

Просто измените оператор if от if(size<0) до if(size==0) ваш код будет работать.

Смежные вопросы