Множества неравны, если одно из них содержит, хотя бы один элемент, которого нет в другом.

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 { не входит }

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

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

2 11 4 13

9 17 12 11 3 5 18

14 2 13 15 20

Надо составить список нигде не числящихся разгильдяев.

Можно ли воспринимать эти списки как множества? Вероятно, да, судите сами:

• каждый список содержит номер ученика не более одного раза (ошибочные повторные записи все равно отбросят);

• порядок следования в списке не важен;

• список может быть пустым (если никто не записался в этот кружок).

Хорошо, а будет ли множеством список всех учеников школы? Конечно. Такое множество будет полным, поскольку содержит все возможные элементы. А раз так, директорскую задачку решим через множества.

Множество тех, кто записался хотя бы в один кружок, найдем объединением отдельных множеств-кружков (S1 + S2 + S3). Вычтя это объединение из полного множества учеников, получим множество уклонившихся. Вот и все решение! На Паскале это запишется так:

var R, S1, S2, S3 : set of 1..250;

begin

      S1:= [ 2, 11, 4, 13 ];       { 1-й кружок }

      S2:= [ 9, 17, 12, 11, 3, 5, 18 ]; { 2-й кружок }

      S3:= [ 14, 2, 13, 15, 20 ];       { 3-й кружок }

      R:= [1..250] – (S1 + S2 + S3); { R – множество уклонившихся }

end.

Выделеное выражение в скобках – это множество учеников, состоящих хотя бы в одном кружке. Итак, решение задачи вместилось в одну строчку! Нет, не зря мы терпели математика и корпели над множествами!

Показанное выше решение – это работающая программа, которую можно запустить в пошаговом режиме, и через отладчик увидеть результат. Сделайте это. А как быть с вводом и выводом множеств? Ведь исходные данные хранятся в файле, а результат – переменную R – тоже надо вывести в файл или на экран. Вот этим мы и займемся в следующей главе.

Итоги

• Множества – это инструмент, взятый в Паскаль из математики.

• В Паскале применяют конечные множества, элементами которых могут быть числа, символы и булевы значения. Мощность множеств в Паскале не превышает 256.

• В Паскале предусмотрен ряд операций с множествами: объединение, пересечение, вычитание, сравнение, а также проверка на вхождение элемента в множество.

• Сравнение двух множеств дает булев результат, который используют в условных и циклических операторах.

• Операция IN – удобное средство для проверки вхождения одного элемента в множество, она тоже дает булев результат.

А слабо?

А) Найдите ошибки в следующих операторах.

type TNumbers = set of 1..300;

      TChars = set of char;

      TBytes = set of byte;

var c1, c2 : TChars;

      b1, b2 : TBytes;

begin

      c1:= [1..9];

      c2:= ['1'..'9'];

      c2:= c2 + ’0’;

      c2:= c2 + [0];

      b1:= c1;

      b2:= b1 + [1,7,3];

      Writeln(b1=b2);

      Writeln(1 in b2);

      Writeln([1] in b2);

      Writeln(b1 in b2);

end.

Б) Напечатайте 20 случайных чисел в диапазоне от 1 до 50 так, чтобы каждое число встретилось в распечатке лишь по разу. Подсказка: после генерации числа функцией Random проверьте его на вхождение в множество уже напечатанных чисел.

Перейти на страницу:

Похожие книги