Песни о Паскале | страница 145




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

В Паскале предусмотрены три известные вам вычислительные операции с множествами, а также сравнение множеств и проверка на вхождение элемента в множество.

Вычислительные операции – объединение, пересечение и вычитание – записывают на Паскале так:


>      SN2:= [3, 7] + [5, 2];       { объединение = [2, 3, 5, 7] }

>      SN2:= [2..10] * [8..20]; { пересечение = [8, 9, 10] }

>      SN2:= [2..10] – [8..20]; { разность = [2..7] }


Множества, объединенные знаками операций и круглыми скобками, образуют выражение, например:


>      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 …


Проверка на вхождение элемента в множество (операция IN)

Входит ли некоторый элемент в множество? Это можно выяснить так:


>var N : byte; S : set of byte;

>      ...

>      if ([N] * S) <> [] then { N входит в S } else { не входит }


Понятно, что, если число N входит в множество S, то пересечение [N]*S не будет пустым. Но проще выяснить это операцией IN – она введена специально для этого. Операция дает TRUE, если значение перечислимого типа входит в данное множество, например:


>      if N in S then { N входит в S } else { не входит }

>      if 20 in S then { 20 входит в S } else { не входит }


Решение директорской задачи

Вернемся к временно покинутому директору Семену Семеновичу. Напомню стоящую перед нами задачу: есть текстовый файл, каждая строка которого содержит список номеров учеников, состоящих в некотором кружке.