Массив
Общая информация
Массив представляет собой структуру данных, которая хранит некоторый набор значений. Элементы массива могут быть как одинакового, так и различного типа. Идентификация элементов массива выполняется по индексу.
Размер массива
Любой массив в каждый момент времени имеет определенный размер. Размер массива можно изменять динамически, например, добавив или удалив элемент массива.
Изменяемые и неизменяемые массивы
Массивы могут быть неизменяемыми и изменяемыми:
- в неизменяемом массиве нельзя изменить ни значение элемента массива, ни размер самого массива. Неизменяемый массив будет называться фиксированным массивом;
- в изменяемом массиве возможно как изменение любого элемента массива, так и изменение параметров самого массива. Изменяемый массив будет называться массивом или обычным массивом.
Соответственно, тип для неизменяемого (фиксированного) массива называется ЧитаемыйМассив<ТипЭлемента>, а тип для обычного массива — Массив<ТипЭлемента>.
Создание массива
Создание массива выполняется стандартным способом:
пер ПустойМассив = новый Массив<Число>()
пер МассивСДанными = [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])
;
метод МетодСМассивом(ПараметрМассив: ЧитаемыйМассив<Число>)
пер ТипМассива = ПараметрМассив.ПолучитьТип()
для ЭлементМассива из ПараметрМассив
пер Строка = "Индекс = " +
ПараметрМассив.Найти(ЭлементМассива) +
", значение = " + ЭлементМассива
;
;
В данном примере в качестве параметра метода МетодСМассивом() выступает значение типа ЧитаемыйМассив<Число>. Это позволяет нам передавать в этот метод как обычный массив (первый и третий случай вызова в методе МойМетод()), так и фиксированный массив (второй случай вызова). Такая возможность предоставляется потому, что тип Массив<ТипЭлемента> является потомком типа ЧитаемыйМассив<ТипЭлемента>.
Если изменить типа параметра ПараметрМассив метода МетодСМассивом() на Массив<Число>, то попытка вызвать метод с фиксированным массивом в качестве параметра приведет к ошибке компиляции из-за несовпадения типов.
Сравнение массивов
Допустимо сравнение массивов на равенство (или неравенство). Два массива являются равными, если равны их размеры и каждый элемент первого массива содержится во втором массиве. Если элемент массива является другим массивом, выполняется попытка рекурсивного сравнения.