|
* | Пересечение множеств | S1*S2 | Результатом пересечения будет множеств множество, состоящее только из тех элементов S1 и S2, которые содержатся одновременно и в S1, и в S2 |
Как видно, операции над множествами разделяются на операции сопоставления множеств и операции, создающие производные множества. И те, и другие будут работать лишь в том случае, когда их операнды сопоставимы. Это означает, что в операциях могут участвовать только те множества, которые построены на одном базовом типе (так, несопоставимы множества значений типа Char и типа Byte).
Операции сопоставления всегда двухместные. Результатом операции сопоставления будет логическое значение True или False. В этом смысле они близки операциям сравнения. Рассмотрим некоторые примеры сопоставлений (в них X — обозначение переменной базового типа множества, a S — обозначение некоего непустого сопоставимого множества) (рис. 7.2).
Операция проверки вхождения в множество in бывает очень полезна при проверке попадания в диапазоны перечислимых типов:
if Ch in ['а', 'х', 'А', 'Х'] then ...
if J in [ 100..200 ] then ...
В подобных конструкциях можно указывать множество-константу
- 146 -
ИСТИННО | ЛОЖНО |
[ 1, 2, 3] = [ 1, 3, 2] [ 5, X ] = [ X, 5 ] [] = [] [ 1, 2 ] <> [ 1 ] [ 5, X ] <> [ 5, Х+1 ] ['a','b'] <= [ 'a'..'z' ] [] >= S [X, Х+1] >= [ Х+1 ] 5 in [0..5] [] in [0..5] | [ 1, 2 ] = [1] [ 5, X ] = 5, Х+1 ] [] = [1] [ 1, 2, 3] <> [1, 3, 2] [ 5, X ] <> X, 5 ] ['0'..'9']<=[a]…[z] []>=S [1..3]>=[0..4] X in [X-1, X-2] X in [] |
Рис. 7.2
справа от оператора in, не вводя промежуточных описаний переменных-множеств .
Вторая группа операций над множествами реализует математические действия над ними: объединение (сумма), разность (дополнение) и пересечение множеств. Результатом операций всегда будет множество. В табл. 7.2 указаны два множества в записи, но их может быть и больше. Некоторые примеры операций приведены на рис. 7.3. Операции объединения и пересечения не зависят от мест операндов, но
[1, 2, 3, 4, 4 ] + [ 3, 4, 4, 5, 6] даст [1, 2, 3, 4, 5, 6] ([1..6])
[ '1', '2' ] + [ '8', '9' ] даст [ '1', '2', '8', '9' ]
[ X ] + [] даст [X]
[ X ] + [ Х+1 ] + [ Х+2 ] даст [ X .. Х+2 ]
[ 1, 2, 3, 4, 4] - [3, 4, 4, 5, 6] даст [ 1, 2 ]
[ '1', '2' ] - ['8', '9'] даст [ '1', '2' ]
[ X ]-[] даст [ X ]
[] - [ X ] даст []
[ 1, 2, 3, 4, 4 ] * [3, 4, 4, 5, 6] даст [ 3, 4 ]
[ '1', '2'] * [ '8', '9' ] даст []
[ X ] * [] даст []
[ A ] * [ A, B ] * [ A, B, С ] даст [ А ]
Рис. 7.3
- 147 -
результат операции дополнения чувствителен к порядку следования, и S1-S2 не будет в общем случае равно S2-S1. Поэтому результат выражений типа S1-S2-S3 будет зависеть от порядка вычислений (слева направо или наоборот), устанавливаемых компилятором. Обычно принято вычислять слева направо, но лучше не закладывать так явно в программу особенности компиляторов, в том числе не искать «многоместных» разностей. Их лучше вычислять через промежуточные переменные.