- •1.1. Визначення інформації
- •1.2. Визначення алгоритму
- •1.3. Виконавці алгоритмів
- •1.4. Способи описання алгоритмів
- •1.5. Властивості алгоритмів
- •1.6. Поняття обчислювальної складності
- •1.7. Класи алгоритмів
- •1.7.1. Експоненційні алгоритми та перебір
- •1.7.2. Алгоритм із поверненнями назад
- •1.7.3. Машини Тьюринґа
- •Будь-який алгоритм може бути реалізований відповідною машиною Тьюринґа.
- •Усе, що реалізовано в одній з цих конструкцій, можна зробити і в інших.
- •1.7.4. Рекурсія та її використання
- •1.7.5. Теза Чорча. Алгоритмічно нерозв’язні проблеми
- •2.1. Поняття структури даних
- •2.2. Рівні описуваннявання даних
- •2.3. Класифікація структур даних у програмах користувача й у пам’яті комп’ютера
- •2.4. Основні види складених типів даних
- •2.4. Структури даних у пам’яті комп’ютера
- •2.4.1. Структури даних в оперативній пам’яті
- •2.4.2. Сд у зовнішній пам’яті
- •3.1. Поняття структури даних типу «масив»
- •3.2. Набір допустимих операцій для сд типу «масив»
- •3.3. Дескриптор сд типу «масив»
- •3.4. Ефективність масивів
- •3.5. Зберігання багатовимірних масивів
- •3.6. Сд типу «множина»
- •3.7. Сд типу «запис (прямий декартовий добуток)»
- •3.8. Сд типу «таблиця»
- •3.9. Сд типу «стек»
- •3.9.1. Дескриптор сд типу «стек»
- •3.9.2. Області застосування сд типу «стек»
- •3.10. Сд типу «черга»
- •3.11. Сд типу «дек»
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, DТ2 – множина значень елементів типу Т2, … , DТn – множина значень елементів типу Тn, те DT – множина значень елементів типу Т буде визначатися за допомогою прямого декартового добутку: DT = DT1 DT2 … DТ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]);
}