Частина тексту файла (без зображень, графіків і формул):
Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Кафедра АПЕПС
Алгоритмізація та програмування - 2. Процедурне програмування
ЗВІТ
до лабораторної роботи № 4
«Списки»
Варіант № 15
Дата «2» червня 2022
Завдання:
1. Дослідити особливості створення одно- та дво-направлених списків.2. Вивчити і реалізувати механізми додавання нових записів у список, пошуку записів у списку за певними полями, видалення записів зі списку та редагування знайдених записів, а також збереження всього списку у файлі та зчитування списку із файлу до пам’яті з відновленням всіх зв’язків.3. Розробити Блок-схему програмного алгоритму.4. Оформити ЗВІТ до лабораторної роботи згідно вимог та методичних рекомендацій.
Завдання за варіантом:
/
Результат роботи:
1. Роздрукувати (вивести на екран) попередньо сформовані та підготовлені для запису в файл дані.2. Роздрукувати (вивести на екран) результат виконання операції читання даних із файлу.3. ЗВІТ до комп’ютерного практикуму для перевірки додати в Клас.4. Програмний код (відкритий для редагування) розмістити на сайті Repl.it (посилання виключно через кнопку «+Invite »).
Теорія та опис виконання:
Однозв'язний список — вид зв’язного списку, який складається з вузлів, кожен з яких містить у собі дані (інформаційну частину) та посилання на наступний вузол.
/
Двобічно зв'язаний список — вид зв’язного списку, у якому посилання в кожному вузлі вказують на попередній і на подальший вузол у списку.
Якщо в списку після останнього елемента йде перший, то такий список називається кільцевим двобічно зв'язаним списком. Тобто, поле prev голови списку вказує на хвіст списку, а поле next хвоста списку вказує на голову списку.
По двобічно зв'язаному списку можна пересуватися в будь-якому напрямку — як від початку до кінця, так і навпаки. Для нього простіше проводити видалення і перестановку елементів, оскільки завжди відомі адреси тих елементів списку, вказівник яких спрямований на змінюваний елемент.
/
Найчастіше вузлом списку вважають структурний тип (структуру), який зберігає у собі певну інформаційну частину (іншу структуру або тип даних) та посилання (вказівник) на наступний вузол у списку. Список має «голову», тобто вказівник на початок списку та інколи має кінець, проте найчастіше його не використовують.
Мабуть найголовнішою перевагою списку є набагато зручніша робота із динамікою. Наприклад, при створенні динамічного масиву, коли місце у ньому кінчається приходиться копіювати всі елементи, свторювати новий, більший за розміром, а старий видаляти. У спискам набагато зручніше додавати нові елементи. Але в той же час, його набагато складніше контролювати у порівнянні із звичайним масивом.
У самому завданні було створено клас List. У цьому класі реалізовано різні функції для повної реалізації списку. На початку самої програми користувач задає к-сть елементів списку(к-сть кінофільмів які він хоче додати) і заповнює кожен елемент даними. Кожен елемент записується в окремий файл. І далі по запиту користувача виводиться окремий файл, під тим ID, який ввів користувач.
Результат виконання:
/
/
Вигляд файлів:
/
/
Висновок:
Під час виконання даної лабораторної роботи було досліджено роботу одно- та дво-напрямлених списків. Виконано завдання, вказане відповідно до номеру варіанту(створенно однозв’язний список кінофільмів, та реалізовано функціонал роботи з ним). Дану роботу було реалізовано на мові програмування С++.
Силка на Replit: https://replit.com/join/cxptucdcgi-tr-15fundamient
Копія коду:
// Лабораторна робота №4
// Виконав Фундамент Даніїл ТР-15
// 01.06.2022
#include <iostream>
#include <fstream>
#include <iostream>
using namespace std;
template<class T>
class Node {
public:
Node *pNext;
T data;
Node(T data = T(), Node *pNext = nullptr) {
this->data = data;
this->pNext = pNext;
}
};
template<class T>
class List {
public:
~List();
List();
int GetSize() {
return listSize;
}
void pushBack(T data);
T& operator[](const int ind);
void removeList(int ind);
void printToFile(std::string kinosFile);
void getFromFile(std::string kinosFile);
private:
int listSize;
Node<T> *pHead;
};
template<class T>
List<T>::List() {
listSize = 0;
pHead = nullptr;
}
template<class T>
void List<T>::pushBack(T data){
if(pHead == nullptr) {
pHead = new Node<T>(data);
} else {
Node<T> *current = this->pHead;
while(current->pNext != nullptr) {
current = current->pNext;
}
current->pNext = new Node<T>(data);
}
listSize++;
}
template<class T>
T & List<T>::operator[](const int ind) {
int count = 0;
Node<T> *current = this->pHead;
while(current != nullptr) {
if(count == ind) {
return current->data;
}
current = current->pNext;
count++;
}
}
template<class T>
void List<T>::removeList(int ind) {
if(ind == 0) {
Node<T> *first = this->pHead;
pHead = first->pNext;
delete first;
listSize--;
} else {
Node<T> *prev = this->pHead;
for(int i = 0;i < ind - 1;i++) {
prev = prev->pNext;
}
Node<T> *next = prev->pNext;
prev->pNext = next->pNext;
delete next;
listSize--;
}
}
template<class T>
List<T>::~List() {
for(int i = 0; i < listSize; i++) {
removeList(i);
}
}
template<class T>
void List<T>::printToFile(std::string kinosFile){
std::ofstream file;
file.open(kinosFile);
if(listSize != 0) {
Node<T> *current = this->pHead;
while(current->pNext != nullptr) {
file << current->data << std::endl;
current = current->pNext;
}
file << current->data;
}
file.close();
}
template<class T>
void List<T>::getFromFile(std::string kinosFile){
std::ifstream file;
file.open(kinosFile);
if(listSize != 0) {
while(listSize != 0) {
this->removeList(0);
}
}
std::string input;
while(file >> input) {
this->pushBack(input);
}
file.close();
}
int main() {
int size;
cout << "---- К-сть фільмів(елементів списку) ----";
cout << endl;
cin >> size;
cout << endl;
List<string> kinos[size];
string str;
for(int i = 0; i < size; i++){
cout << "---- Фільм під ID " << i << " ----";
cout << endl;
cout << "Введіть назву фільма: ";
cin >> str;
kinos[i].pushBack(str);
cout << "Введіть прізвище режисера: ";
cin >> str;
kinos[i].pushBack(str);
cout << "Введіть час сеансу: ";
cin >> str;
kinos[i].pushBack(str);
cout << "Введіть тривалість фільму (у хв): ";
cin >> str;
kinos[i].pushBack(str);
cout << "Введіть ціну на квиток: ";
cin >> str;
kinos[i].pushBack(str);
cout << "Введіть к-сть глядачів: ";
cin >> str;
kinos[i].pushBack(str);
cout << endl;
}
string kinosFile[size];
for(int i = 0; i < size; i++){
kinosFile[i] = to_string(i) + ".txt";
kinos[i].printToFile(kinosFile[i]);
}
int number = 1;
List<string> result;
cout << endl;
while(true) {
switch(number) {
case 1 : {
cout << "---- Вкажіть ID фільму для зчитування ----";
cout << endl;
cin >> number;
cout << endl;
result.getFromFile(kinosFile[number]);
cout << "---- Фільм № " << number << " ----" << endl;
cout << "Назва фільму: " << result[0] << endl;
cout << "Прізвище режисера: " << result[1] << endl;
cout << "Час сеанс: " << result[2] << endl;
cout << "Тривалість фільму (у хв): " << result[3] << endl;
cout << "Ціна квитка: " << result[4] << endl;
cout << "К-сть глядачів: " << result[5] << endl;
cout << endl;
cout << "---- Оберіть функцію для виконання ----" << endl;
cout << "1. Вивести кіно під певним ID" << endl;
cout << "2. Вийти із програми" << endl;
cin >> number;
cout << endl;
}
break;
default : {
return 0;
}
}
}
}