#c #infinite-loop #binary-search
#c #бесконечный цикл #двоичный поиск
Вопрос:
У меня есть программа, которая выполняет поиск в файле (numbers.dat) с помощью двоичного поиска и выводит, находится ли значение в массиве или нет. В настоящее время, когда я хочу выполнить поиск по первому значению в файле numbers.dat или по значению, которого нет в файле numbers.dat, я получаю бесконечный цикл, и если я хочу выполнить поиск по любому другому значению в файле, он выводит индекс и сообщения «Не найдено».
Вот мой код:
int main() {
FILE *in_file; /* Input file */
int middle; /* Middle of our search range */
int low, high; /* Upper/lower bound */
int search; /* number to search for */
char line[80]; /* Input line */
in_file = fopen(DATA_FILE, "r");
if (in_file == NULL) {
fprintf(stderr,"Error:Unable to open %sn", DATA_FILE);
exit (8);
}
/*
* Read in data
*/
max_count = 0;
while (1) {
if (fgets(line, sizeof(line), in_file) == NULL)
break;
/* convert number */
sscanf(line, "%d", amp;data[max_count]);
max_count;
}
while (1) {
printf("Enter number to search for or -1 to quit:" );
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", amp;search);
if (search == -1)
break;
low = 0;
high = max_count;
while (1) {
middle = (low high) / 2;
if (data[middle] == search) {
printf("Found at index %dn", middle);
}
if (low == high) {
printf("Not foundn");
break;
}
if (data[middle] < search)
low = (middle 1);
else
high = (middle - 1);
}
}
return (0);
}
Первые несколько строк файла numbers.dat:
4
6
14
16
17
И если я ищу 4 или, скажем, 2, я получаю бесконечный цикл, а если я ищу 6, я получаю:
Найдено по индексу 1
Не найдено
Ответ №1:
- Вы должны прервать с не найдено, если низкий> высокий.
- Вы не прерываетесь, если нашли, поэтому переходите к другой итерации.
- Вы всегда проверяете середину. что, если high или low дают необходимый результат?
Комментарии:
1. Ого. Я исправил поиск для всех этих условий, и это сработало. Большое спасибо!
Ответ №2:
Следующий код:
while (1) {
middle = (low high) / 2;
if (data[middle] == search) {
printf("Found at index %dn", middle);
}
Не завершает цикл. Выясните, что вам нужно сделать, чтобы выйти из этого.