Массивы

Массив хранит последовательность элементов одного типа и обеспечивает быстрый доступ к элементам по индексу.

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

Динамический массив имеет тип array of. Массив заданной длины создаётся с помощью new.

begin
  var n := 5;
  var a: array of integer := new integer[n];

  a.Println;
end.

Результат:

0 0 0 0 0

Массив с начальными значениями

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

begin
  var a := [3, 8, 1, 6, 4];

  a.Println;
end.

Результат:

3 8 1 6 4

Длина массива

Свойство Length содержит количество элементов массива.

begin
  var a := [10, 20, 30, 40];

  Println(a.Length);
end.

Результат:

4

Доступ по индексу и изменение элемента

К элементу массива можно обратиться по индексу и изменить его значение. Нумерация элементов начинается с нуля.

begin
  var a := [10, 20, 30, 40];

  Println(a[0]);
  a[2] := 100;

  Println(a);
end.

Результат:

10
[10,20,100,40]

Доступ по индексу с конца

Индекс ^1 обозначает последний элемент массива, ^2 — предпоследний, и так далее.

begin
  var a := [10, 20, 30, 40];

  Println(a[^1]);
  a[^2] := 100;

  Println(a);
end.

Результат:

40
[10,20,100,40]

Заполнение массива одинаковыми значениями

ArrFill создаёт массив заданной длины и заполняет его одинаковыми значениями.

begin
  var a := ArrFill(10, 0);

  Println(a);
end.

Результат:

[0,0,0,0,0,0,0,0,0,0]

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

begin
  var a := [0] * 10;

  Println(a);
end.

Результат:

[0,0,0,0,0,0,0,0,0,0]

Сложение массивов

Операция + объединяет два массива в один.

begin
  var a := [1, 2, 3];
  var b := [4, 5, 6];

  var c := a + b;

  Println(c);
end.

Результат:

[1,2,3,4,5,6]

Массивы строк и кортежей

Массив может содержать элементы любого одного типа, например строки или кортежи.

begin
  var names := ['Анна', 'Борис', 'Вера']; // array of string
  var people 
    := [('Анна', 20), ('Борис', 18), ('Вера', 21)]; // array of (string,integer)

  Println(names);
  Println(people);
end.

Результат:

[Анна,Борис,Вера]
[(Анна,20),(Борис,18),(Вера,21)]

Изменение элементов в цикле for

Цикл for удобно использовать, когда нужен индекс элемента или требуется изменять элементы массива по индексам.

begin
  var a := [1, 2, 3, 4, 5];

  for var i := 0 to a.Length - 1 do
    a[i] *= 2;

  a.Println;
end.

Результат:

2 4 6 8 10

Перебор массива

Цикл foreach используется для последовательного перебора всех элементов массива.

begin
  var a := [3, 8, 1, 6];

  foreach var x in a do
    Print(x);
end.

Результат:

3 8 1 6

Сумма, минимум и максимум

Методы Sum, Min и Max позволяют вычислить сумму, минимальный и максимальный элементы числового массива.

begin
  var a := [7, 2, 9, 4, 5];

  Println(a.Sum);
  Println(a.Min);
  Println(a.Max);
end.

Результат:

27
2
9

Сортировка массива

Процедура Sort сортирует массив по возрастанию, а SortDescending — по убыванию.

begin
  var a := [7, 2, 9, 4, 5];

  Sort(a);
  Println(a);

  SortDescending(a);
  Println(a);
end.

Результат:

[2,4,5,7,9]
[9,7,5,4,2]

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

При обычном присваивании две переменные ссылаются на один и тот же массив. Copy создаёт независимую копию массива.

begin
  var a := [10, 20, 30];
  var b := Copy(a);

  b[0] := 100;

  Println(a);
  Println(b);
end.

Результат:

[10,20,30]
[100,20,30]

Сравнение массивов

Метод ArrEqual проверяет, содержат ли два массива одинаковые элементы в одинаковом порядке.

begin
  var a := [1, 2, 3];
  var b := [1, 2, 3];
  var c := [1, 3, 2];

  Println(a.ArrEqual(b));
  Println(a.ArrEqual(c));
end.

Результат:

True
False

Поиск элемента

Операция in позволяет проверить, содержится ли элемент в массиве, а IndexOf возвращает индекс первого найденного элемента или -1, если такого элемента нет.

begin
  var a := [3, 8, 1, 6, 4];

  Println(6 in a);
  Println(10 in a);

  Println(a.IndexOf(6));
  Println(a.IndexOf(10));
end.

Результат:

True
False
3
-1

Срез массива

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

begin
  var a := [10, 20, 30, 40, 50, 60];

  var b := a[1:4];

  b.Println;
end.

Результат:

20 30 40

Срез с шагом

В срезе можно указать шаг выбора элементов.

begin
  var a := [10, 20, 30, 40, 50, 60];

  a[::2].Print;
end.

Результат:

10 30 50

Срез с отрицательным шагом

Отрицательный шаг позволяет выбирать элементы в обратном порядке.

begin
  var a := [10, 20, 30, 40, 50, 60];

  a[::-1].Print;
end.

Результат:

60 50 40 30 20 10

Создание массива из диапазона

Функция Arr создаёт массив из целочисленного диапазона.

begin
  var a := Arr(1..10);

  a.Println;
end.

Результат:

1 2 3 4 5 6 7 8 9 10

Массив случайных чисел

ArrRandomInteger создаёт массив заданной длины и заполняет его случайными целыми числами из указанного диапазона.

begin
  var a := ArrRandomInteger(10, 1, 9);

  a.Println;
end.

Результат зависит от случайной генерации.