Частина тексту файла (без зображень, графіків і формул):
Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Кафедра АПЕПС
Алгоритмізація та програмування - 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;
}
}
}
}
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!