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

Работа с типизированными динамическими массивами в FreePascal: возвращаем массив делителей числа и выводим его элементы на консоль

Delphi , Синтаксис , Массивы

Вопрос, поднятый пользователем, касается работы с динамическими массивами в среде FreePascal, которая является близкой по функционалу к Delphi. Суть проблемы заключается в необходимости возвращения массива делителей числа, используя типизированный динамический массив, а также в выводе элементов этого массива на консоль.

Подход к решению

Для начала, давайте определим тип динамического массива для целых чисел:

type
  TIntegerDynArray = array of Integer;

Теперь, используя этот тип, можно определить функцию, которая будет возвращать массив делителей числа:

function PrimFac(N: Integer): TIntegerDynArray;
var
  Divisor, A, counter: Integer;
  Result: TIntegerDynArray;
begin
  A := N;
  SetLength(Result, 0);
  counter := 0;
  for Divisor := 2 to N div 2 do
  begin
    while A mod Divisor = 0 do
    begin
      A := A div Divisor;
      SetLength(Result, Length(Result) + 1);
      Result[counter] := Divisor;
      Inc(counter);
    end;
  end;
  if A > 1 then
  begin
    SetLength(Result, Length(Result) + 1);
    Result[counter] := A;
    Inc(counter);
  end;
end;

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

uses
  fgl;

type
  TIntegerDynArray = array of Integer;
  TIntegerList = specialize TFPGList<Integer>;

function PrimFac(N: Integer): TIntegerDynArray;
var
  Divisor, A: Integer;
  L: TIntegerList;
begin
  A := N;
  L := TIntegerList.Create;
  try
    for Divisor := 2 to N div 2 do
    begin
      while A mod Divisor = 0 do
      begin
        A := A div Divisor;
        L.Add(Divisor);
      end;
    end;
    if A > 1 then
      L.Add(A);

    SetLength(Result, L.Count);
    for var I in L do
      Result[Length(Result) - L.Count(I)] := I;
  finally
    L.Free;
  end;
end;

Вывод элементов массива на консоль

Для вывода элементов массива на консоль можно использовать цикл, как показано ниже:

var
  I: Integer;
  Divisors: TIntegerDynArray;
begin
  Divisors := PrimFac(1000);
  for I := Low(Divisors) to High(Divisors) do
    Write(Divisors[I], ' ');
  Writeln;
end.

В данном примере используется стандартный синтаксис для перебора элементов массива.

Подтвержденный ответ

Использование временного TList для хранения элементов и последующее преобразование его в массив является эффективным решением, позволяющим избежать частых изменений размера динамического массива. Для вывода элементов массива на консоль можно использовать цикл, который перебирает элементы массива по индексам или с использованием нового синтаксиса диапазона в современных версиях Pascal.

Альтернативный ответ

Также, как было упомянуто в контексте, можно использовать модифицированный алгоритм для вывода элементов массива на консоль прямо во время его формирования:

for Divisor := 2 to N div 2 do
begin
  while A mod Divisor = 0 do
  begin
    A := A div Divisor;
    L.Add(Divisor);
    Write(Divisor, ' ');
  end;
end;
Writeln;

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

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

Задача заключается в реализации функции для вычисления и вывода делителей числа с использованием типизированных динамических массивов в языках программирования, близких к Delphi, таких как FreePascal.


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

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




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


:: Главная :: Массивы ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 12:19:55/0.0014581680297852/0