Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
72.19 Кб
Скачать

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) сформировать множество Х=(Y1Y2) (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 - хлеб и масло. Требуется построить множества:

  1. множество А, включающее наименования продуктов, имеющихся во всех трех магазинах;

  2. множество B, включающее наименования продуктов, имеющихся по крайней мере в одном магазине;

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]