Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
22
Добавлен:
07.02.2016
Размер:
51.2 Кб
Скачать

Лекція №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 не розширили інструментільну базу для роботи з множинами. Ті програмісти, що багато працюють з множинами, створюють власні модулі з функцій та процедур.

Контрольні запитання.

  1. Яку структуру у мові Pascal називають множинами:

  2. Які операції можна виконувати над множинами?

  3. Які стандартні процедури існують для множин?

  4. Що таке операція in?

Тести для підсумкового контролю.

  1. Вказати рівні множини:

а)[‘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);

  1. Яке значення отримає змінна р при виконанні наступного фрагменту програми:

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];

  1. Яке значення отримає змінна р при виконанні наступного фрагменту програми:

var p: set of 0..9; i,j:integer;

begin

i:=3; j:=5;

p:=[2*i..j];

а) [];

б)[2]

в)[6..5];

г)[4..2];

  1. 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. Вказати номера рядків фрагменту програми, в яких допущено помилки:

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;

Соседние файлы в папке конспект лекцій 1 паск