3. Фундаментальні структури даних

Стандартні прості типи

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

Прості стандартні типи характеризуються тим, що їх змінні в конкретний момент часу можуть мати одне з можливих значень на відміну від структурних типів таких, як, наприклад, масиви. Стандартні прості  типи позначаються ідентифікаторами:

integer, Boolean, real, char.

Тип integer містить підмножину цілих чисел, розмір якої може бути різним на різних обчислювальних системах. Для Turbo Pascal тип integer займає 2 байти, що для чисел зі знаком відповідає діапазонові від -32768 до 32767. Крім того Turbo Pascal має ще 4 стандартних типи, що відносяться до цілих:

shortint, byte, word, longint

Характеристики цілочисельних типів даних наведені в табл.1.1

Таблиця 1.1. Вбудовані цілочисельні типи

 

Тип

Діапазони

Формат

Shortint

-128...127

1 байт зі знаком

Integer

-32768...32767

2 байти зі знаком

Longint

-2147483648...2147483647

4 байти зі знаком

Byte

0...255

1байт без знака

Word

0...65535

2 байти без знака

 

Стандартні операції над цілими числами – це 4 дії арифметики: додавання (+), віднімання (–), множення (*) і ділення (div). Остання повинна давати цілий результат, опускаючи можливий залишок. Додаткова операція одержання залишку від целочисленного ділення позначається mod:

Приклад.

16 div 5 = 3,

16 mod 5 = 1.

Тип real позначає підмножину дійсних чисел. У той час, як дії над цілими числами дають точні результати, для арифметичних дій над числами типу real допускається неточність у межах помилок округлення, тому що в обчисленнях бере участь скінчена кількість  цифр. У цьому полягає основна відмінність типів real і integer. Над значеннями типу real  виконуються ті ж 4 арифметичних дії, тільки ділення дійсних чисел, що дає дійсний результат позначається косою рисою (/).

Turbo Pascal також має декілька підмножин  дійсних чисел. Їх характеристики наведені в табл.  1.2

Таблиця 1.2. Вбудовані дійсні типи.

 

Тип

Діапазони

Значущі цифри

Розмір у байтах

Real

2,9 

11-12

6

Single

1,5 

7-8

4

Double

5 

15-16

8

Extended

3,4 

19-20

10

Comp

-263 +1 ... 263 -1

19-20

8

 

Всі інші типи, крім Real, реалізуються або за допомогою математичного співпроцесора (для цього перед його використанням у текст програми потрібно включити директиву компілятора {$N+}), або програмним шляхом (емуляція) за допомогою директиви {$E+}.

Логічний тип Boolean займає в пам'яті 1 байт і приймає тільки 2 значення, що позначаються ідентифікаторами TRUE і FALSE. Операції над логічними значеннями - це логічне множення, або  кон’юнкція (and), логічне додавання, або диз'юнкція (or) і логічне заперечення (not). Правила виконання логічних операцій наведені в табл. 1.3.

Таблиця 1.3. Логічні операції

 

Значення змінних

p or q

p and q

not p

p

q

true

true

true

true

false

true

false

true

false

false

false

true

true

false

true

false

false

false

false

true

 

Помітимо, що операції порівняння даних інших типів дають результат типу Boolean. Отже результат порівняння можна присвоювати логічній змінної. Наприклад, якщо дані логічні змінні p і q, і цілі змінні x=5, y=8, z=10, тоді виконання наступних операторів присвоювання

p:= x = y

q:= (х<y) and(y<=z),

дасть такий результат:  p = false і q = true.

Стандартний тип char включає множину символів, що  визначені для даної обчислювальної системи і містяться в її кодовій таблиці символів. Для IBM - сумісних комп'ютерів тип char займає 1 байт і фактично містить числовий код символу, що представляється. Таким чином, множина char складається з 256 символів, коди яких змінюються від 0 до 255.

Множина типу char має наступні властивості:

1. Вона містить арабські цифри, великі та малі латинські літери,  великі та малі літери національного алфавіту, спеціальні символи, символи псевдографіки.

2. Підмножини літер і цифр упорядковані і зв'язані, тобто в кодовій таблиці розташовуються в наступному порядку

0...9...A...Z... a...z...А...Я...а...я

Завдяки  цим властивостям об'єкти типу char можна порівнювати один з одним.

Приклади:

‘F’ < ‘L’,

‘Z’=‘Z’

’Я’ < ’я’

При цьому порівняння фактично здійснюється по кодах символів.

Важливими функціями перетворення між двома стандартними типами byte і char є ord і chr. Функція ord(х) повертає  порядковий номер (код) символу х. Функція chr (х) повертає символ з порядковим номером х. Отже, функції ord і chr є взіємнооберненими, тобто

ord ( chr ( i ) ) = i

chr (ord (c ) ) = c

Прості злічені типи даних.

У багатьох програмах потрібно використати дані, значення яких не є стандартними. Наприклад, така програма повинна опрацювати дані, що відповідають дням тижня. Оскільки такі значення в мові Паскаль не передбачені, вони кодуються даними інших типів. Найчастіше в таких випадках використовуються цілі  числа.  В такому випадку, їх власні числові значення несуттєві і вони вказують на вибір значення з невеликої множини можливих варіантів. Наприклад, множину днів тижня можна позначити цілими числами від 1 до 7, а множину  кольорів 16-ти кольорової палітри - числами від 0 до 15. Таке подання даних не зовсім зручне, тому що втрачається наочність в опрацюванні даних. Саме тому Паскаль надає можливість створення нового типу даних, який називається зліченим. Він задається  шляхом перерахування (злічення) всіх можливих значень у вигляді осмислених ідентифікаторів. Формат оголошення такого типу має вигляд:

type T = ( C1, C2, ..., Cn);

де Т – ім’я типу;

C1, C2, ..., Cn – можливі значення його об’єктів.

Приклади:

type 

day = (monday, tuesday, wednesday, thursday, friday, saturday, sunday);

color = (red, orange, yellow, green, blue, violet);

figure = (triangle, square, circle);

transport= (train, bus, car, ship, airplain);

Як видно, уводиться не тільки новий ідентифікатор типу, але і множина ідентифікаторів, що відповідають значенням цього типу. Надалі в програмі ці ідентифікатори можуть використовуватися як константи. При цьому текст програми стає набагато зрозумілішим. Однак слід зауважити, що при оголошенні значень зліченого типу правила мови Паскаль забороняють використання значень стандартних або вже оголошених типів даних. Наступний приклад ілюструє помилку в оголошенні типу даних, оскільки його значення вже належать стандартному типу integer.

Приклад:

Digit = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

Хочеться відзначити, що введення зліченого типу має на меті винятково підвищення ясності текстів програм і характеризує стиль програмування. Якщо, приміром, визначені змінні

var  

d:  day;

c:  color;

f:  figure;

t:  transport:

то можливі наступні оператори присвоювання

d: =  monday;

c: = green;

f: = square;

t: = airplain.

Очевидно, що вони набагато зрозуміліші, ніж операції типу

d: = 0; 

c : = 3;

f: = 1;

t: = 4;

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

f: = f +1 ;

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

Приклади:

friday < sunday

circle > square 

Оскільки значення зліченого типу упорядковані, до них можна застосовувати функції, що видають попереднє або наступне значення:

succ (x) - наступне. значення

pred (x) - попереднє.  Значення.

Для ілюстрації вище наведеного розглянемо завдання.

Завдання 1.1. Підрахувати тижневий заробіток працівника, за умови, що він працював 7 днів у тиждень по 8 годин. Тариф (оплата за 1 годину) становить 1,20 грн. у робочі дні й  2,40 грн. у вихідні дні.

Program Salary Of Week;

type

day = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);

const

tarif = 1.2;

workday = 8;

holiday = 2 * workday;

var 

d: day;

s: real;

Begin

s:=0;

for d:=Mon  to Sun do

begin

  if d < Sat

  then s:=s + tarif * workday

  else s:=s + tarif * holiday;

end;

writeln (‘Зарплата за тиждень = ’, s:6:2);

End.

Обмежені типи

Часто буває, що змінна може приймати значення деякого типу тільки у визначеному інтервалі. Більше того, вихід значення за межі такого інтервалу може призвести до некоректних результатів а то і збоїв у роботі програми. Наприклад, програма опрацьовує дані, пов’язані з днями місяця. Кожен місяць має свою кількість днів. Крім того, максимальне значення не може перевищувати 31. Такі обмеження можна виразити шляхом використання ще одного типу даних, який створюється користувачем. Такий тип називається обмеженим типом даних, або діапазоном. Він задається на базі вже існуючого стандартного простого (крім типу Real) або оголошеного зліченого типу даних шляхом встановлення обмежень на можливий діапазон своїх значень. Визначення обмеженого типу має наступний формат

type T = min .. max;

де Т – ім’я типу;

min і max- межі інтервалу, що можуть бути будь-якого простого типу, крім real. Ці значення повинні відокремлюватись двома крапками (а не трьома, як це прийнято в математиці!).

Приклади:

type

year = 1900..1999;

litera = ‘A’...’Z’;

diait= ‘0’...’9';

Отже, якщо для зліченого типу значення не повинні співпадати з вже оголошеними, то для обмеженого типу навпаки, значення задаються з числа тих, що вже використовуються. При оголошенні діапазону слід пам’ятати, що мінімальна межа  завжди повинна бути не більшою за максимальну. У противному випадку буде виведене повідомлення про помилку.

Нехай визначені змінні

var

y: year;

L: litera;

Розглянемо операції присвоювання

y:=1973; 

L:='W';

y:=1291; 

L:='9';

Перша та друга операції дозволені, а третя і четверта – ні. І ці помилки компілятор може виявити ще на етапі компіляції. Правда для оператора

y:= і;

де i має тип  integer, помилка зможе бути виявлена тільки під час виконання програми. Однак системи, що виконують такі перевірки, на практиці виявилися досить корисними.

Структуровані типи даних.

Як вже зазначалось, об’єкти простих типів можуть приймати в кожен момент часу лише одне значення. При опрацюванні великих наборів даних застосування таких типів незручне, тому що пов’язане з необхідністю використання великої кількості змінних. Саме тому всі сучасні мови програмування, у тому числі і Паскаль, мають у своєму складі можливість використання структур даних. Серед структурованих типів найбільш поширеними є масиви, рядкові величини, записи, множини та файли. Оскільки зазначені типи розглядались в курсі “Інформатика та комп’ютерна техніка”, то далі будуть наведені лише стислі відомості про їх оголошення та використання.

Масиви

Масив - це регулярна структура, що складається з компонентів одного типу. Дані в цій структурі знаходяться у порядку відношення, тобто, проіндексовані. На відміну від даних простих типів, що у конкретний момент часу можуть приймати тільки одне значення з припустимого діапазону значень, масив може приймати стільки різних значень одночасно, скільки компонентів він має у своєму складі. Для розв’язання  практичних завдань найчастіше використовуються  одномірні (вектори) або двовимірні масиви  (матриці).

Оголошення масиву здійснюється за таким правилом:

Type T = array[Ti] of Te,

де Т – ім’я типу;

Ti – тип індексів елементів масиву;

Te – тип індексів елементів масиву

Тип індексу елементів може бути довільним простим типом, крім real. Тип елементів масиву може бути довільним, крім файлового.

Приклад:

Type Massive = array[1..7] of real;

Var T: Massiv;

Одномірний масив можна представити як набір однотипних значень, що розташовуються в пам'яті одне за іншим. Наприклад, значення оголошеного вище масиву Т можна подати у такій таблиці (табл. 1.4):

Таблиця 1.4. Подання одновимірного масиву Т

 

Елемент

0.3

-2.7

11.4

4.2

-6.3

1.8

2.5

індекс

1

2

3

4

5

6

7

 

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

Т[3]= 11.4; Т[7]= 2.5;

Найчастіше індекси позначаються діапазоном цілих чисел, починаючи з 0 або 1. Однак іноді буває зручнішим  використовувати більш осмислені значення. Наприклад, визначити масив для збереження середньорічних доходів фірми за 5 років з 1992 по 1996 можна так

Приклад:

Type Firm = array[1992..1997] of real;

P: Firm;

Тут індекс  кожного елементу масиву P фактично є номером року, прибуток  за який зберігається в цьому елементові. При цьому доступ до значення P[95] є більш інформативним, ніж P[4] у випадку нумерації елементів з 1.

Двовимірні масиви застосовуються у тих випадках, коли набір даних характеризується двома ознаками. Тоді в ролі типу індексу виступає не один тип даних, а їх сукупність, розділених комою.

Приклад:

Type Matrix = array [1..4, 1..6] of integer;

Var B: Matrix;

Двовимірний масив можна представити як набір значень, розташованих у виді прямокутної таблиці. При цьому для доступу до будь-якого елементу масиву потрібно уже вказати два індекси: номер рядка і номер стовпця (табл. 1.5). Слід зауважити, що в наведених прикладах спочатку оголошувався тип даних, а лише потім змінні, що являли собою масиви. Разом з тим  Паскаль дозволяє використання безіменних типів.

Приклад:

Var  X : array[1..7] of Real;

Y : array[1..4, 1..6] of integer;

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

Таблиця 1.5. Подання двовимірного масиву В.

Другий спосіб є більш кращим, оскільки несе в собі більше додаткової інформації.

Рядкові величини.

Величиною рядкового типу (strings) називається послідовність символів, укладена в одинарні лапки. Цей тип даних є стандартним для мови Паскаль, хоча він є структурованим. Величини можуть бути як константами, так і змінними. При оголошенні змінних рядкового типу можна вказати кількість символів у цій величині.

ПРИКЛАД:

Var

S1=string;

S2=string[10];

Довжина рядка являє собою кількість символів, які дійсно містяться в рядковій величині на час її опрацювання. Вона може бути меншою за ту кількість символів, яка передбачена в рядковій величині при її оголошенні.

Опис змінної S1  задає рядкову величину з максимально можливою довжиною рядка (255 символів), а опис змінної S2 – рядкову величину з максимальною довжиною рядка 10 символів.

Структура рядкової величини схожа на структуру одновимірного масиву, якій складається з елементів літерного типу. Однак на відміну від одновимірних масивів рядкові величини можна опрацьовувати і як єдине ціле, і поелементно. При обробці рядка поелементно фактично він розглядається як одновимірний масив з типом індексу byte  і типом елементів char. Рядкові величини можуть містити довільні символи. Так. у рядку може міститися й одинарна лапка. Для того, щоб помістити одинарну лапку в рядок, потрібно написати дві послідовно розташовані одинарні лапки. Рядки, у яких міститься тільки один символ, являють собою дані стандартного символьного типу (char). Рядок можна порівняти з масивом даних символьного типу, що має таку ж довжину. Всі рядкові константи сумісні з усіма рядковими типами (string).

ПРИКЛАДИ:

‘TURBO’

‘п”ятниця’

“””

‘;’

Для рядкових величин визначена операція конкатенації (об’єднання) рядків. Операція позначається символом “+”. Тип результату – також рядкова величина. Мова ТУРБО ПАСКАЛЬ дозволяє використовувати оператор + для об’єднання двох рядкових операндів. Якщо довжина результуючого рядка перевищує 255 символів, то вона усікається до 255 символів.

Оператори відношення =, <>, <, >, <=, або >= можуть застосовуватися для порівняння рядків відповідно до порядку розширеного набору символів коду ASCII.  Будь-які два значення рядкового типу  даних можна порівняти, оскільки всі значення рядкових даних сумісні. Значення рядкового типу сумісні зі значеннями символьного типу, і при їхньому порівнянні символьне значення опрацьовується як рядкове значення довжиною 1. Та величина вважається “більшою”, яка має на відповідному місці символ з більшим ASCII кодом. Слід зауважити, що пробіл є повноправним символом рядкової величини і він опрацьовується аналогічно іншим символам величини.

Приклади:

‘turbo’>’Turbo’;

‘turbo’>’pascal’;

‘turbo’<’turbo pascal’;

‘123’<>’  123’;

Оскільки тип string є стандартним, для даних цього типу діють стандартні процедури вводу та виводу. Особливими процедурами та функціями для даних рядкового типу є наступні функції.

Функція Соncat(s1, s2 ,…,sn ) - виконує конкатенацію (об’єднання) послідовності рядків s1, s2 ,…,sn .  Її дія аналогічна дії операції конкатенації.

Функція Copy(s,m,n) - повертає підрядок (частину) рядкової величини s , починаючи з позиції номер m довжиною n символів.

Процедура Delete(s,m,n) - видаляє з рядка s його частину заданої довжини n, починаючи з заданої позиції m.

Процедура Insert(s,t,n) - додає в рядок s підрядок t, починаючи з певної позиції рядка n.

Функція Length(s)  - повертає динамічну довжину рядка s.

Функція Роs(s,t) - здійснює пошук підрядка s в рядкові t.

Процедура Str(n) - перетворює чисельне значення n в його рядкове представлення.

Процедура Val(s) - перетворить рядкову величину s, яка є числом,  в її чисельне значення.

Записи.

Запис - це структура даних, що складається з фіксованого числа компонентів, названих полями. Поля можуть бути різних типів. Кожному полю задається ім’я, так званий ідентифікатор поля. Ідентифікатор поля використовується при організації доступу до компонентів запису.

Визначення типу запису починається зарезервованим словом record (запис), за ним іде список полів запису. Наприкінці списку полів запису ставиться зарезервоване слово end (кінець). 

Список полів являє собою послідовність розділів запису, відділених друг від друга крапкою з комою. Кожний розділ складається з одного або декількох ідентифікаторів, що відокремлюються один від одного комами, слідом за якими іде або двокрапка, або ідентифікатор типу, або опис типу (дескриптор). В ролі типу може виступати будь-який тип даних мови Паскаль, крім файлового.  Таким чином, кожний розділ запису визначає тип одного або декількох полів. Порядок переліку полів значення не має. Різні записи можуть мати однакові поля.

Приклади:

Type

Student = record

Name:string[30];

Course:1..4;

Group:string[7];

End;

Month = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec);

Data = record

Day, Year:integer;

Mon:month;

End;

Album=record

Name:string[15];

Year:integer;

end;

Перший тип запису – Student – містить три поля. Всі поля різнотипові. Два з них являють рядкову величину, одне – цілочисельний діапазон. Другий тип  ( Data) має два однотипових поля, які описані через кому. Третє поле має тип, визначений користувачем . Помітимо, що порядок опису полів ніякої ролі не відіграє, він визначається користувачем. Третій тип (Album) має поля, які використовуються у двох попередніх типах. Це дозволяється синтаксисом, оскільки повні імена об’єктів будуть різними. При цьому типи полів можуть бути як однаковими (поле Year), так і різними (поле Name).

Змінні типу запис вводяться  аналогічно стандартним типам:

Var

stud1, stud2 : student;

new_date : data;

comp_disk : album;

Відзначимо, що так само, як і для даних типу масив, дозволяється виконувати операції присвоювання між цілими записами однакових типів. У всіх інших випадках опрацювання записів можна здійснювати покомпонентно, причому в межах тих операцій, які дозволяються типом відповідних полів. Виключення складають лише операції вводу-виводу для файлів. Для опрацювання компонента запису (тобто конкретного поля) ім’я поля вказується через крапку після імені запису: stud1.name –поле name запису stud1 .

Приклади:

stud1:=stud2;  {допустима операція}

stud1:=new_date;  {недопустима операція різні типи}

read(stud1); {недопустима операція}

readln(stud1.name, stud1.course, stud1.year);

{допустима операція для вказаних типів полів}

comp_disk.year:=new_date;

{допустима операція – однакові типи полів}

readln(new_date.mon);  

{недопустима операція – для типу даних 

користувача не визначена така операція}

При використанні типів записів так, як це показано вище, одержується досить довгі оператори. Було б зручніше, якби ми могли звернутися до певних полів запису так, якби вони були простими змінними. Цю функцію виконує оператор приєднання with. Він “відкриває” запис таким чином, що ідентифікатори полів можуть використовуватися як ідентифікатори змінних. Оператор має такий формат:

with  S1, S2,…, Sn  do 

T1, T2,…, Tk;

end;

де with, do, end – службові слова;

S1, S2,…, Sn  – список імен записів, до яких буде здійснюватись приєднання полів;

T1, T2,…, Tk – список операторів, для яких буде здійснюватись приєднання.

Слідом за зарезервованим словом with в операторі іде список змінних величин запису, відділених один від одного комами. За списком змінних іде зарезервоване слово do. Завершує оператор with зарезервоване слово end. В тілі оператора приєднання тепер можна вказувати неповні імена компонентів записів, а лише імена полів. Оператор автоматично визначить, до якого саме запису виконати вказані оператори. У заголовкові оператора приєднання можна вказувати декілька імен змінних типу запис. При цьому пріоритет при наявності однакових полів буде мати той запис, ім’я якого записане раніше. Ім’я  поля деякого запису може співпадати з іменем звичайної змінної, оскільки насправді повні імена їх розрізняються. Якщо така ситуація зустрічається  в операторі приєднання, то таке ім’я буде інтерпретуватись, як ім’я поля запису.

Приклад:

with stud1 do

readln(name);

read(course);

group:=’gr-00-1’;

end;

Множини.

Значенням множинного типу в мові Паскаль є деяка множина значень. Конкретні значення множинного типу задаються за допомогою так званого конструктора множини. Він  являє собою список елементів множини. Тип елементів множини називається базовим типом. В його ролі може використовуватись будь-який скалярний тип даних крім Real та Integer. Разом з тим, базовим типом може виступати довільний діапазон типу Integer. В мові Паскаль можна використовувати лише скінчені множини. Максимальна кількість елементів множини не повинна перевищувати 255 .

Оголошення множинного типу має такий формат:

Type

T = Set of S;

де T – ім’я множинного типу;

S – базовий тип елементів множини.

Самі значення задаються переліком його елементів, укладених у квадратні дужки. При цьому кожен елемент повинен входити до множини лише один раз. Якщо ж він включається декілька раз, повторне включення до множини не фіксується. Отже, множина може містити лише різні елементи. Порядок переліку елементів множини не грає ніякої ролі, важливим є лише наснять того чи іншого елементу в множині.

Приклади:

Type numbers =Set of 1..100;

Var A, B, C, Е, К, M: numbers;

N : integer;

A:=[1, 3, 5, 10, 53];

B:=[10, 3, 53, 1, 5];

C:=[1..7, 5, 9,13];

E:=[];

K:=[10..1];

N:=5;

M:=[N..2*N];

В наведеному прикладі змінні А та В являють собою однакові множини, тому що складаються з одних і тих же елементів. Змінна С складається з чисел 1, 2, 3, 4, 5, 6, 7, 9,13. Число 5 увійшло до множини двічі, тому друге входження не зафіксоване. Множина Е є порожньою, тобто, не містить жодного елементу. При визначенні множини К заданий діапазон, у якому ліва межа перевищує праву. При визначенні множин таке позначення допускається, однак воно не містить жодного елементу. Тобто, множина К також порожня. Множина М визначається через значення змінної N. В даному випадку вона складається з діапазону значень від 5 до 10.

Як видно з наведеного прикладу, для множин можна використовувати оператор присвоювання. Він задає значення змінним множинних типів. Для множин можна також конструювати вирази.  Серед операцій над множинами виділяють операції об’єднання (+), перетину (*) та різниці (–).

Об’єднанням двох множин є множина, яка складається з елементів, що належать хоча б одній з цих множин. Нехай є дві множини А:=[1..5, 7, 12] та
В:=[4..8]. Тоді, якщо С:=А+В, то С буде містити елементи з діапазону 1..8 і число 12.

Перетином двох множин є множина, яка складається з елементів, що належать кожній з цих множин. Якщо для наведених вище даних С:=А*В, то в результаті одержимо множину, що складається з чисел 4, 5 та 7.

Різницею двох множин є множина, яка складається з тих елементів першої множини, які не належать другій. Якщо С:=А–В, то результатом буде множина з елементів 1, 2, 3, 12.

Крім зазначених, для множин можна використовувати операції відношення. Їх запис та результат виконання наведені в табл.  1.6. Особливу увагу привертає операція перевірки входження елемента до множини. Вона позначається службовим словом in.

Таблиця 1.6. Операції відношення для множин.

 

Математичний запис

Запис мовою
Паскаль

Значення

True

False

A = B

A = B

Множини А та В співпадають

У протилежному випадку

A  B

A <> B

Множини А та В не співпадають

У протилежному випадку

A  B

A <= B

Всі елементи множини А належать множині В

У протилежному випадку

A  B

A >= B

Всі елементи множини В належать множині А

У протилежному випадку

X  A

X in A

Елемент Х входить до множини А.

У протилежному випадку

 

Завдання 1.2. Записати програму, яка друкує всі прості числа на проміжку 2..100.

program simpl;

type numbs = set of 2..100;

var x,y:numbs;

i,j:integer;

begin

x:=[2..100];

y:=[];

for i:=2 to 100 do

if i in x then

begin

y:=y+[i];

for j:=i+1 to 100 do

if j mod i = 0 then x:=x-[j];

end;

for i:=2 to 100 do

if i in y then write(i:4);

end.

В наведеній програмі послідовно перебирається множина чисел від 2 до 100 і з неї видаляються ті, які мають дільники. Відповідно, паралельно формується множина простих чисел як таких, які не мають дільників, відмінних від самого себе.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
25 26 27 28  Наверх ↑