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

Над переменными множественного типа могут выполняться те же операции, что и над обычными множествами: объединение (+), пересечение (*), разность (-). Кроме того, определены операции проверки принадлежности элемента множеству (in), проверки тождественности множеств (=), нетождественности множеств (<>), определения принадлежности (вложенности) множеств (>= или <=).

Примеры:

Значение А Значение В Выражение Результат
[1,2.4] [1,4,2] А=В true
['a'..'z'] ['а'..'р'] А=В false
[1,2,5,6] [1,2] А<>В true
['а','b','с'] ['a'..'z'] А<=В true
['a'..'k'] ['a'..'z'] А>=В false
[1,2,3] [1,4, 5] А+В [1,2,3,4, 5]
[1,2, 3] [1,3,4,5] А*В [1,3]
[1,3,4, 5] [1.4, 6] А-В [3,5]

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

a in [а, b, с, d] - результат true

2*4 in [0..4, 7.. 10] - результат true

1+4 in [1, 2, 4, 5] - результат true

3 in [ 1+2, 4, 5] - результат true

5 in [2, 4,6, 8] - результат false

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

Операция in позволяет проводить эффективно сложные про верки условий. Например, вместо

(с >= `0`) and (с <= `9`)or (с >= `A`) and (с <= `Z`)

проще записать

с in [`0`..`9` `A`..`Z`],

причем последняя конструкция будет, как правило, более эффективной.

Операции (=) и (<>) позволяют проверить, равны ли два множества или нет. С помощью операции (>=) и (<=) можно определить, является ли одно множество подмножеством другого.

Примеры:

[red, white] = [red, green] - результат false;

[1] <= [0..4] - результат true.

Замечание 1. Пустое множество [ ] является подмножеством любого другого множества независимо от базового типа его элементов.

Замечание 2. Множества-операнды могут иметь непересекающиеся базовые типы. Располагая, например, множествами А: set of 1..99 и В: set of 100..150, можно в результате объединения А+В получить новое множество с базовым типом 1..150.

Замечание 3. Следует различать конструктор множества [X..Y] и отрезок порядкового типа X..Y. При X>Y в первом случае речь идет о пустом множестве, а во втором компилятор Турбо-Паскаля зафиксирует ошибку.

При проверке на подмножество выполняется тест на «меньше или равно», а не только проверка на собственное подмножество, т.е. без «равно». Операции (<) и (>) в Турбо-Паскале не предусмотрены, поэтому при необходимости проверку на собственное подмножество для множеств А и В можно провести следующим образом:

(А<=В) and (А<>В) или (A>=В) and (А<>В)

Для задания правильного выполнения порядка операций следует учитывать принятый в Турбо-Паскале порядок старшинства (приоритета) операций над множествами: пересечение (*) имеет тот же приоритет, что и арифметические операции умножения и деления; объединение(+) и разность () занимают следующий, более низкий уровень приоритета, аналогично арифметическим операциям сложения и вычитания: на самом нижнем уровне находятся

операции сравнения множеств (=, <>, <=, >=) и проверки принадлежности элемента множеству (in). Операции одного приоритета выполняются слева направо. Для изменения порядка выполнения операций используются круглые скобки.

Расширить возможности работы с множествами можно с помощью массивов множеств. Множество может быть элементом массива или записи.

Для добавления или исключения элемента из множества используются операции объединения и вычитания множеств, например, если s — множество с базовым типом byte, то можно за­писать

s:=s+[5]; s:=s-[2];

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

Procedure Include {var S: set of T; Elem: T);

procedure Exclude {var S: set of T; Elem:T);

где T — базовый тип множества. Вызовы этих процедур на машинном уровне соответствуют одной команде.

Правила для операций с множествами можно записать в форме:

Уровень приоритета Операция Тип операндов Результат
  * множество множество
  + множество множество
  множество множество
  = множество boolean
  <> множество boolean
  >= множество boolean
  <= множество boolean
  In слева: выражение; справа: множество; boolean

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: