Множества, объединенные знаками операций и круглыми скобками, образуют выражение, например:
SN2:= (SN1 + [0..15]) * SN2;
Выражения, составленные из множеств, очень похожи на выражения из чисел, но вычисляются по другим правилам. Это обманчивое сходство может спровоцировать ошибку – смешение в одном выражении чисел и множеств. Предположим, вы хотите добавить к множеству число, содержащееся в переменной K. Следующее выражение будет неверным.
SN1:= SN1 + K; { сложение множества с числом – ошибка }
Правильно будет так:
SN1:= SN1 + [ K ]; { добавляется множество из одного элемента }
Разумеется, за ошибками такого рода присматривает компилятор, проверьте его реакцию на практике.
Множества можно сравнивать между собой, получая в результате булево значение – TRUE или FALSE.
Два множества равны, если содержат одни и те же элементы.
if SN1 = SN2 then … else …
Множества неравны, если одно из них содержит, хотя бы один элемент, которого нет в другом.
if SN1 <> [15, 17, 19] then … else …
Проверка на подмножество (<=) отвечает на вопрос: все ли элементы первого множества входят во второе?
if SN1 <= SN2 then … else …
Проверкой на надмножество (>=) выясняют, все ли элементы второго множества входят в первое.
if SN1 >= SN2 then … else …
Входит ли некоторый элемент в множество? Это можно выяснить так:
var N : byte; S : set of byte;
...
if ([N] * S) <> [] then { N входит в S } else { не входит }
Понятно, что, если число N входит в множество S, то пересечение [N]*S не будет пустым. Но проще выяснить это операцией IN – она введена специально для этого. Операция дает TRUE, если значение перечислимого типа входит в данное множество, например:
if
if
Вернемся к временно покинутому директору Семену Семеновичу. Напомню стоящую перед нами задачу: есть текстовый файл, каждая строка которого содержит список номеров учеников, состоящих в некотором кружке.