Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сборник заданий по T-Pascal.doc
Скачиваний:
65
Добавлен:
18.03.2015
Размер:
3.03 Mб
Скачать

5.3 Группы операций

Все операции над множествами подразделяются на две группы.Первая группа операций - операции сопоставления. Они близки операциям сравнения (чисел, символов, строк). Рассмотрим ряд примеров:

ИСТИННО

ЛОЖНО

[1, 3, 2] = [3, 2, 1]

[5, X] = [X, 5]

[] = []

[1, 2] <> [2]

[5, X] <> [5, X+1]

[’a’, ’k’] <= [’a’ .. ’m’]

[] <= [3]

[X, X+2] >= [X+2]

2 in [1..5]

[] in [1..5]

[1] = [3, 2, 1]

[5, X] = [5, X+1]

[] = [3]

[1, 2, 3] <> [2, 3, 1]

[5, X] <> [X, 5]

[’a’… ’e’] <= [’m’ .. ’z’]

[] >= [3]

[1..10] >= [1..20]

X in [X-1, X+1]

X in []

Вторая группа операций реализует математические действия над множествами. Рассмотрим примеры:

ДЕЙСТВИЕ

РЕЗУЛЬТАТ

[1,2,3,3,4] + [2,4,4,6,5]

[1,2,3,4,5,6] ([1..6])

[’1’, ’3’] + [’5’, ’7’]

[’1’, ’3’,’5’, ’7’]

[X] + [X+1] + [X+2]

[X..X+2]

[1,2,3,3,4] – [2,4,5,6]

[1,3]

[’1’, ’3’] – [’5’, ’7’]

[’1’, ’3’]

[X] – []

[X]

[1,2,3,3,4] * [2,4,4,6,5]

[2, 4]

[X] * []

[]

[a,b,c]*[a,b]*[a]

[a]

Пример1. Имеются три множества символьного типа, которые заданы своими конструкторами: y1=[‘a’,’b’,’r’,’m’], y2=[‘r’,’a’,’d’], y3=[‘a’,’r’].

Сформировать новое множество x=(y1*y2)+(y1-y2). Проверить включено ли множество y3 и x.

var y1,y2,y3,x:set of char;

c;char;

begin

y1:=[‘a’,’b’,’r’,’m’];

y2:=[‘r’,’a’,’d’];

y3:=[‘a’,’r’];

{формировать и печатать множества x}

x:=(y1*y2)+(y1-y2);

write(‘множество x=’);

for c:=’a’ to ‘r’ do

if c in x then write(c);

{проверка включения множества y3 в x}

if y3<=x

then write(‘y3 включено в x’)

else write(‘не включено в x’);

Пример2. Из множества целых чисел 1..20 выделить: множество чисел, делящихся на 6; множество чисел, делящихся или на 2. или на 3(деление нацело).

Const n=20;

Var n2,n3,n6,n23:set of integer;

K:integer;

begin n2:=[];n3=[];

for k:=1 to n do

begin

if k mod 2=0 then n2:=n2+[k];

if k mod 3=0 then n3:=n3+[k]

end;

n6:=n2*n3;

n23:=n2+n3;

writeln(‘на 6 делятся числа’);

for k:=1 to n do

if k in n6 then write(k);

writeln(‘на 2 или на 3 делятся’);

for k:=1 to n do

if k in n23 then write(k);

end.

Использование в программе данных типа set дает ряд преимуществ: значительно упрощаются сложные операторы if, увеличивается степень наглядности программы и понимания алгоритма решения задачи, экономятся память, время компиляции и выполнения. Помимо ряда достоинств, множества имеют и недостатки. Так множества невозможно вывести на экран. Можно лишь убедиться в наличии элемента в множестве. Ввод множеств осуществляется поэлементно.

program MN;

var C:char;

S: set of Char; begin

S:=[]; C:=#0; {обнуление значений}

writeln('Введите элементы множества через Enter.');

writeln('Для окончания введите точку');

while C<>'.' do {цикл до ввода точки}

begin readln(C); {чтение символа в С и}

S:=S+[C] {добавление его к S}

end;

S:=S-['.']; {выбросим точку}

writeln('поэлементный вывод:');

for C:=chr(1) to chr(255) do {для каждого символа}

if C in S then write(C:3); {если символ входит в множество S

напечатать его}

writeln;

end.

program MN; {Решето Эратосфена}

Const

N=255; {максимальное количество перебираемых нат. Чисел}

Var

S, {исходное множество}

Rez : Set of Byte; {результат}

Next: Byte; {рабочие переменные}

j: word;

BEGIN

{начальные присваивания}

S:=[2..N]; {все числа в заданном диапазоне}

Rez:=[]; {первоначально пустое множество}

Next:=2; {начинаем с минимального простого}

repeat

{поиск очередного простого числа}

while not(Next in S) do {ищем в S наименьшее число}

Next:=Next+1;

Rez:=Rez+[Next]; {помещаем его в Rez}

j:=Next;

while j<=N do

begin

{удаляем из S все числа, кратные Next}

S:=S-[j];

j:=j+Next

end;

until S=[]; {повторяем цикл до исчерпания S}

for j:=2 to N do {выводим на печать содержимое Rez}

if j in Rez then write(j:5)

end.