- •Методичні вказівки для допомоги студентам у вивченні самостійних тем з предмету
- •Урок № 6
- •Особливості інтегрованого середовища програмування Turbo Pascal. Основні пункти меню
- •Урок № 13
- •Поняття рекурсії. Зовнішні оголошення та оголошення процедур та функцій з випередженням
- •Урок № 14
- •Особливості роботи в текстовому режимі
- •Урок № 20
- •Сортування масиву. Методи сортування масиву
- •Урок № 21
- •Рекурсивне сортування масиву методом вибору
- •Урок № 21
- •Алгоритми роботи з двомірними таблицями на мові програмування Pascal
- •Урок № 25
- •Приклади опису багатомірних масивів засобами мови програмування Pascal
- •Урок № 26
- •Робота з елементами двомірного масиву
- •Урок № 27
- •Записи. Види записів. Робота з записами
- •Урок № 30
- •Множини. Дії над множинами
- •Урок № 32
- •Запис/читання файлу. Маніпуляції вмістом файлу
- •Урок № 33
- •Типізовані файли. Текстові файли. Нетипізовані файли
- •Урок № 37
- •Динамічні данні без внутрішніх посилань
- •Урок № 42
- •Робота з кольорами
- •Урок № 43
- •Робота з координатами
- •Урок № 44
- •Принцип виведення точки та лінії на екран
- •Урок № 45
- •Принцип побудови не заповнених геометричних фігур
- •Урок № 46
- •Принцип побудови заповнених геометричних фігур
- •Урок № 47
- •Виведення тексту в графічному режимі
- •Урок № 50
- •Використання модуля mouse Питання для вивчення:
- •Урок № 51
- •Принципи побудови графічного зображення, що рухається
- •Урок № 52
- •Модуль Graphs3d
Урок № 30
(згідно робочої навчальної програми)
Множини. Дії над множинами
Питання для вивчення:
Поняття множин.
Опис множин.
Операції над множинами.
Поняття множин. Множина - це структурований тип даних, який представляє собою набір взаємозалежних за якоюсь ознакою або групі ознак об'єктів, які можна розглядати як єдине ціле. Кожен об'єкт в Множині називається елементом множини. Всі елементи множини повинні належати одному з порядкових типів, що містить не більше 256 значень. Цей тип називається базовим типом множини. Базовий тип задається діапазоном або перерахуванням. Область значень типу Множина - набір всіляких підмножин, складених з елементів базового типу. У виразах на мові Паскаль значення елементів множини вказуються в квадратних дужках: [1,2,3,4], ['а', 'b', 'з'], ['a' .. 'z']. Якщо множина не має елементів, вона називається порожньою і позначається як []. Кількість елементів множини називається її потужністю. Множина може приймати всі значення базового типу. Базовий тип не повинен перевищувати 256 можливих значень. Тому базовим типом множини можуть бути byte, char, boolean і похідні від них типи. Множина в пам'яті зберігається як масив бітів, в якому кожен біт вказує чи є елемент належить оголошеному Множинаі чи ні. Максимальне число елементів множини 256, а дані типу Множина можуть займати не більше 32 байт.
Число байтів, що виділяються для даних типу Множина, обчислюється за формулою:
ByteSize = (max div 8) - (min div 8) + 1,
де max і min - верхня і нижня межі базового типу даної множини.
Номер байта для конкретного елемента Е обчислюється за формулою:
ByteNumber = (E div 8) - (min div 8),
номер біта всередині цього байта за формулою:
BitNumber = E mod 8
Не має значення порядок запису елементів множини всередині конструктора.
Наприклад, [1, 2, 3] та [3, 2, 1] - це еквівалентні множини.
Кожен елемент в Множині враховується тільки один раз. Тому Множина [1,2, 3, 4, 2, 3, 4, 5] еквівалентно [1 .. 5].
Опис множин. Змінні множинного типу описуються так:
Var <ідентифікатор>: set of <базовий тип>;
Наприклад:
Var A, D: Set Of Byte;
B: Set Of 'a' .. 'z';
C: Set Of Boolean;
Не можна вводити значення у множинну змінну процедурою введення і виводити процедурою виведення.
Множинна змінна може отримати конкретне значення тільки в результаті виконання оператора присвоювання:
<Множинна змінна>: = <множинний вираз>;
Наприклад:
A: = [50, 100, 150, 200];
B: = ['m', 'n', 'k']; C: = [True, False];
D: = A;
Крім того, вирази можуть включати в себе операції над множинами.
Операції над множинами. Об'єднанням двох множин A і B називається множина, що складається з елементів, що входять хоча б в одне з множин A чи B. Знак операції об'єднання в Паскалі «+».
Приклади:
[1, 2, 3, 4] + [3, 4, 5, 6] => [1, 2, 3, 4, 5, 6]
[] + ['a' .. 'z'] + ['A' .. 'E', 'k'] => ['A' .. 'E', 'a' .. 'z' ]
[5 <4, true and false] + [true] => [false, true]
Перетином двох множин A і B називається множина, що складається з елементів, одночасно входять в Множина A і в Множина B.
Знак операції перетину в Паскалі «*».
Приклади:
[1, 2, 3, 4] * [3, 4, 5, 6] => [3, 4]
['a' .. 'z'] * ['A' .. 'E', 'k'] => ['k']
[5 <4, true and false] * [true] => []
Різницею двох множин A і B називається множина, що складається з елементів множини A, що не входять в Множину B.
Приклади:
1a) [1, 2, 3, 4] - [3, 4, 5, 6] => [1, 2]
1b) [3, 4, 5, 6] - [1, 2, 3, 4] => [5, 6]
2a) ['a' .. 'z'] - ['A' .. 'E', 'k'] => ['a' .. 'j', 'i' .. 'z']
2b) ['A' .. 'E', 'k'] - ['a' .. 'z'] => ['A' .. 'E']
3a) [5 <4, true and false] - [true] => [false]
3b) [true] - [5 <4, true and false] => [true]
Операція входження. Це операція, що встановлює зв'язок між множиною і скалярною величиною, тип якої співпадає з базовим типом множини. Якщо x - така скалярна величина, а M - Множина, то операція входження записується так: x in M. Результат - логічна величина true, якщо значення x входить в Множину M, і false - в протилежному випадку.
Наприклад, 4 in [3, 4, 7, 9] - true, 5 in [3, 4, 7, 9] — false.
Використовуючи дану операцію, можна не тільки працювати з елементами множини, але і, навіть якщо в рішенні задачі явно не використовуються Множини, деякі логічні вирази можна записати більш лаконічно.
Натуральне число n є двозначним. Замість виразу (n> = 10) and (n <= 99) можна записати n in [10 .. 99].
Символ c є російською буквою. Замість виразу (c> = 'А') and (c <= 'Я') or (c> = 'а') and (c <= 'п') or (c> = 'р') and (c < = 'я') пишемо c in ['А' .. 'Я', 'а' .. 'П', 'р' .. 'Я'] і т.д.
Додати новий елемент в Множину можна з використанням операції об'єднання. Наприклад, a: = a + [5] Для цих же цілей в Turbo Pascal 7.0 призначена процедура Include: include (M, A) M - Множина, A - змінна того ж типу, що й елементи множини M. Той же приклад можна записати так: Include (a, 5)
Виключити елемент з Множини можна за допомогою операції «різницю множин». Наприклад, a: = a-[5] Для цих же цілей в Turbo Pascal 7.0 призначена процедура Exclude: exclude (M, A) M - Множина, A - змінна того ж типу, що й елементи множини M. Той же приклад можна записати так: Exclude (a, 5).
Завдання 1. У місті є n вищих навчальних закладів, які здійснюють закупівлю комп'ютерної техніки. Є шість комп'ютерних фірм: «Діалог», «Avicom», «Нетан», «Сервер», «Декада», «Dega.ru». Відповісти на наступні питання:
у яких фірмах закупівля проводилася кожним з вузів?
в яких фірмах закупівля проводилася хоча б одним з вузів?
в яких фірмах жоден з вузів не закуповував комп'ютери?
Вирішимо завдання з використанням множин. Для зручності подальших маніпуляцій у порядку проходження пронумеруємо комп'ютерні фірми, починаючи з одиниці. Занесемо інформації про місце закупівель комп'ютерів кожним з вузів в окрему Множину.
Відповідь на перше питання можна отримати, виконавши перетин всіх таких множин.
Відповідь на друге питання - результат об'єднання множин.
І, нарешті, на останнє - різниця Множинаі всіх фірм і Множинаі фірм, де хоча б один вуз робив покупки.
program ex_set_1;
type firma = set of 1 .. 6;
v = array [0 .. 20] of firma;
const f: array [1 .. 6] of string [10] = ('Діалог', 'Avicom', 'Нетан', 'Сервер', 'Декада', 'Dega.ru');
{Процедура введення інформації про закупівлю комп'ютерів в черговий
фірмі}
procedure vvod (var a: firma);
var i: byte; ans: 0 .. 1;
begin
a: = [];
for i: = 1 to 6 do
begin
Write ('Вуз купував комп'ютери в фірмі', f [i], '(1 - так, 0 - ні)?'); ReadLn (ans);
if ans = 1 then a: = a + [i]
end;
end;
{Процедура виведення елементів масиву, номери яких містяться в Множині} procedure
Print (a: firma);
var i: byte;
begin
for i: = 1 to 6 do if i in a then write (f [i]: 10);
writeln
end;
{Процедура, яка дає відповідь на перше питання}
procedure Rez1 (a: v; n: byte; var b: firma);
var i: byte;
begin
b: = [1 .. 6];
for i: = 0 to n-1 do b: = b * a [i];
end;
{Процедура, яка дає відповідь на друге питання}
procedure Rez2 (a: v; n: byte
firma);
var i: byte;
begin
b:
for i: = 0 to n-1 do b: = b + a [i];
end;
var a: v; n, i: byte; c: firma;
begin
write ('Скільки ВНЗ робили закупівлю?'); readln (n);
for i: = 0 to n-1 do vvod (a [i]);
Rez1 (a, n, c);
writeln ('Кожен з вузів закупив комп'ютери у фірмах:');
Print (c);
Rez2 (a, n, c);
writeln ('Хоча б один з вузів закупив комп'ютери у фірмах:');
Print (c);
writeln ('Жоден з вузів не закупив комп'ютери у фірмах:'); Print ([1 .. 6]-c);
end.
Питання для контролю вивченого матеріалу:
Що таке Множина?
Чому Множина є структурованим типом даних?
Як зберігається Множина в пам'яті ЕОМ? Який максимальний об'єм оперативної пам'яті може бути відведений під зберігання однієї Множини?
Які операції можна виконувати над множинами?
Як додати елемент в Множину?
Як виключити елемент з Множини?
Як вивести елементи множини?
Література:
Фаронов В.В. Турбо Паскаль 7.0. Начальный курстор. – М: Диалектика, 1997. – 487 стор. 103-107
