Определения контейнерных свойств
Существует три вида контейнерных свойств:
Вектор
Последовательность элементов с сохранением заданного порядка следования. Возможно наличие повторяющихся элементов. Ключ отсутствует. Например, векторами будут следующие наборы значений: (1,2,5,3,2,6); (Ушаков, Кузнецов, Мошкин, Козлов, Сергиевский)
Множество
Последовательность упорядоченных элементов. Ключом является само значение элемента, то есть элементы в множестве упорядочены по значениям. Наличие повторяющихся элементов не допускается.
Примеры множеств: (1,2,3,5,6); (Козлов, Кузнецов, Мошкин, Сергиевский, Ушаков).
Карта
Последовательность пар <ключ - элемент>. Элементы упорядочены по значению уникального ключа. Примеры карт: (1:один, 2:два, 3:три); (Мошкин:программист, Ушаков:менеджер).
При этом сами значения, хранящиеся в контейнерном свойстве, могут быть двух видов:
- Обычное линейное значение. Допустимы значения всех стандартных типов (включая тип ССЫЛКА), кроме изображения и бинарных данных.
- Составное значение (структура). Структура предсталяет собой таблицу, объединяющую несколько значений. Значения в таблице идентифицируются по имени столбца. Соответственно, один элемент структуры имеет вид <имя столбца:значение, имя столбца:значение...>
Для работы с контейнерными свойствами в модуле объявлен ряд типов.
Основные методы для работы с контейнерными свойствами представляет тип КОНТ_СВОЙСТВО. Вид контейнера (вектор, множество или карта) определяется с помощью метода УСТ_КОНТ. Условия работы большинства методов зависят от вида контейнера. Перед тем как добавлять значения в контейнер, необходимо задать тип ключа и тип элемента контейнера с помощью методов УСТАНОВИТЬ_ОДИНОЧ (определяет заданную часть свойства как содержащую одиночные значения) и УСТАНОВИТЬ_СТРУКТ (определяет заданную часть свойства как структуру). Из определений контейнерных свойств понятно, что для вектора необходимо определять только тип элемента, для множества определяется либо тип элемента, либо тип ключа (поскольку ключ и элемент в множестве идентичны), и только для карты необходимо определять как тип ключа, так и тип элемента.
Для работы со структурой в модуле представлены типы КОНТ_КОЛОНКИ (определяет таблицу структуры) и КОНТ_ЭЛЕМЕНТ (определяет элемент структуры).
Для объявления элемента карты (пары <ключ-элемент>) объявлен тип КОНТ_ПАРА.
Кроме того, в модуле объявлены циклы КС_КЛЮЧ, КС_ЭЛЕМ и КС_ПАРА, которые служат соответственно для перебора ключей, элементов и элементов карты.
Перечень типов:
КОНТ_КОЛОНКА | – | представляет во внутреннем языке колонку структуры. |
КОНТ_КОЛОНКИ | – | представляет во внутреннем языке набор колонок структуры. |
КОНТ_ЭЛЕМЕНТ | – | представляет во внутреннем языке элемент структуры. |
КОНТ_ПАРА | – | описывает пару <ключ - элемент> для карты. |
КОНТ_СВОЙСТВО | – | физический тип, представляющий во внутреннем языке контейнерное свойство. |
Пример 1. Работа с вектором
// Функция выводит сообщения с содержимым контейнера ФУНКЦИЯ ПРОСМ_СОДЕРЖ(КОНТ_СВОЙСТВО: вектор) ПЕРЕМ ЧИСЛО: а ПЕРЕМ СТРОКА: знач а = 1 ЦИКЛ ПОКА (а <> (вектор.КОЛ_ЭЛЕМ + 1)) вектор.ЭЛЕМ(а, знач) СООБЩЕНИЕ(знач) а++ КОНЕЦ_ЦИКЛА КОНЕЦ_ФУНКЦИИ ВЫЧИСЛИТЬ ПЕРЕМ КОНТ_СВОЙСТВО: к; к.УСТ_КОНТ(КСТ_ВЕКТОР) к.УСТАНОВИТЬ_ОДИНОЧ(КСЧ_ЭЛЕМ, ТСВ_СТРОКА) ПЕРЕМ ЧИСЛО: и = 1 ЦИКЛ ПОКА (и <> 4) к.ДОБАВИТЬ("элемент " + СТР(и)) и++ КОНЕЦ_ЦИКЛА ПРОСМ_СОДЕРЖ(к) к.ДОБАВИТЬ_ПОЗ(2,"элемент 4") ПРОСМ_СОДЕРЖ(к) к.УСТ_ПОЗ(4,"элемент 5") ПРОСМ_СОДЕРЖ(к) к.УДАЛИТЬ_ПОЗ(1) ПРОСМ_СОДЕРЖ(к) КОНЕЦ
Пример 2. Работа со структурой
ВЫЧИСЛИТЬ ПЕРЕМ КОНТ_СВОЙСТВО: кс ОТЛАДКА(СТР(кс.УСТ_КОНТ(КСТ_МНОЖЕСТВО))) ПЕРЕМ КОНТ_КОЛОНКИ: кол = [ колонки = ( 1 : [имя = "город", тип = ТСВ_СТРОКА], 2 : [имя = "население", тип = ТСВ_ЧИСЛО]) ] ОТЛАДКА(кс.УСТАНОВИТЬ_СТРУКТ(КСЧ_ЭЛЕМ, кол)) ОТЛАДКА(кс.ДОБАВИТЬ(КОНТ_ЭЛЕМЕНТ[ колонки = ("город" : "Москва", "население" : 10 ) ] )) ОТЛАДКА(кс.ДОБАВИТЬ(КОНТ_ЭЛЕМЕНТ[ колонки = ("город" : "Санкт-Петербург", "население" : 5 ) ] )) ОТЛАДКА(кс.ДОБАВИТЬ(КОНТ_ЭЛЕМЕНТ[ колонки = ("город" : "Екатеринбург", "население" : 3 ) ] )) ОТЛАДКА(кс.ДОБАВИТЬ(КОНТ_ЭЛЕМЕНТ[ колонки = ("город" : "Нижний Новгород", "население" : 3 ) ] )) ПЕРЕМ КОНТ_ЭЛЕМЕНТ: город ЦИКЛ КС_ЭЛЕМ (кс, город) ОТЛАДКА(город) КОНЕЦ_ЦИКЛА /* попробуем найти элемент со значениями "Москва - 10" */ город = КОНТ_ЭЛЕМЕНТ[колонки = ("город" : "Москва", "население" : 10)] ОТЛАДКА("Поиск : " + СТР(кс.НАЙТИ(город)) + " " + СТР(город)) /* попробуем найти несуществующий элемент. ПОИСК вернет НЕТ */ город = КОНТ_ЭЛЕМЕНТ[колонки = ("город" : "Москва", "население" : 8)] ОТЛАДКА("Поиск : " + СТР(кс.НАЙТИ(город)) + " " + СТР(город)) КОНЕЦ
Пример 3. Работа с картой
ВЫЧИСЛИТЬ ПЕРЕМ КОНТ_СВОЙСТВО: кс ОТЛАДКА(кс.УСТ_КОНТ(КСТ_КАРТА)) ОТЛАДКА(кс.УСТАНОВИТЬ_ОДИНОЧ(КСЧ_КЛЮЧ, ТСВ_СТРОКА)) СООБЩЕНИЕ(СТР(кс.КОЛ_ЭЛЕМ)) ПЕРЕМ КОНТ_КОЛОНКИ: кол = [ колонки = (1 : [имя = "дата_рожд", тип = ТСВ_ДАТА], 2 : [имя = "должность", тип = ТСВ_СТРОКА]) ] ОТЛАДКА(кс.УСТАНОВИТЬ_СТРУКТ(КСЧ_ЭЛЕМ,кол)) ОТЛАДКА(кс.ДОБАВИТЬ(КОНТ_ПАРА[ ключ = "Иванов", элем = КОНТ_ЭЛЕМЕНТ[ колонки = ( "дата_рожд": 01.01.1970, "должность": "охранник") ]])) ОТЛАДКА(кс.ДОБАВИТЬ(КОНТ_ПАРА[ ключ = "Петров", элем = КОНТ_ЭЛЕМЕНТ[ колонки = ( "дата_рожд": 12.07.1965, "должность": "директор") ]])) ОТЛАДКА(кс.ДОБАВИТЬ(КОНТ_ПАРА[ ключ = "Сидоров", элем = КОНТ_ЭЛЕМЕНТ[ колонки = ( "дата_рожд": 02.11.1973, "должность": "дворник") ]])) ПЕРЕМ КОНТ_ПАРА: кп = [ ключ = "Петров" ] ОТЛАДКА(СТР(кс.НАЙТИ(кп))+ " " + СТР(кп)) ОТЛАДКА("-------------------------") ПЕРЕМ СТРОКА: к ЦИКЛ КС_КЛЮЧ(кс, к) ОТЛАДКА(СТР(к)) КОНЕЦ_ЦИКЛА ОТЛАДКА("-------------------------") ПЕРЕМ КОНТ_ЭЛЕМЕНТ: э ЦИКЛ КС_ЭЛЕМ(кс, э) ОТЛАДКА(СТР(э)) КОНЕЦ_ЦИКЛА ОТЛАДКА("-------------------------") ПЕРЕМ КОНТ_ПАРА: п ЦИКЛ КС_ПАРА(кс, п) ОТЛАДКА(СТР(п)) КОНЕЦ_ЦИКЛА КОНЕЦ