Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 95

*

Пересечение множеств

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 будет зависеть от порядка вычислений (слева направо или наоборот), устанавливаемых компилятором. Обычно принято вычислять слева направо, но лучше не закладывать так явно в программу особенности компиляторов, в том числе не искать «многоместных» разностей. Их лучше вычислять через промежуточные переменные.