Теоретический материал (Паскаль)

Логические операции над множествами: проверка принадлежности элемента множеству, проверка включения элемента в множество, сравнение множеств

Определение. Множества считаются равными, если все элементы, содержащиеся в одном множестве, присутствуют в другом, и наоборот.

В соответствии с этим правилом определяется результат операций сравнения "=" и "<>".

Например,

If WarmSeason*Vacation=Summer
  Then
    Writeln ('Правильно');

Задание. Сравните множества М1 и М2, пользуясь рисунками.

Проверка включения

Определение. Одно множество считается входящим в другое, если все элементы первого множества содержатся во втором, при этом обратное в общем случае может быть несправедливо.

Операции проверки вхождения одного множества в другое записываются как "<=" или ">="

if S1<=S2
  then
    writeln ('S1 входит в S2');
if S1>=S2
  then
    writeln ('S2 входит в S1');

Задание. Подумайте, что напечатает оператор Write в каждом из случаев:

1.

if Vacation>=Summer
  then
    writeln ('Правильно')
  else
    writeln ('Неправильно');

2.

if Vacation<=Summer
  then
    writeln ('Правильно')
  else
    writeln ('Неправильно');

Проверка принадлежности

Операция проверки принадлежности элемента множеству записывается с использованием оператора in.

Например, выражение

May in WarmSeason

имеет значение True.

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

Например, для проверки допустимости введенного символа можно использовать следующее условие:

(Reply='y') or (Reply='Y') or (Reply='n') or (Reply='N')

Но если ввести множество

Const
  AllowSymbol : set of char = ['Y', 'y', 'N', 'n'];

проверяемое условие можно записать в более компактной форме:

Reply in AllowSymbol

Примечание. Множественный тип данных не может быть использован для определения функции.

Рассмотрите пример.

Задача. Описать множество М(1..50). Сделать его пустым. Вводя целые числа с клавиатуры, заполнить множество 10-ю элементами.

В разделе описания переменных опишем множество целых чисел от 1 до 50, переменную Х целого типа будем использовать для считывания числа-кандидата в множество, целую переменную i используем для подсчета количества введенных чисел.

В начале программы применим операцию инициализации множества М:=[ ]. Так множество в правой части оператора присваивания не имеет элементов, множество М будет пустым.

Заполнние множества организуем в цикле Repeat, параметр которого i будет указывать порядковый номер вводимого элемента. Операцию добавления элемента в множество запишем оператором присваивания М:=M+[X]. Перед добавлением элемента выполним его проверку на допустимость (0 < X < 50). При выполнении условия X in M выведем сообщение о том, что число Х уже принадлежит в множеству.

Текст программы описания и заполнения множества будет таким:

Program InputMno;
Var
  M : set of 1..50;
  X, i : integer;
Begin
  M := [ ];
  i :=1;
  repeat
    write('Введите ',i,'-й элемент множества');
    readln(X);
    if (X in M)
      then
        writeln(Х, ' уже содержится в множестве')
      else
        if (X < 1) or (X > 50)
          then
            writeln('Недопустимое значение ', Х)
          else
            begin
              writeln(Х, ' помещен в множество');
              M := M+[X];
              i := i+1;
            end;
  until i>10;
End.

Задание. Наберите рассмотренную программу, откомпилируйте ее. Проверьте работу программы, исполняя ее по шагам и наблюдая текущие значения переменных i, X, M в окне просмотра. Попробуйте задать значения числа большие 50, повторно задавать одинаковые значения Х и анализируйте значения множества М. Дополните программу выводом на экран содержимого полученного множества. Откомпилируйте программу.