Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лобораторні Pascal.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
530.94 Кб
Скачать

Лабораторна робота № 6. Множини. Короткі теоретичні відомості.

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

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

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

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

М ножинний

тип

Наприклад,

а) Type Beta = Set of 100..200;

б) Type Glas = Set of char ;

в) 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;

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] - порожня.

3. Операції і відношення.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Program EratosfenGrating;

Const n = 255;

Var Grating, Prime: set of 2 .. n ;

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;

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

For i := 1 to n do

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

End.

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

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