Динамические массивы в Паскале
Статический массив в языке 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 элемент больше начальной.
- Задаем значение и позицию добавляемого элемента.
- Все элементы до указанной позиции сдвигаем на один назад.
- Присваиваем значение элемента по указанной позиции.
Код, реализующий алгоритм:
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 элемент меньше начальной.
Пример удаления элемента:
Ввод: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, представляющий собой список. В нём присутствуют функции добавления и удаления элемента, очистки и сортировки самого списка и другие. Но для его использования необходимо разбираться в принципах объектно-ориентированного программирования (ООП).