Рекурсивный бинарный поиск - PullRequest
0 голосов
/ 25 марта 2012

В моем основном файле у меня есть массив символьных строк, имен символов [320] [30], и после того, как я сортирую это с помощью пузырьковой сортировки.Я хочу иметь возможность выполнять рекурсивный бинарный поиск, чтобы определить, присутствует ли слово в массиве имен и каков его индекс.Индекс представлен набором беззнаковых целых без знака int Set [10].Если слово отсутствует, функция должна вернуть -1.

#include "set.h"
#include "sortAndSearch.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int binarySearch(Char A[][30], char *, int, int){
//this gets passed the global array names
//and the spot we're looking for is the char pointer
//other 2 ints are low = 0, and high = 319
//then it finds mid, a point between high and low
//and then does the same thing on whichever half it needs
//until it finds the index its looking for
//this is recursive because of the low and high values provided

int mid, low, high, result;

//calculate midpoint to cut set in half
mid = (high + low)/2;

//comparison
result = strcmp(A[mid], key);

//if result < 0, A[mid] < key
if(result < 0)
        return binarySearch(A, key, mid+1, high);

//if result > 0, A[mid] > key
else if(result > 0)
        return binarySearch(A, key, low, mid-1);

//if result == 0, A[mid] == key
else if(result == 0)
        return mid;

//couldnt find it
else
        return -1;

//this should return int, either
//the index where the string being searched for is stored in the array
//or -1 to indicate that the string beinng sought is not in the array
}

И в моей основной функции я вызываю функцию:

char *key;
binarySearch(names, key, 0, 319);

Когда я пытаюсь скомпилировать, яполучить следующие ошибки:

  • search.c: 7: ошибка синтаксического анализа до "A"
  • search.c: в функции `binarySearch ':
  • search.c: 7: количество аргументов не соответствует прототипу
  • sortAndSearch.h: 3: объявление прототипа
  • search.c: 22: `A 'необъявлено (первое использование в этой функции)
  • search.c: 22: (Каждый необъявленный идентификатор сообщается только один раз
  • search.c: 22: для каждой функции, в которой он появляется.)
  • search.c: 22: `key 'undeclared (первое использование в этой функции)

Итак, мой вопрос: почему я получаю эти ошибки, так как не вижу опечаток, и что происходит с количеством не соответствующих аргументов?прототип?Я скопировал его прямо из файла sortAndSearch.h, который мне дали.

Ответы [ 6 ]

1 голос
/ 25 марта 2012

Я предполагаю, что это C?int binarySearch(Char A[][30], char *, int, int) не является допустимым определением функции int binarySearch(char A[][30], char *s, int a, int b).Попробуйте.

Форма без имен может появиться в заголовочном файле.Файл заголовка имеет достаточно информации, чтобы компилятор мог проверить тип данных каждого аргумента (параметр AKA), но ему больше не требуется (при чтении заголовка) дополнительная информация.На этом этапе компилятор может проверить любой код, используя (вызывая) правильную функцию.Это называется сигнатурой функций.

Когда компилятор видит фактическое определение функции, ему нужны имена аргументов (параметры AKA), чтобы код мог ссылаться на них, аргументы являются переменными.Так что тогда нужны имена.

1 голос
/ 25 марта 2012

Попробуйте изменить Char на char при определении binarySearch, а затем посмотрите, компилируется ли ваш код.

Всегда проверяйте первую ошибку компиляции. Эта ошибка может привести к множеству других, казалось бы, случайных ошибок, которые, по-видимому, и возникают.

1 голос
/ 25 марта 2012

Я считаю, что ошибка Char A[][30], она должна быть char A[][30]

В стандарте C

нет типа данных по имени Char
0 голосов
/ 25 марта 2012

В строке 5 определение функции должно соответствовать объявлению.Проверьте sortAndSearch.h для предыдущего объявления функции.Он должен выглядеть так:

int binarySearch(char A[][30], char *key, int low, int high){

В строке 14 не должно быть объявлено low и high, и предполагается, что оно передано в качестве аргумента функции.Ему должно понравиться

int mid, result;

В противном случае это выглядит хорошо.

0 голосов
/ 25 марта 2012
int binarySearch(Char A[][30], char *, int, int){

То, что Char, вероятно, должно быть char (C - это регистрозависимый язык).Поскольку это было неправильно, большинство других ошибок компиляции являются следствием путаницы в компиляторе.

Вам также необходимо дать имена другим аргументам в определении функции:

int binarySearch(Char A[][30], char *key, int low, int high){

Вытогда не нужно low и high как отдельно объявленные локальные переменные (на самом деле, вы не можете объявлять их как локальные переменные, а также параметры).

Существует также ошибка влогика в функции, я считаю:

if (result < 0)
        return binarySearch(A, key, mid+1, high);
else if (result > 0)
        return binarySearch(A, key, low, mid-1);
else if (result == 0)
        return mid;
else
        return -1;

Все значения либо больше, меньше или равны нулю;предложение else является избыточным.

Однако у вас также есть проблема с прекращением поиска.Перед вычислением mid необходимо проверить, больше ли low, чем high, а затем вернуть -1, если он не найден, если диапазон для поиска пуст.

0 голосов
/ 25 марта 2012

Вам необходимо перечитать основы языка C. Это язык, чувствительный к регистру, и Char - это не char.

...