Інформаційно-довідкова система

МІНІСТЕРСТВООСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙТЕХНІЧНИЙ УНІВЕРСИТЕТ
«ХАРКІВСЬКИЙПОЛІТЕХНІЧНИЙ ІНСТИТУТ»
КафедраОбчислювальної техніки та програмування

ЗАТВЕРДЖУЮ
Завідувач кафедри ОТП
__________ /xxxxxxxxx./
“___” __________ 2007р. Розрахунково-графічне завдання № 1, 2ІНФОРМАЦІЙНО-ДОВІДКОВА СИСТЕМА
Специфікація
ЛИСТЗАТВЕРДЖЕННЯ
Xxxxxxxx
Розробники
Керівник проекту
__________ /доц. xxxxxxx./
“___” __________ 2007 р.
Виконавець
__________ /студ. xxxxxxx./
“___” __________ 2007 р.
2007
УЗГОДЖЕНО
xxxxxxxxxxxxxx
 Розрахунково-графічне завдання № 1, 2ІНФОРМАЦІЙНО-ДОВІДКОВА СИСТЕМА
Специфікація
xxxxxxxxxxxxx
2007Формат Позначення Найменування Кількість Примітка А4 Xxxxxxxxxxx-01 81 ТЗ Технічне завдання 2 А4 Xxxxxxxxxxx-01 81 ПЗ Пояснювальна записка 6 А4 Xxxxxxxxxxx-01 81 ОП Програма та методика іспитів 2 А4 Xxxxxxxxxxx-01 81 ТП Текст програми 4-6
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙТЕХНІЧНИЙ УНІВЕРСИТЕТ
«ХАРКІВСЬКИЙПОЛІТЕХНІЧНИЙ ІНСТИТУТ»
КафедраОбчислювальної техніки та програмування
ЗАТВЕРДЖУЮ
Завідувач кафедри ОТП
__________ /xxxxxxxxx./
“___” __________ 2007р. Розрахунково-графічне завдання № 1, 2ІНФОРМАЦІЙНО-ДОВІДКОВА СИСТЕМА
Технічнезавдання
ЛИСТЗАТВЕРДЖЕННЯ
Xxxxxxxxxxx-01 81 01-1-ЛЗ
Розробники
Керівник проекту
__________ /доц. xxxxxxx./
“___” __________ 2007 р.
Виконавець
__________ /студ. xxxxxxxx./
“___” __________ 2007 р.
2007
1. Вступ
 
У даномурозрахунковому завданні розглянутий поліморфний список об’єктів. Технічніособливості програми розглянуті нижче.
2. Підстава для розробки
Підставою длярозробки програми є отримання завдання за темою «Інформаційно-довідковасистема».
3. Мета і призначеннярозробки
Мета роботи –засвоїти принцип використання поліморфних списків об’єктів і реалізувати роботупрограмного забезпечення, що використовує ці принципи. Програма призначаєтьсядля обробки таблиць даних.
4. Вимоги до розробки
Розроблена програма повинна виконувати такіпункти:
–     Створенняполіморфного списку об’єктів;
–     Вивідйого на екран;
–     Занесенняу файл;
–     Зчитуванняз файлу;
–     Пошукзапису;
–     Редагуваннязапису;
–     Вставканового запису;
–     Знищеннязапису;
–     Виконаннязадачі;
–     Вихід.
5. Стадії таетапи розробки
1. Створення класів;
2. Застосування поліморфізму;
3. Створення двонаправленого спискута робота з ним;
4. Втілення можливостей для даноїпрограми, розглянутих у п.4;
5. Ввід та вивід інформації.
6. Показ результатів.
6. Порядок контролю таприйомки
Розробленепрограмне забезпечення повинно:
— виконуватиасоціативний пошук даних на основі розробленого алгоритму;
— легкоадаптуватися при модифікації структури даних;
— забезпечуватидружній інтерфейс із користувачем і можливість настроювання параметрів дерева вдіалоговому режимі.
Відмовлення ЕОМ уроботі не повинний приводити до значних втрат інформації.
Розроблювальнепрограмне забезпечення має функціонувати в середовищі MS-DOS та Windows іповинний бути написаний мовою C++/С.
7. Програмна документація
Для розроблювального виробу повиннібути складені програмні документи:
— Специфікація;
— Технічне завдання;
— Пояснювальна записка;
— Програма та методика іспиту;
— Текст програми.
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙТЕХНІЧНИЙ УНІВЕРСИТЕТ
«ХАРКІВСЬКИЙПОЛІТЕХНІЧНИЙ ІНСТИТУТ
КафедраОбчислювальної техніки та програмування
ЗАТВЕРДЖУЮ
Завідувач кафедри ОТП
__________ /Xxxxxxxxxxx./
»___” __________ 2007р. Розрахунково-графічне завдання № 1, 2ІНФОРМАЦІЙНО-ДОВІДКОВА СИСТЕМА
Пояснювальназаписка
ЛИСТЗАТВЕРДЖЕННЯ
Xxxxxxxxxxx-01 81 01-1-ЛЗ
Розробники
Керівник проекту
__________ /доц. Xxxxxxxxxxx./
“___” __________ 2007 р.
Виконавець
__________ /студ. Xxxxxxxxxxx./
“___” __________ 2007 р.
2007
Анотація
У даномурозрахунково-графічному завданні докладно розглядається алгоритми поліморфнихсписків об’єктів, розроблена програма, що реалізує алгоритм поліморфних списківоб’єктів та інтерфейсна частина програми мовою C++.
Пояснювальназаписка містить достатньо прикладів та теоретичну частину для самостійногорозгляду та опанування теми «Поліморфні списки об’єктів».

Аннотация
В данномрасчетно-графическом задании подробно рассматривается алгоритмы полиморфныхсписков объектов, разработанная программа, которая реализует алгоритмполиморфных списков объектов и интерфейсная часть программы языком C++.
Объяснительная запискасодержит достаточно примеров и теоретическую часть для самостоятельногорассмотрения и овладение темы «Полиморфные списки объектов».
Annotation
In the givensettlement-graphic task in details is described algorithms of polymorphic listsof the objects, the developed program which realizes algorithm of polymorphiclists of objects and the interface part of the program language C++.
The explainannotation contains enough examples and a theoretical part for independentconsideration and mastering of a theme « polymorphic lists of objects».
Зміст
1.        Вступ
2.        Призначення
3.        Технічніхарактеристики
4.        Отриманірезультати
5.        Списоквикористаної літератури
С++ — це спробарішення розроблювачами мови С завдань об¢єктно- орієнтованого програмування(Object Oriented Programming, OOP). Побудований на твердому фундаменті С, С++крім ООР підтримує безліч інших корисних інструментів, ні жертвуючи при цьомуні міццю, ні елегантністю, ні гнучкістю С. С++ став універсальною мовою дляпрограмістів усього миру. Саме на мові С++ проводиться навчання студентів увузах вищих навчальних закладів для підготовки подальшої бази для гарногопрацевлаштування. С++ містить зручний інтерфейс для користувача початківця длярозробки простіших задач але має також і можливості для розробки складнихпрограм.
У даній роботішироко використовується поліморфізм та двонапрямлений список класів.
1.        Призначеннята область використання
Призначення даноїпрограми – збереження інформації о музичних альбомах: назва, рік випуску,кількість треків, кількість бонусних треків та довготи звучання.
Розроблена програма повинна виконувати:
–     Створенняполіморфного списку об’єктів;
–     Вивідйого на екран;
–     Занесенняу файл;
–     Зчитуванняз файлу;
–     Пошукзапису;
–     Редагуваннязапису;
–     Вставканового запису;
–     Знищеннязапису;
–     Знаходженнязапису найменшою кількістю треків у заданому діапазоні років
–     Вихід.
Використовуватидану програму можна для вивчення принципу роботи зі поліморфізмом та списком.
При роботі зісписками на практиці частіше усього приходиться виконувати наступні операції:
–          знайтиелемент з заданими властивостями;
–          знайтиперший елемент у лінійному списку;
–          вставитиелемент до та після вказаного вузла;
–          видалитиконкретний елемент із списку;
–          упорядкувативузли списку у конкретному порядку.
2.        Технічніхарактеристики
Функціонуваннясистеми цілком забезпечується стандартною конфігурацією IBM сумісних персональнихЕОМ. Для експлуатації системи необхідний IBM/PC AT з CPU типу k286 чи вище,обсягом оперативної пам’яті 4 Мбайт і накопичувачем на HARD диску обсягом неменш 200 Мбайт.
Що стосуєтьсяданої програми, то вхідними даними є інформація типу int та char. Вихідні даніє типами цих же типів. Основні функції встановлюють інформацію або виводять їїна екран.
Нижче приведенісхеми алгоритму головної функції void main().(Дивись малюнок 1.1)

3.        Очікуванітехніко-економічні показники
Дана програмазаймає мінімальний об’єм пам’яті. Поширена інформація щодо вимог зазначенавище. Економічні прибутки не розглядаються, оскільки дана програма є об’єктомдля навчання. Є можливість щодо використання її як посібника для наступнихкурсів.
4.        Розробка
У програмі використовуєтьсяполіморфізм, інкапсуляція та успадкування, яскраво представлено ООП. Призвернені до батьківського класу, викликаються функції насліднихкласів(поліморфізм).При успадкуванні наслідні класи мають доступ до полівбатьківського класу. Використано віртуальні функції та поліморфний списокоб’єктів.
Інкапсуляціядозволяє «заховати» змінні-елементи класу.
Опис класів
album Змінна Призначення Методи Призначення
Nazv
God
Назва альбому
Рік випуску
virtual void input()
virtual void output() Вод та вивод інформації
аlbum1Змінна Призначення Методи Призначення Trek Кількість треків
–//–
int getTrek()
void setTrek()
–//–
Встановлення значення trek
аlbumЗмінна Призначення Методи Призначення Time Протяжність за часом
–//–
int getTime()
void setTime()
–//–
Встановлення значення time
album3Змінна Призначення Методи Призначення Bonus Кількість бонусних треків
–//–
Int getBonus(), void setBonus()
–//–
Встановлення значення bonus
ToolЗмінна Призначення Методи Призначення
T
*d
*right
*left
Змінна списку Указ. на об’єкт Указ. на об’єкт-> Указ. на об’єктTrstЗмінна Призначення Методи Призначення
*head
*tail
*current Указ. на голову Указ. на хвіст Указ. на текущій Void add(int type, int vvod) Додавнна нових елементів списку
Клас аlbum – це базовий(батьківський) клас, що містить два інформаційних поля: назву альбому (строковийтип) та рік випуску (цілочисловий тип). Він має дві віртуальні функції(вводу/виводу), та конструктор з деструктором.
Клас аlbum1 – цеклас-нащадок класу аlbum, він містить інформаційне поле, що несе інформацію окількості треків у альбомі. Він також має віртуальні функції (вводу/виводу) таконструктор з деструктором, але ще він має дві функції що створюють поле trek, та повертають значення цього поля.
Клас аlbum2 – цеклас-нащадок класу аlbum1, він містить інформаційне поле, що несе інформацію опротяжності альбому за часом. Він також має віртуальні функції (вводу/виводу)та конструктор з деструктором, але ще він має дві функції що створюють поле time, та повертають значення цього поля.
Клас аlbum3 – цеклас-нащадок класу аlbum2, він містить інформаційне поле, що несе інформацію окількості бонусних треків у альбомі. Він також має віртуальні функції(вводу/виводу) та конструктор з деструктором, але ще він має дві функції щостворюють поле bonus, таповертають значення цього поля.
Клас Tool – це клас який є двонапрямленимсписком об’єктів класу аlbum та його нащадків. Функціями даного класу єконструктор та деструктор що відповідно створюють поліморфний список об’єктівта вивільняють пам’ять відведену під нього.
Клас Trist є дружнім до класу Tool.Він вміщає функцію додавання новихоб’єктів до списку. Нові об’єкти додаються у кінець(хвіст) списку і можуть бутиодного з типів аlbum, аlbum1, аlbum2 та аlbum3.
Функція int get….() повертає значення даного полядля об’єкту.
Функція int set….() створює поле об’єкта а самевстановлює відповідність(заносить у поле інформацію) з інформацією що вводитькористувач при заповнені таблиці.
Функції virtual void output() та virtual void input() являються яскравими покажчикамиполіморфізму бо є віртуальними функціями. Вони слугують для виводу на екран абозаповнення об’єкту при роботі з таблицею.
6.        Списоквикористаної літератури
·         Шилдт Г.Самоучитель С++. – Санкт-Петербург, 2007.
·         Матеріалилокальної сітки НТУ «ХПІ».
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙТЕХНІЧНИЙ УНІВЕРСИТЕТ
«ХАРКІВСЬКИЙПОЛІТЕХНІЧНИЙ ІНСТИТУТ
КафедраОбчислювальної техніки та програмування
ЗАТВЕРДЖУЮ
Завідувач кафедри ОТП
__________ /Xxxxxxxxxxx./
»___” __________ 2007р. Розрахунково-графічне завдання № 1, 2ІНФОРМАЦІЙНО-ДОВІДКОВА СИСТЕМА
Програмата методика іспитів
ЛИСТЗАТВЕРДЖЕННЯ
Xxxxxxxxxxx-01 51 01-1-ЛЗ
Розробники
Керівник проекту
__________ /доц. Xxxxxxxxxxx./
“___” __________ 2007 р.
Виконавець
__________ /студ. Xxxxxxxxxxx./
“___” __________ 2007 р.
2007
УЗГОДЖЕНО
Xxxxxxxxxxx-01 51 01-1-ЛЗ
Розрахунково-графічне завдання № 1, 2ІНФОРМАЦІЙНО-ДОВІДКОВА СИСТЕМА
Програмата методика іспитів
Xxxxxxxxxxx-01 51 01-1
2007

1.        Об’єкт іспитів
Програма являє собою модуль, що складається зтрьох файлів:
–          RGZ.cpp(Основний файл, містить функцію main( ) );
–          RGZ_DSC.cpp(Файл, що містить опис функцій класів) ;
–          RGZ.Н(Файл, що містить опис класів)
Об’єктом іспитів є нижче приведенапрограма.
2.        Мета іспитів
Мета іспитів – цевпевнитися у правильності роботи даної програми та оцінити її ефективність.
Тести, котріперевірюють правильність роботи програми приведені у пункті «Засоби та порядоквипробувань».
3.        Вимоги до програмита програмного документа
Функціонуваннясистеми цілком забезпечується стандартною конфігурацією IBM суміснихперсональних ЕОМ.
Основна вимога допрограми – це чітке демонстрування поліморфізму та правильність роботи, атакож, втілення основної задачі.
4.        Засоби та порядокіспитів
Засобом іспитів євведення інформації за підказками, які з’являються у процесі роботи програми.Шляхом порівняння фактичного результату роботи програми з прогнозованимирезультатами, встановлюється вірність роботи програми.
Розглянемо виконання програми по пунктах:
·         Перед користувачемз’являється повідомлення: «Vvedite nomer operatsii».
·         Якщо ви натиснете клавішу «1»,то виконаєте наступні дії:
Sozdanie tablizi dannih
Vvedite N: 3
Vvedite tip zapisi [0..2]: 2
Vvedite nazvanie alboma: qqq
Vvedite god vipuska: 1889
Vvedite kl-vo trekov v albome: 11
Vvedite prodolzitelnost alboma po vremeni: 60
Vvedite kolichestvo bonus trekov: 2
Vvedite tip zapisi [0..2]: 0
Vvedite nazvanie alboma: www
Vvedite god vipuska: 1990
Vvedite kl-vo trekov v albome: 12
Vvedite tip zapisi [0..2]: 1
Vvedite nazvanie alboma: eee
Vvedite god vipuska: 1991
Vvedite kl-vo trekov v albome: 13
Vvedite prodolzitelnost alboma po vremeni: 58
·         При натисканні на клавішу«2» на екрані з’явиться таблиця яку ви заповнили вище:
Vivod na ekran
|Nazv |God |Treki |Vremya |Bonus+
——————————————————-
qqq 1889 11 60 2
www 1990 12
eee 1991 13 58
 Vivod na ekran zavershen.
·         Якщо ви натиснете«3», то на екрані з’явиться повідомлення:
Vvedite nomer operatsii:3
Vivod v fail a.dat
Vivod v fail uspeshno zavershen.
·         Якщо ви натиснете«4», то на екрані з’явиться повідомлення:
Vvedite nomer operatsii:4
Chtenie iz faila a.dat
Chtenie iz faila uspeshno zavershena.
·         При натисканні на клавішу«5» на екрані з’явиться повідомлення та ви виконаєте наступні дії:
Vvedite nomer operatsii:5
Poisk obyekta
Vvedite kluch dlya poiska(nazvanie alboma):www
Zapis bila naidena.
|Nazv |God |Treki |Vremya |Bonus+
——————————————————-
www 1990 12
·         Якщо ви натиснете«6», то на екрані з’явиться повідомлення та ви виконаєте наступнідії:
Vvedite nomer operatsii:6
Redaktirovanie zapisi
Vvedite nomer zapisi: 2
vedite nazvanie alboma: rrr
vedite god vipuska: 1234
vedite kl-vo trekov v albome: 13
vedite prodolzitelnost alboma po vremeni: 56
 Redaktirovanie uspeshno zaversheno.
·         Результатом ваших дій будете, що один запис у таблиці зміниться:
Vivod na ekran
|Nazv |God |Treki |Vremya |Bonus+
——————————————————-
qqq 1889 11 60 2
www 1990 12
rrr 1234 13 56
Vivod na ekran zavershen.
·         При натисканні на клавішу«7» на екрані з’явиться повідомлення та ви виконаєте наступні дії:
Vvedite nomer operatsii:7
Vstavka novoi zapisi
Vvedite tip novoy zapisi [0..2]: 2
vedite nazvanie alboma: zzz
vedite god vipuska: 1534
Vvedite kl-vo trekov v albome: 13
Vvedite prodolzitelnost alboma po vremeni: 222
Vvedite kolichestvo bonus trekov: 1
Vstavka zapisi uspeshno zaversena.
·         Результатом ваших дій будете що один запис у таблиці зміниться:
Vivod na ekran
|Nazv |God |Treki |Vremya |Bonus+
——————————————————-
qqq 1889 11 60 2
www 1990 12
rrr 1234 13 56
zzz 1534 11 222 1
 Vivod na ekran zavershen.
·         Якщо ви натиснете«8» то на екрані з’явиться повідомлення та ви виконаєте наступні дії:
Vvedite nomer operatsii:8
Udalenie zapisi
Vvedite nomer zapisi dlya udalenia:1
Zapis bila udalena.
·         Результатом ваших дій будете, що один запис у таблиці буде знищено:
Vivod na ekran
|Nazv |God |Treki |Vremya |Bonus+
——————————————————-
qqq 1889 11 60 2
rrr 1234 13 56
zzz 1534 11 222 1
Vivod na ekran zavershen.
·         При натисканні на клавішу«9» на екрані з’явиться повідомлення та ви виконаєте наступні дії:
Vvedite nomer operatsii:9
Poisk obyekta s minimalnim kl-vom trekov vzadannom diapazone let
Vvedite leviy predel poiska(god): 1
Vvedite praviy predel poiska(god): 1600
Zapis bila naidena.
|Nazv |God |Treki |Vremya |Bonus+
——————————————————-
zzz 1534 11 222 1
·         При натисканні на клавішу«10» програму буде завершено.
Кожний отриманий результат відповідаєпоставленій задачі.
Отриманні результати збігаються з прогнозами,щодо вірності роботи даної програми, тобто задача виконана вірно.
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙТЕХНІЧНИЙ УНІВЕРСИТЕТ
«ХАРКІВСЬКИЙПОЛІТЕХНІЧНИЙ ІНСТИТУТ
КафедраОбчислювальної техніки та програмування
 
ЗАТВЕРДЖУЮ
Завідувач кафедри ОТП
__________ /Xxxxxxxxxxx./
»___” __________ 2007р. Розрахунково-графічне завдання № 1, 2ІНФОРМАЦІЙНО-ДОВІДКОВА СИСТЕМА
Текстпрограми
Xxxxxxxxxxx-01 12 01-1-ЛЗ
Розробники
Керівник проекту
__________ /доц. Xxxxxxxxxxx./
“___” __________ 2007 р.
Виконавець
__________ /студ. Xxxxxxxxxxx./
“___” __________ 2007 р.
2007
УЗГОДЖЕНО
Xxxxxxxxxxx-01 81 01-1-ЛЗ
 Розрахунково-графічне завдання № 1, 2ІНФОРМАЦІЙНО-ДОВІДКОВА СИСТЕМА
Текстпрограми
Xxxxxxxxxxx-01 12 01-1
2007
Текст програми
//Заголовковий файл
#include
classalbum
         {
                   public:
                            album(){}
                            virtualvoid input();
                            virtualvoid output();
                            charnazv[4];//Назва
                            intgod;//Рік випуску
                            ~album(){}
         };
classalbum1: publicalbum
         {        protected:
                            inttrek;//Кількість треків
                   public:
                            album1();
                            virtualvoid input();
                            virtualvoid output();
                            intgetTrek()
                            {
                                      returntrek;
                            }
                            voidsetTrek(intc)//ф-ція створення поля
                            {
                                      trek=c;
                            }
                            ~album1();
         };
classalbum2: public album1
         {
                   protected:
                            inttime;//Час звучання
                   public:
                            album2();
                            virtualvoid input();
                            virtualvoid output();
                            intgetTime()
                            {
                                      returntime;
                            }
                            voidsetTime(int c)
                            {
                                      time=c;
                            }
                            ~album2();
         };
classalbum3: public album2
         {
                   protected:
                            intbonus;//Кількість бонус треків
                   public:
                            album3();
                            virtualvoid input();
                            virtualvoid output();
                            intgetBonus()
                            {
                                      returnbonus;
                            }
                            voidsetBonus(int c)                            {
                                      bonus=c;
                            }
                            ~album3();
         };
classTool
         {
                   public:
                            album*d;
                            intt;
                            friendclass Trist;//об’явленнядружнього класу
                            Tool*right,*left;
         };
classTrist
         {
                   public:
                            Tool*head,*tail;
                            Tool*current;
                            Trist(inttype,int vvod);//Конструктор
                            voidadd(int type, int vvod);//ф_ція добавленняоб’єктів
                            ~Trist();//Деструктор
         };
//Описний файл
#include«RGZ.h»
#include
#include
#include
#include
voidalbum::input()//ф-ція вводу
{
         cout
         cin>> nazv;
         nazv[3]=NULL;
         cout
         cin>> god;
}
voidalbum::output()//ф-ція виводу
{
 cout
          
}
album1::album1():album(){}//конструктор
album1::~album1(){album::~album(); }//деструктор
voidalbum1::input()
{
         album::input();
         cout
         cin>> trek;
}
voidalbum1::output()
{
         album::output();
         cout
}
album2::album2():album1(){}
album2::~album2(){ album1::~album1(); }
voidalbum2::input()
{
         album1::input();
         cout
         cin>> time;
}
voidalbum2::output()
{
         album1::output();
         cout
}
album3::album3():album2(){}
album3::~album3(){ album2::~album2(); }
voidalbum3::input()
{
         album2::input();
         cout
         cin>> bonus;
}
voidalbum3::output()
{
         album2::output();
         cout
}
voidcaption()//заголовкова ф-ція
{
 cout
                    
                    
                    
                    
 cout
}
Trist::Trist(inttype, int vvod)//Створення списку об’єктів
{
         album1*pr;
         album2*sp;
         album3*fl;
         head= new Tool;
         head->t= type;
         if(head->t == 0)
         {
                   pr= new album1;
                   if(vvod)
                            pr->input();
                   head->d=pr;
         }else
         if(head->t == 1)
         {
                   sp= new album2;
                   if(vvod)
                            sp->input();
                   head->d=sp;
         }else
         if(head->t == 2)
         {
                   fl= new album3;
                   if(vvod)
                            fl->input();
                   head->d=fl;
         }
         head->right=NULL;
         head->left=NULL;
         tail=head;
         current=head;
}
Trist::~Trist()//Висвободженняпамяті
{
         Tool*h;
         h=head;
         while(h!=0)
         {        head=head->right;
                   head->left=NULL;
                   deleteh;
                   h=head;
         }
}
voidTrist::add(int type, int vvod)//додавання нового об’єктау список
{
         Tool*q = new Tool;
         album1*pr;
         album2*sp;
         album3*fl;
         q->t= type;
         switch(q->t)
         {
                   case0:
                            pr= new album1;
                            if(vvod)
                                      pr->input();
                            q->d=pr;
                            break;
                   case1:
                            sp=newalbum2;
                            if(vvod)
                                      sp->input();
                            q->d=sp;
                            break;
                   case2:
                            fl=newalbum3;
                            if(vvod)
                                      fl->input();
                            q->d=fl;
                            break;
         }
         if(current==tail)
         {
                   q->right=NULL;
                   q->left=current;
                   current->right=q;
                   tail=q;
                   current=q;
         }else
         {        q->right=current->right;
                   current->right->left=q;
                   current->right=q;
                   q->left=current;
                   current=q;
         }
}
//Головний файл
#include«RGZ_dsc.cpp»
#include
#include
#include
#include
voidsozdan(Trist *&a, int n);//створення
voidoutput(Trist *&a);//вивід на екран
voidoutput_file(Trist *&a, int n);//вивід до файлу
voidinput_file(Trist *&a);//читання з файлу
Tool*pois(Trist *&a, char* nazv);//ф-ція пошуку
Tool*zadacha(Trist *&a,int godL,int godR);//виконаннязадачі
voidmain()//Головна програма
{
         inti,N=5,k;
         Trist*a = NULL;
         clrscr();
         randomize();
         while(1)
         {
                   cout
                   cout
                   cout
                   cout
                   cout
                   cout
                   cout
                   cout
                   cout
                   cout
                   cout
                   cout
                   cout
                   cin>> k;
                   switch(k)
                   {
                            case1:
                                      cout
                                      cout
                                      cin>> N;
                                      sozdan(a,N);
                                      cout
                                      getch();
                                      break;
                            case2:
                                      cout
                                      output(a);
                                      cout
                                      getch();
                                      break;
                            case3:
                                      cout
                                      output_file(a,N);
                                      cout
                                      getch();
                                      break;
                            case4:
                                      cout
                                      input_file(a);
                                      cout
                                      getch();
                                      break;
                            case5:
                                      cout
                                      cout
                                      char*nazv;
                                      cin>> nazv;
                                      Tool*n;
                             //n=NULL;
                                      n= pois(a,nazv);
                                      if(n==NULL) cout
                                      else
                                      {
                                               cout
                                               caption();
                                               n->d->output();
                                      }
                                      deletenazv;
                                      getch();
                                      break;
                            case6:
                                      cout
                                      cout
                                      intc;
                                      cin>> c;
                                      a->current=a->head;
                                      for(i=0;a->current!=NULL;i++)
                                      {
                                               if(i==c)
                                               {
                                                        a->current->d->input();
                                                        break;
                                               }
                                               a->current=a->current->right;
                                      }
                                      cout
                                      getch();
                                      break;
                            case7:
                                      cout
                                      cout
                                      intp = 0;
                                      cin>> p;
                                      a->current=a->tail;
                                      a->add(p,1);
                                      cout
                                      getch();
                                      break;
                            case8:
                                      cout
                                      cout
                                      intj = 0;
                                      cin>> j;
                                      a->current=a->head;
                                      for(i=0;a->current!=NULL;i++)
                                      {
                                               if(i==j)
                                               {
                                                        Tool*q = a->current;
                                                        if(q->left!=NULL) q->left->right = q->right;
                                                        if(q->right!=NULL) q->right->left = q->left;
                                                        if(q==a->head) a->head=q->right;
                                                        if(q==a->tail) a->tail=q->left;
                                                        deleteq;
                                                        a->current= a->tail;
                                                        break;
                                               }
                                               a->current=a->current->right;
                                      }
                                      cout
                                      getch();
                                      break;
                            case9:
                                      cout
                                      cout
                                      intgodL,godR;
                                      cin>> godL;
                                      cout
                                      cin>> godR;
                                      Tool*k;
                                      k= zadacha(a,godL,godR);
                                      if(n==NULL) cout
                                      else
                                      {
                                               cout
                                               caption();
                                               k->d->output();
                                      }
                                      getch();
                                      break;
                            case10:
                                      deletea;
                                      exit(0);
                                      break;
                   }
}
}
voidsozdan(Trist *&a, int n)
{
         if(a!=NULL)
                   deletea;
         cout
         intk;
         cin>> k;
         a= new Trist(k,1);
         for(int i=1;i
         {
                   cout
                   cin>> k;
                   a->add(k,1);
         }
}
voidoutput(Trist *&a)
{
         caption();
         a->current=a->head;
         while(a->current!=NULL)
         {
                   a->current->d->output();
                   a->current=a->current->right;
         }
}
voidoutput_file(Trist *&a, int n)
{
 ofstreamfile(«a.dat»,ios::out|ios::binary);
 if(!file)
 {
                   cerr
                   getch();
                   exit(1);
 }
 file.seekp(0);
 file.write((char*)&(n),sizeof(n));
 a->current=a->head;
 while(a->current!=NULL)
 {
                   file.write((char*)&(a->current->t),sizeof(a->current->t));
                   file.write(a->current->d->nazv,sizeof(a->current->d->nazv));
                   switch(a->current->t)
                   {
                            case0:
                                      album1*obj1;
                                      obj1=(album1*)a->current->d;
                                      inttrek = obj1->getTrek();
                                      file.write((char*)&(trek),sizeof(trek));
                                      break;
                            case1:
                                      album2*obj2;
                                      obj2=(album2*)a->current->d;
                                      trek= obj2->getTrek();
                                      inttime = obj2->getTime();
                                      file.write((char*)&(trek),sizeof(trek));
                                      file.write((char*)&(time),sizeof(time));
                                      break;
                            case2:
                                      album3*obj3;
                                      obj3=(album3*)a->current->d;
                                      trek= obj3->getTrek();
                                      time= obj3->getTime();
                                      intbonus = obj3->getBonus();
                                      file.write((char*)&(trek),sizeof(trek));
                                      file.write((char*)&(time),sizeof(time));
                                      file.write((char*)&(bonus),sizeof(bonus));
                                      break;
                   }
                   a->current=a->current->right;
 }
 file.close();
}
voidinput_file(Trist *&a)
{
 ifstreamfile(«a.dat»,ios::in);
 if(!file)
 {
                   cerr
                   getch();
                   exit(1);
 }
 intn;
 file.read((char*)&(n),sizeof(n));
 inti;
 deletea;
 for(i=0;i
 {
                   intt;
                   file.read((char*)&(t),sizeof(t));
                   if(i==0) a=new Trist(t,0); else a->add(t,0);
                   file.read((char*)&(a->current->d->nazv),sizeof(a->current->d->nazv));
                   switch(t)
                   {
                            case0:
                                      album1*obj1;
                                      obj1=(album1*)a->current->d;
                                      inttrek = 0;
                                      file.read((char*)&(trek),sizeof(trek));
                                      obj1->setTrek(trek);
                                      break;
                            case1:
                                      album2*obj2;
                                      obj2=(album2*)a->current->d;
                                      trek= 0;
                                      inttime = 0;
                                      file.read((char*)&(trek),sizeof(trek));
                                      file.read((char*)&(time),sizeof(time));
                                      obj2->setTrek(trek);
                                      obj2->setTime(time);
                                      break;
                            case2:
                                      album3*obj3;
                                      obj3=(album3*)a->current->d;
                                      trek= 0;
                                      time= 0;
                                      intbonus = 0;
                                      file.read((char*)&(trek),sizeof(trek));
                                      file.read((char*)&(time),sizeof(time));
                                      file.read((char*)&(bonus),sizeof(bonus));
                                      obj3->setTrek(trek);
                                      obj3->setTime(time);
                                      obj3->setBonus(bonus);
                                      break;
                   }
 }
 file.close();
}
Tool*pois(Trist *&a, char* nazv)
{
         Tool*n = NULL;
         a->current=a->head;
         while(a->current!=NULL)
         {
                   n= a->current;
                   if(strcmp(n->d->nazv,nazv)==0) break;
                   elsen=NULL;
                   a->current=a->current->right;
         }
         returnn;
}
Tool*zadacha(Trist *&a,int godL,int godR)
{
         Tool*k = NULL;
         a->current=a->head;
         intmax=1000;
         while(a->current!=NULL)
         {
                   k= a->current;
                   if(k->d->god>godL)
                    if(k->d->god
                    if(k->d->trek
                    elsek=NULL;
                   a->current=a->current->right;
         }
         returnk;