logo
Дискретная математика / ДМиМЛ-1 часть

1.6. Использование множеств в языке Паскаль

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

Type имя=set of базовый_тип;

Пример.

Пусть в нашем распоряжении имеется множество монет различного достоинства: 1р, 5р и 10р. Из этих монет можно составить следующее подмножества (их число равно 23=8):

1р; 5р; 10р; 1р, 5р; 1р, 10р; 5р, 10р; 1р, 5р, 10р; пустое множество.

Эти подмножества и будут принадлежать некоторому множеству sum. Сами элементы (монеты), из которых состоит подмножество, пусть принадлежат некоторому базовому типу monet. Тогда описание будет иметь вид:

Type monet=(r1,r5,r10);

Var sum:set of monet;

В программе значение переменной типа «множество» изображается путем перечисления конкретных компонентов подмножества, разделенных запятыми и заключенных в скобки [ ]. Такие изображения называются конструкторами множеств. Например: [r1], [r1,r10].

С переменной типа set допустимы следующие операции: =, <>, >=, <=, In, +, – , *, :=.

Пример использования операции присваивания:

Type n=1..9;

Var k:set of n;

. . . . . . . .

k:=[3..6];

В этом случае в ячейку k будет записана комбинация [3,4,5,6].

Операции = и <> используются для проверки эквивалентности: два значения переменной типа set считаются равными, если они состоят из одних и тех же элементов.

Пример.

[1,3]=[3,1] – дает True;

[1..3]=[1,2,3] – дает True;

[1]<>[2] – дает True;

[1,2,3]=[1,4,3] – дает False.

Операции >= и <= используются для проверки принадлежности одного множества другому: так, если множество а содержится в множестве b, то а<=b дает True. Например: [1,2]<=[1,2,3] дает True.

Операция In используется для установления наличия определенного элемента в множестве. Так, если x есть элемент множества b, то (x In b) дает True.

Пример: [3]In [1,2,3] дает True.

Если a и b – операнды, имеющие один и тот же конкретный тип, то к ним применимы операции:

+ объединение;

– дополнение;

* пересечение.

Так, a+b представляет собой объединение множества элементов, входящих в a или в b (одинаковые элементы не повторяются); a–b – это множество элементов, которые есть в a, но отсутствуют в b; a*b представляет собой объединение множества элементов, входящих в множества a и b одновременно.

Пример.

[1,3]+[1,4] – дает [1,3,4];

[1,3]–[1,4] – дает [3];

[1,3]*[1,4] – дает [1].

Операция a:=a+x добавляет элемент x к множеству a, а операция a:=a–x исключает x из a.

Рассмотрим несколько примеров решения задач на Паскале, использующих множества [3].

З а д а ч а 1. Задать множество целых чисел от заданного числа до числа в три раза большего, чем заданное.

Решение. Используем описание множеств на языке Паскаль и операторы для работы с множествами.

Если количество элементов n в множестве известно заранее, то задача решается так:

const n=50;

type setnum=set of byte;

const mn:setnum=[n..3*n];

{В тексте программы остается использовать созданное множество}.

Если начальное значение задается пользователем, то задача решается так:

type setnum=set of byte;

var mn:setnum;

n,i:byte;

begin write('задайте первый элемент множества ');

readln(n);

if 3*n<256 then for i:=n to 3*n do mn:=mn+[i]

else write('заданное количество элементов не поместится в множестве ');

end.

З а д а ч а 2. Вывести на экран элементы множества, содержащего прописные и строчные буквы латинского алфавита.

Решение. В цикле проверим вхождение всех элементов базового типа и выведем те, которые входят в множество.

var zn:set of 'A'..'z';

i:char;

begin for i:='A' to 'Z' do

if i in zn then write(i,' ');

for i:='a' to 'z' do

if i in zn then write(i,' ');

end.

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

Решение.

type setchar=set of char;

const GL:setchar=['п','ф','к','т','ш','с','х','ц','ч',

'щ'];{множество глухих согласных}

ZV:setchar=['л','м','н','р','й','б','в','г','д','ж',

'з']; {множество звонких согласных}

ALF:string='абвгдеёжзийклмнопрстуфхцчшщъыьэюя';

{строка – русский алфавит}

var s:string; {заданное русское слово}

i:integer; {номер обрабатываемого символа в слове}

mgl:setchar; {множество глухих согласных}

mzv:setchar; {множество звонких согласных}

buk:setchar; {множество всех букв слова}

sog:setchar; {множество согласных слова}

gla:setchar; {множество гласных слова}

procedure print(s:string;mn:setchar);

{процедура вывода элементов множества с предшествующим комментарием}

var i:integer;

begin write(s,' ');

for i:=1 to length(ALF) do

if ALF[i] in mn then write(ALF[i],' ');

writeln;

end;

begin write('Введите русское слово ');

readln(s);

mgl:=[]; mzv:=[]; buk:=[];

{вначале множества букв пусты}

for i:=1 to length(s) do

begin buk:=buk+[s[i]]; {объединили букву с множеством букв}

if s[i] in GL

then mgl:=mgl+[s[i]]

{объединили глухую согласную с множеством глухих согласных}

else if s[i] in ZV

then mzv:=mzv+[s[i]];

{объединили звонкую согласную с множеством

звонких согласных}

end;

{находим множество согласных букв}

sog:=mgl+mzv;

{находим множество гласных букв}

gla:=buk-(sog+['ь','ъ']);

print('слово состоит из букв; ',buk);

print('гласные буквы: ',gla);

print('согласные буквы: ',sog);

print('глухие согласные: ',mgl);

print('звонкие согласные; ',mzv);

end.

З а д а ч а 4. Написать программу для нахождения простых чисел с помощью «решета Эратосфена».

Решение.

1. Поместим все числа между 2 и n (n<=255) в решето.

2. Выберем из решета наименьшее из чисел.

3. Поместим это число среди простых.

4. Переберем и вынем из решета все числа, кратные данному.

5. Если решето не пустое, то повторим шаги 2–5.

const n=255; {количество элементов в множестве}

var interval, {решето}

prost:setof2..n; {множество простых чисел}

next:integer; {наименьшее число в решете}

c:integer; {новое простое число}

j:integer; {переменная для удаления из решета чисел,кратных текущему простому числу}

begininterval:=[2..n];

prost:= [];

next:= 2;

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

while not (next in interval) do next:=succ(next);

prost:=prost+[next];

c:=2*next–1;

j:=next;

while j<=n do

begin interval:=interval–[j]; j:=j=c; end;

until interval=[];

end.