Массивы. Создание массивов, заполнение данными, обращения к элементам и другие операции с массивами
Массивы данных используются в программировании повсеместно. В языке программирования Перфолента существуют богатые возможности для операций с массивами. В этой статье рассматриваются основные приемы работы с массивами и синтаксис операций с ними.
Отображение массива в памяти компьютера
В языке программирования Перфолента.Net, как и во многих других языках, существуют встроенные в язык массивы.
В языке 1С версии 8, в отличие от 1С версии 7.7 массивы как часть языка отсутствуют (не считая коллекции с таким же названием). Поэтому многим программистам 1С будет не лишним ознакомиться с синтаксисом и приемами работы с массивами.
Массив — это набор данных одного типа. Например, массив целых чисел, массив строк, массив дат и т.д.
К элементам данных входящих в массив можно обращаться по индексу (индекс указывает позицию элемента начиная с нуля).
Умнику на заметку: Существуют понятия нумерация и индексация. Нумерация начинается с единицы, а индексация начинается с нуля. Индекс элемента на единицу меньше, чем его номер.
Для объявления массива в языке программирования Перфолента существует оператор Массив (странно, если бы он назывался иначе). Выглядит это так:
Массив А[99] тип Целое
В этом примере мы создали 10 (а не 9) элементов типа Целое, т.к. существует элемент с индексом 0, к которому мы можем обратиться так А[0]. Это значит, что при создании массива мы указываем верхний индекс, а не количество элементов, как в некоторых других языках программирования. Если вы случайно укажете количество элементов, то ничего страшного не произойдет, у вас просто будет одно лишнее место в массиве.
Умнику на заметку: К моменту объявления имя массива не должно быть занято.
В одном операторе мы можем создать несколько массивов одного типа:
Массив Фамилии[99], Имена[99], Отчества[99] тип Строка
Мы так же можем задать элементам массива начальное значение, указав его после знака равно:
Массив А[5] тип Целое = 1
В результате в массиве будет 6 единиц. Проверим это:
ВыводСтроки А.Представление
Получилось: 1 1 1 1 1 1
Как и в случае с переменными, тип массива можно не указывать, если указано значение инициализации (в данном случае единица). Так как все элементы массива имеют одинаковый тип, то тип значения инициализации становится типом массива:
Массив А[5] = 1 //массив получит тип Целое Массив ФИО[99] = "" //массив получит тип Строка
Умнику на заметку: т.к. существуют значения структурного и ссылочного типов, то надо помнить об этом при инициализации массивов. Понятно, что все элементы массива структурного типа будут содержать собственные копии значения. А вот элементы массива ссылочного типа могут содержать ссылки на один и тот же объект или на разные, в зависимости от инициализирующего выражения. Надо просто помнить, что инициализирующее выражение вычисляется столько раз, сколько элементов в создаваемом массиве. Подробнее о структурных и ссылочных типах можно прочитать здесь: Переменные. Объявление переменных, инициализация и их использование..
Т = Новый ТекстовыйДокумент //создали один экземпляр текстового документа Массив АА[9] = Т //все элементы массива получат ссылку на один и тот же единственный экземпляр объекта ТекстовыйДокумент Массив ББ[9] = Новый ТекстовыйДокумент //каждый элемент массива получит ссылку на собственный экземпляр объекта ТекстовыйДокумент, которых будет создано 10 штук
При создании массива можно задавать верхний индекс массива с помощью переменной или любого выражения, возвращающего целое число:
ВерхнийИндекс = 9 Массив Б[ВерхнийИндекс] = 0 КоличествоЭлементов = 10 Массив В[КоличествоЭлементов - 1] = 0
Обращаться к элементам массива так же можно при помощи переменной или выражения в качестве индекса. Элементы можно читать и записывать. Например, обойдем массив в цикле, выведем на экран значение каждого элемента и заменим его другим значением.
Массив МА[3] = "Вася" //все элементы получат значение Вася
Для Инд = 0 По 3
ВыводСтроки МА[Инд] //выведет слово Вася 4 раза МА[Инд] = МА[Инд] + (Инд + 1) //вопрос зануды: "А что будет, если убрать круглые скобки?) ВыводСтроки МА[Инд] //выведет Вася1, Вася2, Вася3, Вася4
КонецЦикла
Итак, мы уже можем создать массив из любого количества элементов любого типа, а также записывать в массив значения и читать их из массива. Для многих задач этого более чем достаточно. Но мы пойдем дальше, т.к. тема массивов в языке Перфолента далеко не исчерпана.
Иногда нам необходимо создать массив на лету, например, для передачи его в качестве параметра в процедуру или функцию, или для присвоения переменной. Для этого можно использовать оператор Новый, так же, как и при создании объектов другого типа:
мас = Новый Целое[99]
Вместо типа Целое в этом примере мог бы быть любой другой тип, даже ТекстовыйДокумент.
МояПроцедура(Новый ТекстовыйДокумент[99]) //передали новый Массив в процедуру
Теперь надо сказать несколько слов о том, как простое добавление квадратных скобок превращает любой тип в тип задающий массив элементов этого типа. Например, создадим переменные подходящие для хранения массивов целых чисел и строк:
Перем мЦ тип Целое[] = Неопределено //переменной мЦ нельзя присвоить целое число, но можно присвоить массив целых чисел, т.к. тип Целое[ ] это тип массива целых чисел
Перем мС тип Строка[] = Неопределено //переменной мС нельзя присвоить строку, но можно присвоить массив строк, т.к. тип Строка[ ] это тип массива строк
Точно так же задаются типы параметрам процедуры, если в параметр надо передать массив элементов определенного типа:
Процедура МояПроцедура( МассивДокументов тип ТекстовыйДокумент[] ) //квадратные скобки тут обязательны, т.к. мы хотим передать массив документов, а не один документ //.... КонецПроцедуры
Умнику на заметку: Существуют многомерные массивы, для обращения к элементам которых необходимо указывать несколько индексов, один индекс для каждого измерения. Например, МАС[3, 5] имеет 4 * 6 = 24 элемента. Для создания типа многомерного массива в квадратных скобках необходимо указывать соответствующее количество запятых, например, тип двухмерного массива целых чисел объявляется так: Целое[ , ]. Многомерные массивы будут рассмотрены в другой статье.
Заполнить массив данными можно как в цикле (пример выше), так и с помощью инициализатора. Причем инициализатор может заполнить существующий массив или создать новый:
Массив масЧисла[9] тип Целое масЧисла{0,1,2,3,4,5,6,7,8,9} //заполняем существующий массив масДниНедели = {"Пн","Вт","Ср","Чт","Пт","Сб","Вс"} //создали новый Массив строк
И, на конец, массивы можно изменять, удалять, очищать используя специальные операторы:
//пересоздание массива с новым размером //содержимое массива пропадает мСтр[0]="Определено!" МассивНовый мСтр[2] //изменение размера массива //содержимое сохраняется до верхней границы нового размера мСтр[0]="Элементы сохранились при изменении размера массива..." МассивИзменить мСтр[1] //Очистка массива //Элементам устанавливаются значения по умолчанию для заданного типа элементов МассивОчистить мСтр, масИниЦел2М //Удаление массива //Переменной массива присваивается значение Неопределено МассивУдалить мСтр, масИниЦел2М
Массивы являются перечисляемыми объектами, поэтому можно перебирать все элементы с помощью цикла Для Каждого:
Для Каждого Эл Из масДниНедели ВыводСтроки Эл //в переменную Эл по очереди попадают все элементы массива КонецЦикла
На этом пока все. Успехов в работе с массивами.