Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 основи програмування книга.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

12. Множини

12.1. Множинний тип

Ще одним складним стандартним типом даних, визначеним у мові Pascal, є множинний тип. Значенням множинного типу даних є множина, що складається з однотипних елементів. Тип елемента множини називається базовим типом. Базовим типом може бути скалярний або обмежений тип. Таким чином, множина значень множинного типу – це множина всіх підмножин базового типу, враховуючи і порожню множину. Якщо базовий тип містить N елементів, відповідний множинний тип буде містити 2N елементів.

Характерна відміна множинного типу – визначення на ньому найбільш поширених теоретико-множинних операцій і відношень. Це робить множинний тип схожим на прості типи даних. Множинні типи описуються в розділі типів наступним чином:

Type < ім’я типу > = Set of < базовий тип >

Множинний

тип

Наприклад,

а) Type

Beta = Set of 100..200;

б) Type

Glas = Set of char ; {Vowel}

в) Type

Color = (red, orange, yellow, green, light_blue, blue, violet);

Paint = Set of Color;

г) Type

TwoDigNum = Set of 10..99;

Var A, B: Beta;

llet, flet: Glas;

last, first: Paint;

Sinit: TwoDigNum;

12.2. Конструктор множини

Множини будуються з своїх елементів за допомогою конструктора множин. Конструктор представляє собою перелік через кому елементів множини або відрізків базового типу, взятий у дужки [ , ]. Порожня множина позначається через [ ].

к онструктор

Елемент

конструктора

Наприклад:

[ ] - порожня множина

[2, 5 ..7] - множина {2, 5, 6, 7}

['A'..'Z', 'O'..'9'] - множина, що складається з всіх великих латинських букв і цифр

[i + j .. i + 2*j] - множина, що складається з всіх цілих чисел між i + j і i + 2j

Відмітимо, що якщо у виразі [v1..v2] v1 > v2, множина [v1 .. v2] - порожня.

12.3. Операції і відношення над множинами

До операндів - однотипних множин А і В можна застосувати такі дії:

А + В - об’єднання А  В

А * В - перетин А  В

А - В - різниця А \ В

Між А і В визначені також відношення порядку і рівності

А = В, А <> В, А < В, А <= В, А > В, А >= В;

Відношення порядку інтерпретуються як теоретико-множинні включення.

Якщо А – множина і х – елемент базового типу, то визначено відношення належності х in A - x належить A ( x  A ).

Кожне з відношень, описаних вище, по суті є операцією, результат якої має тип Boolean. Таким чином, якщо Init – змінна типу Boolean, можливе присвоювання Init := A < B. Можливі такі порівняння ( А = В ) = ( С = D ).

Наявність операцій над множинами дозволяє застосовувати в програмах оператори присвоювання, в лівій частині яких стоїть змінна типу множини, а в правій – вираз того ж типу. Наприклад:

А := А * [1 .. 10] + B ; B := (А + B)*['A' .. 'Z'] ;

12.4. Застосування множин у програмуванні

При реалізації мови розміри множин завжди обмежені константою, що залежить від реалізації. Звичайно ця константа кратна довжині машинного слова. Це відбувається тому, що множини реалізовані в виді логічних (двоїстих) векторів наступним чином: кожній координаті двоїстого вектора однозначно відповідає один з елементів базового типу. Якщо елемент а належить множині А, що представляється, то значення координати вектора, відповідне а, дорівнює 1. У протилежному випадку значення відповідної координати дорівнює 0.

Наприклад, якщо множина А описана як Set of 0..15, то його представляє 16-ти мірний двоїстий вектор, координати якого перенумеровані від 0 до 15, і і-тій координаті відповідає елемент і базового типу.

Базовий тип : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Двоїстий вектор : 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0

Представлена множина : A = [2, 3, 5, 7, 11, 13]

Такий спосіб реалізації дозволяє швидко виконувати операції над множинами і перевірки теоретико-множинних відношень. Тому, наприклад, замість

For X := 'A' to 'Z' do

If (X ='A') or (X ='E') or (X ='I') or (X ='O') or (X='U')

then Statement1

else Statement2

краще написати

For X := 'A' to 'Z' do

If X in ['A','E','I','O','U']

then Statement1

else Statement2

Остання форма запису не тільки краще читається, але й значно швидше обчислюється.

У Pascal максимальна кількість елементів у множині дорівнює 256. Таким чином, у якості базового типу можна вибирати, наприклад, Char або відрізок 0..255. У завершення розділу наведемо приклад програми, що використовує множинні типи даних.

Приклад 12.1. Побудувати множину всіх простих чисел з відрізка 2..n (n  255).

Метод, за допомогою якого ми це зробимо, відомий як “Решето Ератосфена”. Суть цього метода у наступному: Нехай Prime - множина простих чисел, що будується, і Grating - множина, що називається решетом. Алгоритм починає роботу з Prime = [ ]; Grating = [2..n].

Крок основного циклу:

а. Найменший елемент Grating помістити у Prime;

б. Вилучити з Grating всі числа, кратні цьому елементу;

Алгоритм закінчує роботу при Grating = [ ]

Program EratosfenGrating;

Const

n = 255;

Type TSet= set of 2 .. n ;

Var Prime: TSet;

Procedure PrimeNumber(Var Prime: TSet);

Var

Grating: TSet;

i, Min : integer ;

Begin

Grating := [2 .. n] ;

Prime := [] ;

Min := 2; {ініціалізація}

While Grating <> [] do begin {основний цикл}

While not(Min in Grating) do

{пошук найменшого елемента в решеті}

Min := Min + 1;

Prime := Prime + [Min] ;

{поповнення множин простих чисел}

For i := 1 to n div Min do {вилучення кратних із решета}

Grating := Grating - [i*Min];

end;

End;

Procedure OutSet (Prime: TSet);

Var i:Integer;

Begin

Writeln('Primes: '); {виведення множин простих чисел}

For i := 1 to n do

If i in Prime then write(i, ', ');

End;

Begin

PrimeNumber(Prime);

OutSet (Prime);

End.

Відмітимо, що доступ до елемента множини у мові не передбачений. У цьому – ще одна якісна відміна множинного типу від інших типів даних. Тому наприклад, для введення множини Prime доводиться перебирати всі елементи базового типу і кожний із них перевіряти на належність Prime.