Informatika_1 / 1pr opr / конспект лекцій 1 паск / Лекція 9
.docЛекція №9 Множини
Поняття множин, тип множини у мові Pascal. Програмування задач з використання множин
Ще один структурований тип розглядається в мові Pascal. Це множини. Вони досить рідко використовується при розв’язанні задач, але в ряду випадків їх використання дозволяє помітно збільшити компактність та наочність програм.
Значення множинного типу, так як і масиви, складаються з елементів одного базового типу. Базовим типом є будь-який простий тип, крім дійсного. На цілий тип накладається діапазонне обмеження. Множини в мові Pascal будуються так, як і в математиці. Множина може складатися з будь якої кількості різних елементів. Кількість елементів в множині називають його потужністю. Потужність елементів множини може бути до 65 534.
Множинний тип задається таким чином:
set of базовий тип.
Наприклад:
type
color = (red, yellow, blue);
m= set of 1..6;
var m1,m2:m;
n: set of color;
Значення множини зображується в квадратних дужках. Множина, яка не має ні одного елементу, називається порожньою ([ ]). Для множин виконується оператор присвоювання. Наприклад:
m1:= [1,3,6];
m2:=[];
n:=[red, blue];
m3:=[2..5];
Множина [4..2] трактується як порожня.
Елементи множини не можуть бути введені та виведені за допомогою стандартних процедур read та write.
Для змінних - множин дозволені операції:
об’єднання (+)
перетину (*)
різниці (-)
Наприклад,
[1,2]+[2,3] [1,2,3]
[1,2]*[2,3] [2]
[1,2]-[2,3] [1]
Множини можна порівнювати за допомогою операцій відношення =, <>, <=, >=. Логічний вираз m1=m2, де m1 і m2 однотипні множини, має значення true, якщо m1 і m2 містять однакові елементи. Якщо вони відрізняються хоча б одним елементом, то значення виразу m1<>m2 є true. Значення true мають такі вирази:
m1<=m2, якщо множина m1є підмножиною множини m2;
m1>=m2, якщо множина m2 є підмножиною множини m1.
Крім того є спеціальна операція in, яка дає змогу перевірити, чи належить елемент даній множині. Наприклад, треба визначити, чи входять голосні українські літери в рядок символів.
var s: string;
k,i: byte;
begin
readln(s);
k:=0;
for i:=1 to length(s) do
if s[i] in [‘a’,’е’,’і’,’о’,’є’,’у’] then k:=k+1;
if k<>0 then writeln(‘в речення входять голосні літери’)
else writeln(‘в речення не входять голосні літери’);
end.
Порядок розташування елементів в множині ніяк не фіксується. Так, наприклад, дві множини є однакові: [1,2,3] і [3,1,2]. Це відбувається тому, що для множин використовується наступний механізм розташування множин у памяті компютера. У відповідності з описом множини в пам’яті ЕОМ відводиться стільки біт пам’яті, скільки елементів може бути в множині. Коли змінній - множині присвоюється значення - множина, в пам’яті ЕОМ проставляється 1 біт, що відповідає елементу, присутньому в цьому значенні. Наприклад, змінній m1 в пам’яті ЕОМ відповідає ділянка
-
0
0
0
0
0
0
Після виконання оператора присвоювання
m1:=[1,3,6];
в пам’яті ЕОМ відбувається наступний запис:
-
1
0
1
0
0
1
За допомогою бітових операцій виконуються всі дії над множинами.
У зв’язку з тим, що множини не можна вводити з клавіатури та виводити на екран, робота з множинами викликає деякі труднощі. Для того, щоб спростити дію введення елементів у множину, існує стандартна процедура включення елементу в множину
include(x: базовий тип; var m: set of базовий тип);
Крім того є процедура для оберненої дії - виключення елементу з множини
exclude(x: базовий тип; var m: set of базовий тип).
Наприклад:
var r:set of 1..10;
i: integer;
begin
r:=[];
for i:=1 to 5 do include(r,i);
for i:=1 to 10 do
if i mod 2=0 then if i in r then
begin
writeln(i );
exclude(r, i );
include(r, i*2);
end;
end.
У порожньо спочатку множину добавляємо цілі числа від 1 до 4. Далі парні числа з тих, що містяться у множині, виводяться на екран та замінюються на подвоєне число. Таким чином отримуємо наступні стани множини r: [], [1,2,3,4,5], [1,4,3,8,5].
Взагалі множини є досить цікавою структурою, але коло задач, в яких використовуються множини, досить мале. Мабудь тому розробники мови Turbo Pascal не розширили інструментільну базу для роботи з множинами. Ті програмісти, що багато працюють з множинами, створюють власні модулі з функцій та процедур.
Контрольні запитання.
-
Яку структуру у мові Pascal називають множинами:
-
Які операції можна виконувати над множинами?
-
Які стандартні процедури існують для множин?
-
Що таке операція in?
Тести для підсумкового контролю.
-
Вказати рівні множини:
а)[‘a’..’d’], [‘a’,’b’,’c’,’d’];
б)[lito,zima], [zima,lito];
в)[AS], [0,AS];
г)[1,2,3,4], [1,4];
2. Які з приведених далі даних є неправильними з точки зору мови Pascal:
а) [‘A’,’B’,’C’,’K’]/[‘A’,’B’];
б) [5,6,1,3]>=[1,3,5,6];
в) [kub,shar]+[pripna];
г)[РІВНЯННЯ,СИСТЕМА]*[НЕРІВНІСТЬ,СИСТЕМА];
д)[3.5,7.1,2.0]-[1,2];
3. Яке з приведнних далі виразів приймає значення true:
а) [‘a’,’b’,’c’]=[‘b’,’c’,’a’];
б)[3,4,6]<=[2,8];
в)[]>=[1,2];
г)trunc(8.3) in [1..9];
д)succ(‘d’) in [‘b’..’d’];
4. Яке з приведнних далі виразів приймає значення false:
a) 16 in [16];
б)[3,4,6]<=[2..8];
в)[]>=[1,2];
г)trunc(8.3) in [1..9];
д)succ(‘c’) in [‘b’..’d’];
4. Обчислити вираз: [1..14]*[5,12..60]+[4..7] – [2..16]*[6];
а)[6];
б)[4..14];
в)[4,5,7,12,13,14];
г)[5,9,12,13,14];
6. Який з заданих виразів типу множин після спрощення має наступий вид: []:
а)(A-B)*A+(A-B)*B;
б)(A+B)*(A-B)*(B-A);
в)A+B-(A-B)-(B-A);
г) A-(A-B);
-
Яке значення отримає змінна р при виконанні наступного фрагменту програми:
var p: set of 0..9; i,j:integer;
begin
i:=3; j:=5;
p:=[i+3,j div 2,j..sqr(i)-3)];
а) [];
б)[2,5,6]
в)[3..9,3,6];
г)[5,2,6];
-
Яке значення отримає змінна р при виконанні наступного фрагменту програми:
var p: set of 0..9; i,j:integer;
begin
i:=3; j:=5;
p:=[2*i..j];
а) [];
б)[2]
в)[6..5];
г)[4..2];
-
var s: set of char; d: char;
Зміній s присвоїти множину літер, які більше с, але менше d:
а) if ( d>c) and (d<d) then s:=[d];
б) if ( d>’c’) and (d<’d’) then s:=[d];
в) s:=[];
г) s:=[d];
-
Вказати номера рядків фрагменту програми, в яких допущено помилки:
1 type m=set of char;
2 function f(a,b:m x:char):m;
3 begin
4 if a*b=0 then a:=[x]
5 else if a<b then a:=b+x
6 else if ord(x) in a-b then a:= a-[x..’<=’];
7 f:=a+b;
8 end;