Массив

Общая информация

Массив представляет собой структуру данных, которая хранит некоторый набор значений. Элементы массива могут быть как одинакового, так и различного типа. Идентификация элементов массива выполняется по индексу.

Размер массива

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

Изменяемые и неизменяемые массивы

Массивы могут быть неизменяемыми и изменяемыми:

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

Соответственно, тип для неизменяемого (фиксированного) массива называется ЧитаемыйМассив<ТипЭлемента>, а тип для обычного массива — Массив<ТипЭлемента>.

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

Создание массива выполняется стандартным способом:

пер ПустойМассив = новый Массив<Число>()
пер МассивСДанными = [1, 2, 3]
пер МассивКопия = новый Массив<Число>(МассивСДанными)

пер ДляРаботы = новый Массив<Число>()
ДляРаботы.Добавить(1)
ДляРаботы.Добавить(2)

пер Коэффициенты: Массив<Число>
Коэффициенты = [1, 2 , 3]

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

Создание фиксированного массива выполняется аналогично изменяемому.

пер НеизмМассивСДанными: ЧитаемыйМассив<Число> = [1, 2, 3]
пер МатКонст = [3.141592654, 2.718281828]
пер НеизмКонст = новый ЧитаемыйМассив<Число>(МатКонст)

Элементами массива могут быть значения произвольных типов. В следующем примере приводится несколько вариантов создания массивов с различным наполнением.

пер Матрица = <Массив<Число>>[<Число>[], <Число>[]]
    
пер Матрица2: Массив<Массив<Число>>
Матрица2.Добавить(новый Массив<Число>())
Матрица2.Добавить(новый Массив<Число>())

Во всех приведенных примерах создавались переменные, которые хранили ссылки на массивы значений. Однако язык предоставляет возможность использовать массив, не объявляя для этого отдельную переменную. Для этого можно использовать литерал [элемент0, ..., элементN], где каждый элемент — это выражение на встроенном языке.

метод МойМетод()
    для Расширение из ["*.epf", "*.erf"]
        пер Строка = "Текущее расширение: " + Расширение
        // какое-то полезное действие
    ;
    РаботаСМассивом([3.141592654, 2.718281828])
;

метод РаботаСМассивом(СЧемРаботаем: ЧитаемыйМассив<Число>)
    для Элемент из СЧемРаботаем
        пер Строка = "Текущий элемент: " + Элемент
        // какое-то полезное действие
    ;
;

Использование массива

Для обращения к элементу массива используется индекс. Индекс массива является целым числом, значение которого может находиться в диапазоне от 0 до 232. Массив из N элементов индексируется от 0 до N–1, где 0 — это индекс первого элемента в массиве. Обращение по индексу, указывающему за границу массива, приведет к исключению. Если значение индекса является дробным числом (не целочисленным), то обращение по такому индексу приведет к ошибке.

Для обращения к элементам массива можно использовать один из следующих способов:
  • С помощью операции доступа по индексу []. В этом случае индекс требуемого элемента массива нужно указать внутри квадратных скобок []. Обращение к 5-му элементу массива Коэффициенты будет выглядеть следующим образом: Коэффициенты[4].
  • Функциональный способ. В этом случае индекс нужного элемента массива нужно указать в качестве параметра метода Получить() соответствующего массива. Обращение к 5-му элементу массива Коэффициенты будет выглядеть следующим образом: Коэффициенты.Получить(4).
пер Данные: Массив<Число> = [1, 2, 3]
пер ДоступПоИндексу = Данные[0]
пер ФункциональныйСпособ = Данные.Получить(1)

Перебор элементов массива

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

В цикле обхода коллекции «Исполнитель» не поддерживает изменение состава коллекции. При попытке такого изменения «Исполнитель» выбросит исключение.

пер Данные: Массив<Число> = [1, 2, 3]
пер ТекущийЭлементМассива: Число

// Обход циклом "для"
для Индекс = 0 по Данные.Граница() 
    ТекущийЭлементМассива = Данные.Получить(Индекс)
;

// Обход с помощью итератора
для Элемент из Данные
    ТекущийЭлементМассива = Элемент
;

// Обход циклом "пока"
пер Индекс = 0
пока Индекс <= Данные.Граница()
    ТекущийЭлементМассива = Данные.Получить(Индекс)
    Индекс += 1
;

Массив как параметр или возвращаемое значение

Теперь разберемся, каким образом следует пользоваться массивами в том случае, когда массив является параметром метода или возвращаемым значением. Для типа параметра метода следует использовать тип ЧитаемыйМассив<ТипЭлемента>. В этом случае в качестве параметра можно передать как фиксированный, так и обычный массив.

метод МойМетод()
    пер МатКонст = [3.141592654, 2.718281828]
    МетодСМассивом(МатКонст)

    МетодСМассивом(новый ЧитаемыйМассив<Число>(МатКонст))

    МетодСМассивом([7, 6, 5, 4, 3, 2])
;

метод МетодСМассивом(ПараметрМассив: ЧитаемыйМассив<Число>)
    пер ТипМассива = ПараметрМассив.ПолучитьТип()
    для ЭлементМассива из ПараметрМассив
        пер Строка = "Индекс = " + 
                     ПараметрМассив.Найти(ЭлементМассива) +
                     ", значение = " + ЭлементМассива
    ;
;

В данном примере в качестве параметра метода МетодСМассивом() выступает значение типа ЧитаемыйМассив<Число>. Это позволяет нам передавать в этот метод как обычный массив (первый и третий случай вызова в методе МойМетод()), так и фиксированный массив (второй случай вызова). Такая возможность предоставляется потому, что тип Массив<ТипЭлемента> является потомком типа ЧитаемыйМассив<ТипЭлемента>.

Если изменить типа параметра ПараметрМассив метода МетодСМассивом() на Массив<Число>, то попытка вызвать метод с фиксированным массивом в качестве параметра приведет к ошибке компиляции из-за несовпадения типов.

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

Допустимо сравнение массивов на равенство (или неравенство). Два массива являются равными, если равны их размеры и каждый элемент первого массива содержится во втором массиве. Если элемент массива является другим массивом, выполняется попытка рекурсивного сравнения.