Массивы. Создание массивов, заполнение данными, обращения к элементам и другие операции с массивами

Материал из ТХАБ.РФ
Перейти к: навигация, поиск

Массивы данных используются в программировании повсеместно. В языке программирования Перфолента существуют богатые возможности для операций с массивами. В этой статье рассматриваются основные приемы работы с массивами и синтаксис операций с ними.

Отображение массива в памяти компьютера

Теоретическая часть

В языке программирования Перфолента.Net, как и во многих других языках, существуют встроенные в язык массивы.

В языке 1С версии 8, в отличие от 1С версии 7.7 массивы как часть языка отсутствуют (не считая коллекции с таким же названием). Поэтому многим программистам 1С будет не лишним ознакомиться с синтаксисом и приемами работы с массивами.

Массив — это набор данных одного типа. Например, массив целых чисел, массив строк, массив дат и т.д.

К элементам данных входящих в массив можно обращаться по индексу (индекс указывает позицию элемента начиная с нуля).

Важно: Существуют понятия нумерация и индексация.

  • Нумерация начинается с единицы, а индексация начинается с нуля.
  • Индекс элемента на единицу меньше, чем его номер.

Объявление и использование Массива

Для объявления массива в языке программирования Перфолента существует оператор Массив. Выглядит это так:

Массив А[99] тип Целое

В этом примере мы создали 100 (а не 99) элементов типа Целое, т.к. существует элемент с индексом 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   //спойлер для зануды++ компилятор собирает значения последовательно, преобразовывая их в тип самого левого значения. Поэтому + тут не сложение, а конкатенация (склеивание текстовых строк т.е. "Вася" + "0" + "1"), т.к. мы имеем дело с 1С, а не с VB, где это разные операторы. Поэтому без скобок получим не ошибку компиляции, а  Вася01, Вася11, Вася21, Вася31 --
КонецЦикла

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

Массивы. Оператор "Новый"

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

мас = Новый Целое[99]

Вместо типа Целое в этом примере мог бы быть любой другой тип, даже тип ТекстовыйДокумент.

МояПроцедура(Новый ТекстовыйДокумент[99])  //передаём в процедуру новый массив со 100 (=99+1) элементами типа ТекстовыйДокумент в процедуру


Квадратные скобки

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

Перем мЦ тип Целое[] = Неопределено //переменной мЦ нельзя присвоить целое число, но можно присвоить массив целых чисел, т.к. тип Целое[ ] это тип массива целых чисел
Перем мС тип Строка[] = Неопределено //переменной мС нельзя присвоить строку, но можно присвоить массив строк, т.к. тип Строка[ ] это тип массива строк

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

Процедура  МояПроцедура( МассивДокументов тип ТекстовыйДокумент[] ) //квадратные скобки тут обязательны, т.к. мы хотим передать массив документов, а не один документ
   //....        
КонецПроцедуры

Умнику на заметку: Существуют многомерные массивы, для обращения к элементам которых необходимо указывать несколько индексов, один индекс для каждого измерения. Например, МАС[3, 5] имеет 4 * 6 = 24 элемента. Для создания типа многомерного массива в квадратных скобках необходимо указывать соответствующее количество запятых, например, тип двухмерного массива целых чисел объявляется так: Целое[ , ]. Многомерные массивы будут рассмотрены в другой статье.

Заполнить массив данными можно как в цикле (пример выше), так и с помощью инициализатора. Причем инициализатор может заполнить существующий массив или создать новый:

Массив масЧисла[9] тип Целое
масЧисла{0,1,2,3,4,5,6,7,8,9} //заполняем существующий массив
масДниНедели = {"Пн","Вт","Ср","Чт","Пт","Сб","Вс"} //создали новый Массив строк

И, на конец, массивы можно изменять, удалять, очищать используя специальные операторы:

//пересоздание массива с новым размером
//содержимое массива пропадает
мСтр[0]="Определено!"
МассивНовый мСтр[2]
   
//изменение размера массива
//содержимое сохраняется до верхней границы нового размера
мСтр[0]="Элементы сохранились при изменении размера массива..."
МассивИзменить мСтр[1]
   
//Очистка массива
//Элементам устанавливаются значения по умолчанию для заданного типа элементов
МассивОчистить мСтр, масИниЦел2М
   
//Удаление массива
//Переменной массива присваивается значение Неопределено
МассивУдалить мСтр, масИниЦел2М    

Массивы являются перечисляемыми объектами, поэтому можно перебирать все элементы с помощью цикла Для Каждого:

Для Каждого Эл Из масДниНедели
   ВыводСтроки Эл //в переменную Эл по очереди попадают все элементы массива
КонецЦикла

На этом пока все. Успехов в работе с массивами.

См. также

'Показать Содержание Описание языка Перфолента.NET'

Ссылки