Шаг 48.
Основные операции над множествами

    Здесь мы перечислим основные операции над множествами.

    1. Объединением двух данных множеств называется множество элементов, принадлежащих хотя бы одному из этих множеств. Знак операции объединения - "+".


Рис.1. Объединение двух множеств

    Приведем примеры объединения множеств.

Дано
Результат
[1,2,3]+[4,5]
[1,2,3,4,5]
['A','F']+['B','D']
['A','F','B','D']
[1..3,5]+[3..8,10]
[1..8,10]
['a'..'z']+ ['A']
['A','a'..'z']
[1..5,8]+[3,9]
[1..5,8,9]

    2. Пересечением двух множеств называется множество элементов, принадлежащих одновременно и первому, и второму множеству. Знак операции пересечения множеств - "*".


Рис.2. Пересечение двух множеств

    Приведем примеры объединения множеств.

Дано
Результат
[1,2,3]*[4,5]
[ ]
[1..5,9]*[3..7,12]
[3..5]
[1..3,5]*[3..8,10]
[3,5]
[1..5,8]*[3,9]
[3]

    3. Разностью двух множеств называется множество, состоящее из тех элементов первого множества, которые не являются элементами второго. Знак операции вычитания множеств следующий: "-".


Рис.3. Разность двух множеств

    Приведем примеры вычитания множеств.

Дано
Результат
[1,2,3]-[4,5]
[1,2,3]
[A','F']-['B','D']
['A','F']
[1..3,5]-[1..3,5]
[ ]
[1..5,8]-[3,9]
[1,2,4,5,8]
['A'..'Z']-['A']
['B'..'Z']

    4. Операция определения принадлежности элемента множеству. Ее общий вид следующий:


Рис.4. Операция проверки принадлежности элемента множеству

    Эта логическая операция обозначается служебным словом in. Результат операции имеет значение True (истина), если элемент входит в множество, и False (ложь) в противном случае.

    Приведем примеры.

Дано
Результат
5 in [3..7]
True
'a' in ['A','F']
False
2 in [1,2,5]
True
'B' in ['a'..'z']
False
'D' in ['A'..'Z']
True

    Эту операцию удобно применять в случае множественной проверки. Например, вместо такого "длинного" оператора: If (ch='d') or (ch='D') or (ch='Д') or (ch='д') then <действие>; можно записать его "более короткий" аналог: If ch in ['d','D','Д','д'] then <действие>;.

    5. Сравнение множеств. Для сравнения множеств используют следующие операции:
Таблица 1. Операции сравнения множеств
Операция
Значение
=
Проверка на равенство (совпадение) двух множеств.
<>
Проверка на неравенство двух множеств.
<= и <
Проверка на вхождение первого множества во второе.
>= и >
Проверка на вхождение второго множества в первое множество.

    Приведем примеры.

Дано
Результат
[1,2,3]=[1,2]
False
[1,2,3]>=[1,2]
True
[S]<=[1..10]
True, если S - целое число из диапазона 1..10. В противном случае - False.
[1,2,3]<>[1,2,2]
True

    В заключение приведем пример программы выделения следующих множеств из множества чисел от 1 до 20:

Вот текст программы, реализующей данную задачу:

Program Videlenie;
Type
   N=Set Of 1..20; {Описание множества целых чисел от 1 до 20.}
Var
   N2:N; {Множество чисел, кратных 2.}
   N3:N; {Множество чисел, кратных 3.}
   N6:N; {Множество чисел, кратных 6.}
   N23:N;{Множество чисел, кратных 2 или 3.}
   i:Integer;
Procedure Print (M:N);
{Процедура вывода элементов полученных множеств.   }
{Входной параметр - переменная типа множество целых}
{чисел от 1 до 20. }
Var
   j:Integer;
Begin
   Write('[ ');
   For j:=1 To 20 Do
     If j in M Then Write (j:3);
   Writeln(' ]');
End;
Begin
   N2:=[]; {Начальные значения множеств.}
   N3:=[];
   For i:=1 To 20 Do  {Формирование множеств N2 и N3.} 
    Begin
     {Если число делится на 2, то заносим его в N2.}
     If i mod 2=0 Then N2:=N2+[i];
     {Если число делится на 3, то заносим его в N3.}
     If i mod 3=0 Then N3:=N3+[i];
    End;
   N6:=N2*N3; {Пересечение множеств.}
   N23:=N2+N3; {Объединение множеств.}
   {Вывод полученных множеств.}
   WriteLn('Числа, кратные двум: ');
   Print(N2);
   WriteLn('Числа, кратные трем: ');
   Print(N3);
   WriteLn('Числа, кратные шести: ');
   Print(N6);
   WriteLn('Числа, кратные двум или трем: ');
   Print(N23);
End.
Текст этой программы можно взять здесь.

    Обратите внимание, что переменной типа "множество" нельзя присвоить значение напрямую с клавиатуры, как это возможно, например, с переменной целого типа. Также нельзя стандартным образом вывести значение переменной типа "множество", например, на экран. Все эти особенности отражены в тексте приведенной программы.


Конструкция N2:=N2+[i]; добавляет значение переменной i во множество N2. Однако что произойдет, если значение переменной i выйдет из промежутка от 0 до 255? Например, какое значение будет находиться во множестве N2 при выполнении следующего фрагмента программы:


   .    .    .    .
   N2:=[];
   i:=300;
   N2:=N2+[i];
   .    .    .    .
Ответ и комментарии вы можете посмотреть здесь.



    На следующем шаге мы приведем несколько задач, иллюстрирующих применение множеств.


Предыдущий шаг Содержание Следующий шаг