Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Почему моя программа на Паскале не читает случайное число и не заполняет отсортированный список?"

Delphi , Базы данных , Сортировка и Фильтр

В данной статье мы рассмотрим проблему, с которой столкнулся разработчик при создании программы для вставки чисел в отсортированный список. При запуске программы список заполнялся нулями, а не случайными числами, как того ожидалось. Мы рассмотрим код программы, чтобы понять, что пошло не так, и найдем решение этой проблемы.

Описание проблемы

Разработчик создает программу на Паскале для вставки чисел в отсортированный список с использованием бинарного поиска. Однако, при запуске программы список заполняется нулями, а не случайными числами, как того ожидалось. Даже до сортировки список заполнен нулями, что указывает на проблему с присвоением значений элементам массива.

Код программы

Приведем код программы, чтобы лучше понять проблему:

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.

Анализ кода

При ближайшем рассмотрении кода можно увидеть несколько проблем:

  1. Функция binaryfind не возвращает правильное значение для размещения элемента в массиве. Она не использует результат рекурсивного вызова и не учитывает, что массив может не быть отсортированным.
  2. В процедуре binaryinsert элементы массива swap'ются без проверки, нужно ли это делать. Это может привести к неправильной сортировке.
  3. В процедуре randomsorted используются неправильные границы цикла. Он должен идти от 0 до Length(vector)-1, а не до Length(vector).
  4. Функция random не инициализируется вызовом Randomize, что приводит к возвращению всегда одного и того же значения (0).

Решение проблемы

Чтобы решить проблему, необходимо исправить несколько моментов в коде:

  1. Исправить функцию binaryfind, чтобы она возвращала правильное значение для размещения элемента в массиве. Для этого нужно использовать результат рекурсивного вызова и учитывать, что массив может не быть отсортированным.
  2. В процедуре binaryinsert добавить проверку, нужно ли swap'ить элементы массива. Это гарантирует правильную сортировку.
  3. В процедуре randomsorted исправить границы цикла на правильные.
  4. Добавить вызов Randomize перед использованием функции random, чтобы она возвращала случайные значения.

После внесения этих изменений программа должна правильно читать случайное число и заполнять отсортированный список.

Заключение

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

Создано по материалам из источника по ссылке.

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Сортировка и Фильтр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:35:36/0.0056319236755371/1