Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
as.doc
Скачиваний:
37
Добавлен:
24.04.2019
Размер:
2.25 Mб
Скачать

3.6. Сд типу «множина»

Множина – скінчений набір елементів одного типу, для яких не важливий порядок слідування і жоден з елементів не може бути два рази включений. Така СД визначається конструкцією type T = set of T0, де T0 – вбудований або раніше визначений тип даних (базовий тип). Значеннями змінних типу T є множини елементів типу T0 (зокрема, порожні множини).

Кардинальне число множини (потужність) рівне кількості її елементів.

Набір допустимих операцій для СД типу «множина»: «*» – перетин множин, «+» – об’єднання множин, «-« – різниця множин, «in» – перевірка належності до множини елемента базового типу.

Дескриптор СД типу «множина» не відрізняється від дескриптора СД типу «масив».

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

Var s:set of 0..9;

n,ost,i:integer; {n – число, яке треба проаналізувати}

begin write(‘Input number’);

readln(n);

s:=[0,1,2,3,4,5,6,7,8,9]; {включили у множину всі цифри}

while n>0 do

{виділяємо цифри числа методом ділення його на 10}

begin

{визначаємо остачу від ділення}

ost:=n mod 10;

n:=n div 10;

if (ost in s) then s:=s-[ost] {здійснюємо операцію різниці}

end;

{виведемо всі цифри, що не належать до запису числа, за зростанням}

for i:=0 to 9 do

if i in s then write(i,’,’)

end.

Найчастіше множини використовуються для формування набору елементів, що зустрічаються у масивах лише один раз.

3.7. Сд типу «запис (прямий декартовий добуток)»

Запис – послідовність елементів, які, в загальному випадку, можуть бути одного типу. На логічному рівні СД типу «запис» можна записати так:

type Т = Record

S1: T1;

S2: T2;

………...

Sn: Tn;

End;

Тут: Ti змінюється при i = 1, 2, …, n; S1, …, Sn – ідентифікатори полів; Т1, …, Tn – типи даних. Якщо Ti також є у свою чергу записом, то Si – ієрархічний запис.

Якщо DT1 – множина значень елементів типу Т1, 2 – множина значень елементів типу Т2, … , n – множина значень елементів типу Тn, те DT – множина значень елементів типу Т буде визначатися за допомогою прямого декартового добутку: DT = DT1DT2  …  n. Іншими словами, множина допустимих значень СД типу «запис»: .

Допустимі операції для СД типу «запис» аналогічні до операцій для СД типу «масив».

Дескриптор СД типу «запис» містить у собі: умовне позначення, назва структури, кількість полів, вказівник на перший елемент (у випадку прямокутної СД), характеристики кожного елемента, умовні позначення типу кожного елемента, розмір слота, а також зсув, необхідний для обчислення адреси.

Загалом, зсув – це адреса компоненту (поля) ri щодо початкової адреси запису r. Зсув обчислюється так: ki = S1 + S2 + … + Si-1, i=1,2, …,n, де Si – розмір слота кожного елемента запису.

Дескриптор СД типу «запис», на відміну від дескриптора СД типу «масив», залежить від кількості елементів запису.

Приклад структури на мові Сі:

typedef struct { char name[20];

char city[30];

char dcount[10];

} school;

Тут оголошена структура (запис), що складається із 3 стрічкових компонентів різної довжини і визначено назву цієї структури – school.

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

#include<stdio.h>

#include<string.h>

struct school

{

char name[20];

char city[20];

char dcount[10];

} a[10];

void main()

{

// множина міст

char set[10][20];

//на початку роботи програми множина порожня

int k=0,i,j;

for(i=0;i<10;i++)

scanf("%s%s%s",&a[i].name,&a[i].city,&a[i].dcount);

strcpy(set[0],a[0].adress);

for(i=1;i<10;i++)

{

int l=0;

for(j=0;j<=k;j++)

//перевірка, чи є елемент у множині

if(strcmp(a[i].city,set[j])==0) l++;

//якщо немає, то включаємо

if(!l) strcpy(set[++k],a[i].city);

}

for(j=0;j<=k;j++)

printf("%s\n",set[j]);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]