Динамические массивы в Паскале

Статический массив в языке Pascal задаётся в виде:

var<имя массива>: array [<первый индекс>..<последний индекс>] of<тип элементов массива>;

Размер статического массива неизменен, задаётся при его описании и равен B-A+1, где B–это последний индекс, а A–первый индекс массива. В динамическом массиве мы в начале не задаем размери можем изменять его по ходу выполнения программы.

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

Создание динамического массива

Массив, не имеющий заданных размеров мы можем определить так:

var<имя массива>: arrayof<тип элементов массива>;

Для того, чтобы задать размер динамического массива используется функция Setlength. Она имеет два параметра. Первый – это сам массив, а второй — целое число, которое определяет размер массива.
Перед использованием Setlengthмассив имеет длину равную 0. Функцию Setlengthможно использовать и несколько раз.Проверить длину массива можно при помощи функции length.

Пример задания длины массива:

Ввод:var a: array of integer;
begin
writeln(‘Length1: ‘, length(a));
Setlength(a, 2);
writeln(‘Length2: ‘, length(a));
Setlength(a, 4);
writeln(‘Length3: ‘, length(a));
end.
Вывод:Length1: 0
Length2: 2
Length3: 4

Очистка динамического массива

Для очистки данных в динамическом массиве нужно использовать функцию Setlengthсо вторым параметром, равным 0.

Пример очистки массива.

Ввод:var a: array of integer;
begin
Setlength(a, 4);
writeln(‘Length1: ‘, length(a));
Setlength(a, 0);
writeln(‘Length2: ‘, length(a));
end.
Вывод:Length1: 4
Length2: 0

Многомерные динамические массивы

Кроме одномерных динамических массивов в языке Pascalсуществуют и многомерные. Динамические массивы, имеющие размерность больше 1, задаются таким образом:

var<имя массива>: arrayof<тип элементов>ofarray<тип элементов>of … (слово array используем столько раз, сколько составляет размерность массива)

Пример создания двумерного массива размером 5*3:

varc: arrayofarrayofinteger;
i: integer;
begin
SetLength(c,5);
fori := 0 to 2 do
SetLength(c[i],3);
writeln(length(c));
end.

Примеры работы с динамическими массивами

Ввод массива

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

Пример ввода массива:

var c: array of integer;
n, i: integer;
begin
read(n); // вводим длину с клавиатуры
SetLength(c,n); // задаём длину массива
fori := 0 to n-1 do
read(c[i]); // вводим n элементов массива
end.

Вывод массива

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

var c: array of integer;
i: integer;
begin
SetLength(c, 5); // задаём длину
fori := 0 to 4 do
c[i] := 1; // заполняем массив единицами
fori := 0 to 4 do
write(c[i], ‘ ‘); // выводим элементы через пробел
end.

Операции с массивами

Вставка элемента

Для того, чтобы вставить элемент в динамический массив необходимо действовать по следующему алгоритму:

  1. Изменяем длину массива. Делаем её на 1 элемент больше начальной.
  2. Задаем значение и позицию добавляемого элемента.
  3. Все элементы до указанной позиции сдвигаем на один назад.
  4. Присваиваем значение элемента по указанной позиции.

Код, реализующий алгоритм:

const n = 5;
var c: array of integer;
i, num, pos: integer;
begin
SetLength(c, n);
fori := 0 to n-1 do
c[i] := 1; // заполняем массив единицами
SetLength(c, n+1); // увеличение длины массива на 1
num := 2; // значение вставляемого элемента
pos := 3; // позиция для вставки
fori := n — 1 downto 0 do
c[i+1] := c[i];// сдвиг элементов
c[pos-1] := num;// непосредственно вставка нового элемента в массив
end.

Удаление элемента

Чтобы удалить элемент из динамического массива нужно следовать алгоритму, приведенному ниже:

  1. Выбираем позицию удаляемого элемента.
  2. Все элементы после указанной позиции сдвигаем на один назад.
  3. Изменяем длину массива. Делаем её на 1 элемент меньше начальной.

Пример удаления элемента:

Ввод:const n = 6;
var c: array of integer;
i, num, pos: integer;
begin
SetLength(c, n);
fori := 0 ton-1 do
c[i] := 1; // заполняем массив единицами
c[pos-1] := 2; // для наглядности заменяем элемент на необходимой позиции двойкой
pos := 3; // позиция элемента для удаления
write (‘First array: ‘);
fori := 0 to n-1 do
write(c[i], ‘ ‘); // выводим элементы массива через пробел
writeln;
fori := pos-1 ton-2 do
c[i] := c[i+1]; // сдвиг элементов
SetLength(c, n-1); // уменьшение длины массива на 1
write (‘Second array: ‘);
fori := 0 to n-2 do
write(c[i], ‘ ‘); // выводим массив ещё раз
end.
Вывод:1 1 2 1 1 1
1 1 1 1 1

Список — аналог динамического массива

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

Пример реализации односвязного списка:

type
PNode = ^Node;
Node = record
data: integer;
next: PNode;
end;

Также в языке Delphi, являющимся закономерном продолжением Pascal существует класс TList, представляющий собой список. В нём присутствуют функции добавления и удаления элемента, очистки и сортировки самого списка и другие. Но для его использования необходимо разбираться в принципах объектно-ориентированного программирования (ООП).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *