Массив

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

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

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

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

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

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

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

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

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

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

пер ПустойМассив = новый Массив<Число>()
пер МассивСДанными = [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])
;

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

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

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

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

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