В данной статье мы рассмотрим проблему, с которой столкнулся разработчик при создании программы для вставки чисел в отсортированный список. При запуске программы список заполнялся нулями, а не случайными числами, как того ожидалось. Мы рассмотрим код программы, чтобы понять, что пошло не так, и найдем решение этой проблемы.
Описание проблемы
Разработчик создает программу на Паскале для вставки чисел в отсортированный список с использованием бинарного поиска. Однако, при запуске программы список заполняется нулями, а не случайными числами, как того ожидалось. Даже до сортировки список заполнен нулями, что указывает на проблему с присвоением значений элементам массива.
Код программы
Приведем код программы, чтобы лучше понять проблему:
program BinaryInsert;
function binaryfind(head, tail : integer; e : integer; vector: array of integer) : integer;
var
mid : integer;
begin
mid := (head + tail) div 2;
if head <> tail then
begin
if vector[mid] >= e then
binaryfind(mid+1, tail, e, vector)
else
binaryfind(head, mid, e, vector);
end
else
begin
if e >= vector[mid] then
binaryfind := mid + 1
else
binaryfind := mid;
end;
end;
procedure swap(e1, e2: integer);
var
aux : integer;
begin
aux := e1;
e1 := e2;
e2 := aux;
end;
procedure binaryinsert(e : integer; vector : array of integer);
var
i, placement, l : integer;
begin
l := Length(vector);
placement := binaryfind(0, l-1, e, vector);
vector[l] := e;
for i := (l-1) downto (placement + 1) do
swap(vector[i], vector[i-1]);
end;
procedure randomsorted(vector : array of integer);
var
i : integer;
begin
for i := 0 to Length(vector)-1 do
binaryinsert(random(9999), vector);
end;
var
vector : array of integer ;
e : integer;
begin
SetLength(vector, 5);
randomsorted(vector);
for e in vector do
writeln(e);
readln(e);
end.
Анализ кода
При ближайшем рассмотрении кода можно увидеть несколько проблем:
Функция binaryfind не возвращает правильное значение для размещения элемента в массиве. Она не использует результат рекурсивного вызова и не учитывает, что массив может не быть отсортированным.
В процедуре binaryinsert элементы массива swap'ются без проверки, нужно ли это делать. Это может привести к неправильной сортировке.
В процедуре randomsorted используются неправильные границы цикла. Он должен идти от 0 до Length(vector)-1, а не до Length(vector).
Функция random не инициализируется вызовом Randomize, что приводит к возвращению всегда одного и того же значения (0).
Решение проблемы
Чтобы решить проблему, необходимо исправить несколько моментов в коде:
Исправить функцию binaryfind, чтобы она возвращала правильное значение для размещения элемента в массиве. Для этого нужно использовать результат рекурсивного вызова и учитывать, что массив может не быть отсортированным.
В процедуре binaryinsert добавить проверку, нужно ли swap'ить элементы массива. Это гарантирует правильную сортировку.
В процедуре randomsorted исправить границы цикла на правильные.
Добавить вызов Randomize перед использованием функции random, чтобы она возвращала случайные значения.
После внесения этих изменений программа должна правильно читать случайное число и заполнять отсортированный список.
Заключение
В данной статье мы рассмотрели проблему, с которой столкнулся разработчик при создании программы для вставки чисел в отсортированный список. Мы проанализировали код программы и нашли решение проблемы. Важно помнить, что правильное использование отладчика и понимание алгоритмов могут значительно упростить процесс поиска и исправления ошибок в коде.
Статья описывает проблему, возникшую при создании программы на Паскале для вставки чисел в отсортированный список с использованием бинарного поиска, когда программа заполнялась нулями вместо случайных чисел.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS