2.3. Операции над множествами
Паскаль предусматривает ряд операций, специально предназначенных для работ с множествами. Операции над множествами разделяются на операции, создающие производные множества, и операции сопоставления множеств (сравнение множеств и проверка принадлежности множеству). В операциях над множествами могут участвовать только те множества, которые построены на одном базовом типе (т.е. сопоставимые).
Операции, создающие производные множества.
Объявим и сконструируем множества:
. . . . . .
type MN1 = set of char; MN2 = set of byte;
var
N1,N2,N3,N4 : MN2; C1,C2,C3,C4 : MN1;
begin
N1:= [1,2,3,4,5]; N2:= [2..6];
C1:= ['0'..'7']; C2:= ['2', '>', 'K'..'S'];
. . . . . . .
1. Объединение двух множеств А и B (записываемое как A+B) есть новое множество, состоящее из элементов, принадлежащих или множеству А, или множеству В, или тому и другому одновременно. Например, используя ранее сконструированные множества N1, N2, C1, C2, создаем множества:
. . . . . . . . .
N3:=N1+N2; N4:=N1+[10..12, 3..8];
C3:= C1+['2'..'9']; C4:= ['A'..'L'] + C2 + ['B','M','X'];
. . . . . . . . . .
В результате выполнения операторов получим множества:
N3=(1, 2, ..., 6), N4=(1, 2, ..., 8, 10, 11, 12), С3=('0', '1',..., '9'), C4=('2','>', 'A','B',...,'S','X').
2. Пересечение двух множеств А и B (записываемое как A*B) есть новое множество, состоящее из элементов, принадлежащих как множеству А4, так и множеству В. Создадим множества N3, N4, C3, C4, используя ранее сконструированные множества N1, N2, C1, C2:
. . . . . . . . . . . .
N3:= N1 * N2; N4:= N2 * [3..9] * [7, 8, 9];
C3:= C1 * C2; C4:= C2 * ['K', 'L', 'M', 'N'] * ['A'..'Z'];
. . . . . . . . . . . .
В результате выполнения операторов получим множества:
N3=(2, 3, 4, 5), N4 - пустое множество, С3=('2'), C4=('K', 'L', 'M', 'N').
3. Разность двух множеств А и B ( записываемая как A-B ) есть новое множество, состоящее из элементов, принадлежащих множеству А и не принадлежащих множеству В. Создадим множества N3, N4, C3, C4, используя ранее сконструированные множества N1, N2, C1, C2:
. . . . . . . . . . . .
N3:= N1 - N2;
N4:= N2 - N1;
C3:= C1 - C2;
C4:= C2 - ['K', 'L', 'M', 'N'] - ['R'..'Z'];
. . . . . . . . . . . .
В результате выполнения операторов получим множества: N3=(1), N4=(5, 6), С3=('0', '1', '3', ..., '7'), C4=('2', '>', 'O', 'P',’Q’).
Сравнение множеств. Проверка принадлежности множеству.
Сравнение множеств предполагает проверку следующих ситуаций: равны множества или нет; является ли одно множество подмножеством другого или нет.
1. Множество А равно множеству В (записывается как А=В) тогда и только тогда, когда каждый элемент множества А является элементом множества В и наоборот.
2. Множество А не равно множеству В (записывается как А<>В), если не каждый элемент множества А является элементом множества В или наоборот.
3. Множество А есть подмножество множества В (записывается как А<=В) тогда и только тогда, когда каждый элемент множества А является элементом множества В. В этом случае говорят, что множество А входит во множество В.
4. Множество В есть подмножество множества А (записывается как А>=В) тогда и только тогда, когда каждый элемент множества В является элементом множества А. В этом случае говорят, что множество А содержит множество В.
Операции сравнения множеств - двуместные. Результат операции будет логического типа : TRUE, если условие выполняется, и FALSE в противном случае.
Проверка принадлежности элемента множеству выполняется с помощью операции in. Пусть элемент S и множество А имеют одинаковый базовый тип. Тогда операция S in A проверяет, принадлежит ли элемент S множеству А; если да, то результат операции TRUE, иначе - FALSE.
В Паскале принят следующий приоритет операций, выполняемых над множествами : *, +, -, =, <>, >=, <=, in.
Для изменения порядка выполнения операций используются круглые скобки.
Пример. Объявим и сконструируем множества:
. . . . . . . .
type
MN = set of byte;
var
A, B, C, D, E, F: MN;
begin
A:= [1,2,3,4,5]; B:= [2..6]; C:= [1..4]; D:= [1..6,10,12];
E:= [4, 1, 2, 3]; F:=[];
. . . . . . .
Над заданными множествами выполним операции, в скобках указан результат операции:
A=B (FALSE), A=C (FALSE), C=E (TRUE), A<>E (TRUE),
B<>C (TRUE), A<=B (FALSE), A<=D (TRUE), C>=D (FALSE),
D>=C (TRUE), not (5 in C) (TRUE), succ(4) in E (FALSE),
F>=C (FALSE), trunc(4.9) in A (TRUE).
Пример 1. Даны три множества символьного типа:
Y1 = ( A,B,D,H,R), Y2 = ( D,H,K), Y3 = ( A,R ).
Требуется:
1) сформировать множество Х=(Y1Y2) (Y2\Y1);
2) вывести множество Х на печать;
3) проверить, включено ли множество Y3 во множество Х.
program MNOG_1;
type mnog = set of char;
var Y1,Y2,Y3, X : mnog;
c : char;
begin
Y1 = ['A','B','D','H','R'];
Y2 = ['D','H','K']; Y3 = ['A','R'];
{ Формирование и печать множества Х }
X := (Y1*Y2) + (Y2-Y1);
Write('Множество Х={');
for c := 'A’ to 'R' do
if c in X then Write(c:3);
Writeln(});
{ Проверка включения множества Y3 во множество Х }
if Y3 <= X then Writeln('Y3 включено в Х’)
else Writeln('Y3 не включено в Х’);
end.
В результате исполнения программы получим:
Множество Х = ( D H K )
Y3 не включено в Х.
Пример 2. Дана строка 5A7233111BGE2257CDE. Признаком конца строки является точка. Определить количество цифр в строке и напечатать их, причем повторяющиеся цифры печатать один раз.
program KOL_ZIFR;
type mnog = set of byte;
var z : mnog; ch : char; k,n,i : integer;
begin
n:= 0; z:=[];
Writeln(' Введите строку '); Read(ch);
while ch<> '.' do
begin
k:= ord(ch) - ord('0');
if k in [0..9] then begin n:= n + 1; z:=z + [k] end;
Read(ch)
end;
Writeln('Количество цифр в данной строке - ', n);
Write('Цифры, встречающиеся в данной строке: ');
for i:= 1 to 9 do
if i in z then Write(i:3);
end.
В результате исполнения программы получим:
Количество цифр в данной строке - 12
Цифры, встречающиеся в данной строке: 1 2 3 5 7
Замечание. При составлении программы учитывались следующие соображения: функция ord(ch) имеет результатом код символа ch; согласно кодам ASCII ord('0')=48, ord('1')=49, ..., ord('9')=57; таким образом, если ch - цифра, то переменная k=ord(ch)-ord('0') может принимать значения 0, 1, 2, .., 9.
Пример 3. Ассортимент товаров включает: хлеб, молоко,сыр, масло. В магазины NN 1, 2, 3 были доставлены следующие виды продуктов: в магазин N1 - хлеб; в магазин N2 - хлеб, молоко, масло; в магазин N3 - хлеб и масло. Требуется построить множества:
множество А, включающее наименования продуктов, имеющихся во всех трех магазинах;
множество B, включающее наименования продуктов, имеющихся по крайней мере в одном магазине;
множество С, включающее наименования продуктов, которых нет ни в одном магазине.
program MNOG_3;
type PROD = (xleb, moloko, cir, maslo);
ASSORT = set of PROD;
var M1, M2, M3, A, B, C: ASSORT;
i: integer;
procedure PRASSORT (var M: ASSORT);
var j: PROD;
begin for j:= xleb to maslo do
if j in M then
case j of
xleb: Write(' хлеб ');
moloko: Write(' молоко ');
cir: Write(' сыр ');
maslo: Write(' масло ')
end
end;
begin C:= [xleb..maslo]; M1:= [xleb];
M2:= [xleb, moloko, maslo]; M3:= [xleb, maslo];
A:= M1*M2*M3; B:= M1+M2+M3; C:= C - B;
Writeln;
for i:=1 to 3 do
case i of
1: begin Writeln;
Write('Продукты, имеющиеся в');
Writeln(' каждом из трех магазинов (мн-во А):');
PRASSORT(A)
end;
2: begin Writeln;
Writeln('Продукты, имеющиеся хотя бы в');
Writeln(' одном из трех магазинов (мн-во В):');
PRASSORT(B)
end;
3: begin Writeln;
Write('Продукты, которых нет ни в');
Writeln(' одном магазине (мн-во С):');
PRASSORT(C)
end
end
end.
В результате исполнения программы получим:
Продукты, имеющиеся в каждом из трех магазинов (мн-во А):
хлеб
Продукты, имеющиеся хотя бы в
одном из трех магазинов (мн-во В):
хлеб молоко масло
Продукты, которых нет ни в одном магазине (мн-во С):
сыр
Пример 4. Дано N целых чисел (N<=10) от 1 до 50. Определить, сколько среди них чисел Фибоначчи.
Замечание. Числа Фибоначчи будем находить по следующему алгоритму: F0=1, F1=1, F2=F0+F1, F3=F1+F2, F4=F2+F3, ...
program FIBONACHI;
uses crt;
type fib=set of 1..50;
var f: fib;
f0,f1,f2,f3: integer;
N: integer; {кол-во введенных чисел}
x: integer; {вводимые числа}
k: integer; {кол-во чисел Фибоначчи среди N чисел}
i: integer; {параметр цикла}
begin clrscr;
{ 1-ый блок: создаем множество чисел Фибоначчи }
{ верхняя граница множества - 50 }
f0:=1; f1:=1; f2:=2; f:=[f1]+[f2]; k:=0;
{т.е. множество f уже содержит два элемента: f=[1, 2]}
while f2<=50 do
begin f3:=f1+f2; f:=f+[f3]; f1:=f2; f2:=f3
end;
Writeln('Введите N');
Readln(N);
Writeln('Введите ',N,' чисел');
for i:=1 to N do
begin Write(i,'-е число '); Read(x);
if x in f then begin k:=k+1; Writeln('':12,'- число Фибоначчи')
еnd
end;
Write('Всего чисел Фибоначчи - ',k);
end.
В результате исполнения программы получим:
Введите N
6
Введите 6 чисел
1-е число 2
- число Фибоначчи
2-е число 7
3-е число 5
- число Фибоначчи
4-е число 13
- число Фибоначчи
5-е число 34
- число Фибоначчи
6-е число 45
Всего чисел Фибоначчи – 4
