Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник.docx
Скачиваний:
46
Добавлен:
21.12.2018
Размер:
2.15 Mб
Скачать

Операции над множествами

К переменным типа set применимы следующие

операции: =, <>, >=, <=, in, +, -, *.

Операции = и <> используются для проверки эквивалентности: два значения переменной типа set считаются равными, если они состоят из одних и тех же элементов.

Пример.

[1, 3] = [3, 1] возвращает true,

[1..3] = [1, 2, 3] возвращает true,

[1] <> [2] возвращает true,

[1, 2, 3] = [1, 4, 3] возвращает false,

[red, blue] = [red, yellow] возвращает false.

Операции >= и <= используются для проверки принадлежности одного множества другому: так, если множество a содержится во множестве b, то a <= b дает true.

Пример.

[1, 2] <= [1, 2, 3] дает true

Пустое множество [ ] содержится во всех множествах, т.е. всегда [ ] <= [b] дает true.

Операция in используется для установления наличия определенного элемента в величине типа set. Так, если x есть элемент множества b, то (x in b) дает true. Общий вид:

x in a;

здесь x – величина базового типа, a – величина типа set.

Пример.

red in [red, yellow] возвращает true;

red in [blue, green] возвращает false.

Замечание 1. Чтобы проверить, является ли значение n цифрой, удобно использовать операцию in следующим образом:

if n in [0..9] then …

Замечание 2. Результат операции in может быть неопределенным в некоторых случаях.

Пример. Пусть

a: set of 1..50;

x: integer.

Если заслать в x число, большее максимального значения 50 (например, x := 55), то в этом случае результат операции x in a не всегда false.

К переменным типа set, относящимся к одному и тому же конкретному типу, применимы операции:

+ объединение;

* пересечение;

- дополнение.

Пусть a и b – операнды, имеющие один и тот же конкретный тип.

Тогда

a + b представляет собой объединение множества элементов, входящих в a и b (одинаковые элементы не повторяются).

a * b – пересечение множества элементов a и b (только те, которые есть в обоих множествах).

a – b– множество элементов, которые есть в a, но отсутствуют в b.

Пример.

[1, 3] + [1, 4] = [1, 3, 4];

[1, 3] * [1, 4] = [1];

[1, 3] - [1, 4] = [3].

Операция a := a + x добавляет элемент x к множеству a. Если x уже имелся в a, то множество a не меняется. a := a – x исключает x из a. Если x отсутствовал в a, то множество a не меняется.

9.Динамические структуры данных Указатели, или ссылки (Pointer)

Когда транслятор анализирует разделы var в программе (основная ветка, функции, процедуры), он отводит для каждой переменной соответствующее число ячеек памяти и закрепляет их за данной переменной на все время работы блока. Такие переменные называют статическими. Они не могут быть использованы системой под другие нужды, даже если в процессе дальнейшей работы программы эти переменные больше не понадобятся.

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

Динамические переменные чаще реализуются как связанные структуры.

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

Подобным образом строится структура связанных данных, которые могут занимать память не подряд, а размещаться там, где есть свободное место. Каждый элемент такой структуры должен «знать», за кем он «стоит», т.е. содержать ссылку на предыдущий элемент цепочки.

Чтобы проиллюстрировать преимущества динамических переменных, продолжим аналогию с очередью пациентов.

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

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

С помощью ссылок легко вставить новую компоненту в цепочку данных. Для этого достаточно изменить две ссылки.

Новая динамическая компонента может быть размещена в любом свободном месте памяти, отведенном под такие переменные. Сама динамическая переменная не обозначается идентификатором. Динамическая переменная – это «невидимка» в программе: идентификатором она не обозначается, транслятор ей места в памяти не отводит. Память под такую переменную резервируется и освобождается динамически в процессе счета (с помощью специальных процедур).