You are on page 1of 32

МІНІСТЕРСТВО

ОСВІТИ ТА НАУКИ УКРАЇНИ

Національний технічний університет України

«Київський політехнічний інститут імені Ігоря Сікорського»

Кафедра інформаційних систем та технологій

Звіт

з лабораторної роботи № 3

на тему «Абстрактні типи даних.»

з дисципліни «Теорія алгоритмів»

Варіант №3

Виконали:
Поліщук Дарія
Вінницький Артем
Заскалета Богдан
Перевірив:
Дорошенко К.С.

Київ 2023
Лабораторна робота №4
Абстрактні типи даних
Мета роботи: порівняння реалізацій абстрактних типів даних,
побудованих на базі різних структур даних.

Завданння: Ознайомитися з реалізаціями абстрактних типів


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

Постановка задачі
Умова нашої задачі потребувала реалізації процесу виставлення
оцінок з перевірених робіт до кампусу. Для цього нам треба було
створити симуляцію “стопки перевірених робіт”, себто, базу
даних, в якій зберігатимуться дані про студента, що виконував
роботу, і оцінка за відповідну роботу; симуляцію “кампусу”, в
нашому випадку - бази даних, куди зберігатимуться відомості
(номери, прізвища, імена та оцінки усіх студентів усіх груп) та
інтерфейсу для заповнення “кампусу” на основі взаємодії
програми з “стопкою перевірених робіт”.

В цьому практикумі ми досліджуємо АТД “Однобічний лінійний


список”, бо нам необхідна можливість додавати елементи у
порядку надходження, видаляти певний елемент зі списку та
виводитись у порядку додавання. Ми не використовуємо АТД
“Черга”, бо це - циклічний, а не лінійний список.
В програмі присутня реалізація даного АТД трьома способами: за
допомогою вбудованих контейнерів мови C#, за допомогою
масивів і за допомогою курсорів (замісників покажчиків у мовах,
де неможливо працювати з вказівниками).

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

Основні та Тип змінної Призначення


допоміжні змінні

Group class клас групи, в якому


зберігаються назва
групи та список
студентів

Group.GroupName string назва групи

Group.Works List<Student> колекція робіт


студентів групи

Student class клас робіт, в якому


зберігаються дані
про студента та
оцінка за роботу
Student.Number string номер студента в
групі

Student.Surname string прізвище студента

Student.FirstName string ім’я студента

Student.Mark int оцінка за роботу


студента

groups List<Group> колекція усіх груп

countGroup int кількість


відомостей, що
були занесені у
кампус

countWorksInGroup int кількість робіт у


відкритій відомості

closedGroups List<string> список з назвами


вже заповнених
відомостей

groupAdded List<Student> кількість робіт, вже


занесених до
відкритої відомості

Розробка алгоритму

Алгоритм 1 (вбудовані списки)


Алгоритм 2 (через масиви):
Алгоритм 3 (через вказівники):
Аналіз складності алгоритму
Реалізація через List

У даному алгоритмі присутня перевірка в циклі на те, чи усі


роботи в групі були додані до відомості. Ця перевірка
виконується countWorksInGroup разів, складність тут буде O(n).
Занесення групи робіт до кампусу має складність O(n), бо
залежить від кількості робіт у групи. Вищезгадані кроки
виконуються певну кількість разів – countGroups, що залежить
від кількості груп, що потрібно занести до відомості. Складність
цієї перевірки буде O(n). Отже, загальна складність алгоритму
буде О(O(n)) = O(n*n) = O(n^2).

Реалізація через масиви

З точки зору складності алгоритму реалізація через масиви


відрізняється від попередньої тільки у додаванні елементів:
додавання нового елементу буде не О(1), а O(n), оскільки усі
елементи, що знаходяться після елементу із вказаним індексом,
мають бути переміщені. Через це загальна кількість становитиме
О(n^3).

Реалізація через вказівники

Як і попередня реалізація, ця відрізняється від першої тільки в


одному місці - при занесенні групи робіт до кампусу. Складність
цієї операції становитиме O(n^2), а не O(n). Загальна складність
становитиме O(n^3).

Скриншоти роботи програми для вирішення


поставленої задачі
1.Запуск програми

2. Натиснута кнопка Start


3.Введення коректної назви групи

4.Натискання "Наступна робота" за коректних умов


5.Натискання "Наступна робота", коли попередня робота ще не
збережена у відомості

6.Натискання кнопки "Заповнити дані"


7.Натискання кнопки "Додати роботу" за коректних умов

8.Натискання кнопки "Додати роботу", коли дана робота вже є у


відомості
9.Натискання кнопки "Видалити роботу" за коректних умов

10.Натискання кнопки "Видалити роботу" за некоректних умов


11.Натискання кнопки "Додати роботу" за некоректних умов

12.Натискання кнопки "Відкрити відомість" за умови введення


некоректної назви
13.Натискання кнопок "Наступна робота", "Заповнити дані" чи
"Додати роботу", коли відомість заповнена

13.Натискання кнопки "Закрити відомість"


Таблиця тестування програми

Кнопка Умова Результа Вивід Мета


натиску т перевірки
Start - Відомий Меню Перевірка
вибору груп коректності
відомості роботи
програми

Вибрати Введення Відомий Відкриття Перевірка


відомість коректної назви меню коректності
групи ( “ІС-21”, заповнення роботи
“ІС-22”, “ІС- відомості програми
23”)

Вибрати Введення Відомий Виведення Перевірка


відомість некоректної на екран: коректності
назви (“Іс- “Введіть роботи
щулвпщвл”) правильну програми
групу”

Наступна За коректних Відомий Виводиться Перевірка


робота умов на екран дані коректності
про роботу роботи
програми

Наступна Коли попередня Відомий Виведення Перевірка


робота робота, ще не на екран: коректності
збережена у “Ви ще не роботи
відомості занесли програми
роботу цього
студента у
відомість.”

Заповнити - Відомо Дані про Перевірка


дані роботу коректності
автоматично роботи
переносяться програми
у поля
кампус

Додати Введення Відомо Дані про Перевірка


роботу коректних роботу коректності
даних переносяться роботи
у кампус програми

Додати Введення Відомо Виведення Перевірка


роботу некоректних на екран: коректності
даних ( дані “Неправильн роботи
студента не о заповнено програми
співпадають з дані студента
даними у
студента у відомості .Бу
стовпці дь ласка,
перевірених перевірте
робіт) заповнені
поля”

Додати Введення Відомо Виведення Перевірка


роботу некоректних на екран: коректності
даних (коли “Ви вже роботи
дана робота вже занесли програми
є у відомості) роботу цього
студента у
відомість”

Видалити Введення Відомо Виведення Перевірка


роботу коректних на екран: коректності
даних “Робота роботи
студента з програми
номером n
була
видалена з
відомості ”

Видалити Введення Відомо Виведення Перевірка


роботу некоректних на екран: коректності
даних (якщо “Робота роботи
робота уже студента із програми
видалена, або не заданим
добавлена) номером
була немає у
відомості ”

Наступна Коли відомість Відомо Виведення Перевірка


робота, заповнена на екран: коректності
Заповнити “Ви вже роботи
дані чи занесли всіх програми
Додати студентів у
роботу цій групі ”

Закрити Усі роботи Відомо Кнопка Перевірка


відомість занесені у доступна і коректності
відомість закриває роботи
відомість програми

Закрити Не всі роботи Відомо Кнопка не Перевірка


відомість занесені у доступна коректності
відомість роботи
програми

Перевірка правильності програми

Згідно з умовою, програма симулює стопку перевірених


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

Порівняння реалізацій

Реалізації через масиви і через вказівники мають свої переваги і


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

Залежно від реалізації, складність виконання деяких методів в


АТД змінюється. Наприклад, при використанні масивів час
виконання методів Insert та Delete збільшується пропорційно
кількості елементів, що слідують після даного елементу. При
цьому час отримання сусідніх елементів постійний при
використанні масивів, на відміну від вказівників, при
використанні яких час даних операцій буде збільшуватися
пропорційно довжині списку.

Результати досліджень у вигляді графіка


Висновок

Під час виконання даного лабораторного практикуму було


розглянуто та проаналізовано різні АТД. Один з видів АТД,
лінійний однозв’язний лінійний список, ми використали для
реалізації умови нашого завдання.

Реалізація нашого завдання виконана програмою, що надає


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

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

1.Поясніть різницю між термінами «тип даних», «абстрактний


тип даних» та «структура даних». Для чого вони
застосовується?

"Тип даних" - це поняття, яке використовується для класифікації


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

"Абстрактний тип даних" - це спосіб опису типу даних з точки


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

Використання правильних типів даних допомагає уникнути


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

2. Проаналізуйте АТД «зв’язний лінійний список»; перерахуйте,


які різновиди списків бувають.

Абстрактний тип даних "зв'язний лінійний список" (linked list) -


це структура даних, яка складається з послідовності вузлів, які
зв'язані між собою за допомогою посилань. Кожен вузол зберігає
дані та посилання на наступний вузол в послідовності.

Зв'язні лінійні списки можуть бути односпрямовані (singly


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

Також існує циклічний зв'язний список (circular linked list), де


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

Зв'язні лінійні списки мають декілька переваг у порівнянні з


масивами, так як дозволяють динамічне додавання та видалення
елементів без перестановки всього списку, а також забезпечують
можливість ефективного доступу до будь-якого елементу у
списку.

Однак, використання зв'язних лінійних списків також має певні


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

Зв'язні лінійні списки є важливим типом даних, який


застосовується в багатьох програмах, таких як операційні
системи, бази даних, графічні інтерфейси та інші. Вони є
основою для багатьох алгоритмів, наприклад, для сортування,
пошуку та фільтрації даних.
3.Проаналізуйте АТД «стек»; перерахуйте, які операції можна
виконувати з цим АТД.

Стек є одним з найпоширеніших абстрактних типів даних та


використовується в багатьох програмах та алгоритмах. Його
основна ідея полягає у тому, що елементи даних зберігаються в
спеціальному порядку, який називається "принципом останнього
ввійшов - першим вийшов" (LIFO - Last In First Out).

Стек має дві основні операції:

● Push - додавання елементу до стеку. При цій операції


елемент додається до вершини стеку.
● Pop - видалення елементу зі стеку. При цій операції зі
стеку видаляється останній доданий елемент з вершини.

Окрім цього, є ще декілька операцій, які можуть бути виконані зі


стеком:

● Peek - повертає елемент, що знаходиться на вершині стеку,


без видалення його зі стеку.
● Size - повертає кількість елементів в стеку.
● isEmpty - перевіряє, чи є стек порожнім.
● isFull - перевіряє, чи є стек заповненим.

Стек може бути реалізований за допомогою різних структур


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

При вставці нового елемента в стек потрібно виконати наступні


дії:

1. Перевірити, чи є достатньо місця в стеку для зберігання


нового елемента. Якщо ні, то можна повернути помилку
стекового переповнення або збільшити розмір стеку.
2. Додати новий елемент до стеку. Це можна зробити,
наприклад, за допомогою операції push, яка додає елемент
до верхнього кінця стеку.
3. Оновити вказівник на вершину стеку. Після додавання
нового елемента вказівник на вершину стеку повинен
вказувати на новий елемент.
4. Перевірити, чи був успішно доданий новий елемент. Це
можна зробити, наприклад, перевіривши, чи відповідає
вершина стеку вставленому елементу.

В результаті цих дій новий елемент буде доданий до стеку, а


вказівник на вершину стеку буде вказувати на нього. Цей процес
можна повторювати стільки разів, скільки потрібно додати
елементів до стеку.

5.Перерахуйте послідовність дій при видаленні елемента зі


стеку.

При видаленні елемента зі стеку потрібно виконати наступні дії:

1. Перевірити, чи є елементи в стеку. Якщо стек порожній,


то можна повернути помилку стеку під час видалення.
2. Взяти елемент з верхнього кінця стеку. Це можна зробити
за допомогою операції pop, яка видаляє елемент з
верхнього кінця стеку та повертає його значення.
3. Оновити вказівник на вершину стеку. Після видалення
елемента з верхнього кінця стеку вказівник на вершину
стеку повинен вказувати на попередній елемент, якщо він
існує.
4. Перевірити, чи був успішно видалений елемент. Це можна
зробити, наприклад, перевіривши, чи не дорівнює
видалений елемент NULL.

В результаті цих дій з верхнього кінця стеку буде видалено


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

6.Проаналізуйте АТД «черга»; перерахуйте, які операції можна


виконувати з цим АТД.

АТД "черга" (queue) - це колекція даних, яка працює за


принципом "перший прийшов - перший вийшов" (FIFO, First In
First Out). Це означає, що елементи, які були додані до черги
першими, будуть видалятися з неї першими, а елементи, які були
додані пізніше, будуть видалятися пізніше.

Операції, які можна виконувати з чергою, включають:

● Enqueue - додавання елемента до кінця черги.


● Dequeue - видалення першого елемента з початку черги.
● Peek - повернення значення першого елемента без його
видалення з черги.
● Size - повернення кількості елементів в черзі.
● isEmpty - перевірка, чи є черга порожньою.
● isFull - перевірка, чи є черга повною (в залежності від
реалізації черги).

Ці операції дозволяють додавати елементи до черги, видаляти їх з


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

7.Перерахуйте послідовність дій при вставці елемента до черги.

При вставці елемента до черги необхідно виконати наступні дії:

1. Перевірити, чи є в черзі місце для нового елемента (якщо


черга має обмежену довжину).
2. Додати елемент до кінця черги (enqueue).
3. Збільшити лічильник розміру черги.

Якщо черга реалізована з використанням зв'язаного списку, то на


крок 2 потрібно створити новий вузол, що містить значення
елемента, та зв'язати його з попереднім останнім вузлом черги.
Потім необхідно оновити посилання на останній вузол черги.

Якщо черга реалізована з використанням масиву, то на крок 2


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

8.Проаналізуйте АТД «однозв’язний лінійний список»;


перерахуйте, які операції можна виконувати з цим АТД.

АТД "однозв'язний лінійний список" - це структура даних, що


складається з вузлів, де кожен вузол містить дані та посилання на
наступний вузол у списку. Також існує спеціальний вузол, що
вказує на початок списку.

Операції, які можна виконувати з цим АТД, включають наступні:

1. Додавання елементу в кінець списку (push)


2. Додавання елементу на початок списку (unshift)
3. Видалення елементу з початку списку (shift)
4. Видалення елементу з кінця списку (pop)
5. Вставка елементу в певну позицію списку (insert)
6. Видалення елементу з певної позиції списку (remove)
7. Отримання елементу з певної позиції списку (get)
8. Пошук елементу в списку (search)
9. Отримання довжини списку (length)
10. Перевірка, чи є список порожнім (isEmpty)

Ці операції можна виконувати з допомогою відповідних методів,


що реалізовані в класі або структурі, що відповідає за реалізацію
даного АТД.

9.Перерахуйте послідовність дій при вставці елемента в


середину списку.
При вставці елемента в середину списку потрібно виконати
наступні кроки:

1. Знайти вузол, після якого буде вставлений новий елемент.


2. Створити новий вузол з даними, які потрібно вставити в
список.
3. Встановити посилання нового вузла на наступний вузол,
тобто той, що йде після вузла, перед яким вставляється
новий вузол.
4. Встановити посилання вузла, перед яким вставляється
новий вузол, на новий вузол.
5. Оновити посилання на початок та кінець списку, якщо
відбулися зміни.

Якщо потрібно вставити елемент в кінець списку, можна просто


використати операцію "push". Якщо потрібно вставити елемент
на початок списку, можна використати операцію "unshift".

10.Перерахуйте послідовність дій при видаленні елемента з


середини списку.

При видаленні елемента з середини списку потрібно виконати


наступні кроки:

1. Знайти вузол, який містить елемент, що потрібно


видалити.
2. Оновити посилання вузла, що йде перед вузлом, який
містить елемент, так, щоб воно вказувало на вузол, який
йде після вузла з елементом, що видаляється.
3. Оновити посилання на початок та кінець списку, якщо
відбулися зміни.

Якщо потрібно видалити елемент з початку списку, можна


використати операцію "shift". Якщо потрібно видалити елемент з
кінця списку, можна використати операцію "pop".

11.Перерахуйте послідовність дій при видаленні елемента з


кінця списку.

При видаленні елемента з кінця списку потрібно виконати


наступні кроки:

1. Знайти вузол, який містить елемент, що потрібно


видалити.
2. Знайти вузол, який йде перед вузлом, що містить елемент,
що потрібно видалити.
3. Оновити посилання вузла, що йде перед вузлом, щоб воно
вказувало на null, оскільки вузол з елементом, що
видаляється, стає останнім вузлом у списку.
4. Оновити посилання на кінець списку, так, щоб воно
вказувало на вузол, що йде перед вузлом, який містить
елемент, що видаляється.

Якщо потрібно видалити елемент з початку списку, можна


використати операцію "shift". Якщо потрібно видалити елемент з
середини списку, можна використати описаний вище алгоритм.

You might also like