Множини. Дії над множинами
Питання для вивчення: 1. Поняття множин. 2. Опис множин. 3. Операції над множинами.
Поняття множин. Множина - це структурований тип даних, який представляє собою набір взаємозалежних за якоюсь ознакою або групі ознак об'єктів, які можна розглядати як єдине ціле. Кожен об'єкт в Множині називається елементом множини. Всі елементи множини повинні належати одному з порядкових типів, що містить не більше 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) [1, 2, 3, 4] + [3, 4, 5, 6] => [1, 2, 3, 4, 5, 6] 2) [] + ['a' .. 'z'] + ['A' .. 'E', 'k'] => ['A' .. 'E', 'a' .. 'z' ] 3) [5 <4, true and false] + [true] => [false, true] Перетином двох множин A і B називається множина, що складається з елементів, одночасно входять в Множина A і в Множина B. Знак операції перетину в Паскалі «*». Приклади: 1) [1, 2, 3, 4] * [3, 4, 5, 6] => [3, 4] 2) ['a' .. 'z'] * ['A' .. 'E', 'k'] => ['k'] 3) [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». Відповісти на наступні питання: 1) у яких фірмах закупівля проводилася кожним з вузів? 2) в яких фірмах закупівля проводилася хоча б одним з вузів? 3) в яких фірмах жоден з вузів не закуповував комп'ютери? Вирішимо завдання з використанням множин. Для зручності подальших маніпуляцій у порядку проходження пронумеруємо комп'ютерні фірми, починаючи з одиниці. Занесемо інформації про місце закупівель комп'ютерів кожним з вузів в окрему Множину. Відповідь на перше питання можна отримати, виконавши перетин всіх таких множин. Відповідь на друге питання - результат об'єднання множин. І, нарешті, на останнє - різниця Множинаі всіх фірм і Множинаі фірм, де хоча б один вуз робив покупки. 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; {Процедура виведення елементів масиву, номери яких містяться в Множині} 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. Питання для контролю вивченого матеріалу: 1. Що таке Множина? 2. Чому Множина є структурованим типом даних? 3. Як зберігається Множина в пам'яті ЕОМ? Який максимальний об'єм оперативної пам'яті може бути відведений під зберігання однієї Множини? 4. Які операції можна виконувати над множинами? 5. Як додати елемент в Множину? 6. Як виключити елемент з Множини? 7. Як вивести елементи множини? Література: Фаронов В.В. Турбо Паскаль 7.0. Начальный курстор. – М: Диалектика, 1997. – 487 стор. 103-107
Урок № 32 (згідно робочої навчальної програми) ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|