Листинг 5.3. Функция двоичного поиска (с ошибками)
int badsearch(DataType t)
{ int 1.u , m.
1-0 : u = п - 1 ;
whi1е (1<=и) {
m = (1 + и)/2.
/* pnntfC Јd Јd Јd\n", 1 , m. u). */ if (x[m]<t)
1 - m. else if (x[m]>t) и = m.
else
return m:}
ret urn -1,}
К закомментированному оператору printf мы вскоре вернемся. Попытаемся обнаружить ошибки в этом коде?
Итак, программа благополучно прошла первые два теста. Она пашла 20 в позиции 2 и 30 в позиции 3 в 5-элементном массиве;
Когда я ввел команду на поиск числа 40, программа зависла в бесконечном цикле. Почему?
Для получения ответа на этот вопрос я вставил оператор printf, который в листинге 5.3 закомментирован. Он выводит значения I, пл и и на каждой итерации цикла:
В первый раз мы находим 20 с первой попытки, а во второй раз находим 30 со второй попытки. С третьей попытки программа уходит в бесконечный цикл. Мы могли бы найти ошибку, если бы попытались (безуспешно) доказать сходимость алгоритма.
Когда мне нужно отладить небольшой алгоритм в большой программе, я иногда использую пошаговое выполнение большой программы. При работе с алгоритмом с использованием тестовых программ, как в данном случае, быстрее и эффективнее оказывается вставить операторы printf, чем пользоваться хитрыми отладчиками.
Опубликовал vovan666
April 16 2013 23:58:32 ·
0 Комментариев ·
3087 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.