#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
struct premium
{
char fest[64];//название фестиваля
char date[64];//дата проведения
premium *next;//указатель на следующую премию в списке
premium *prev;//указатель на предудущую премию в списке
};
struct actor
{
char fio[64];//фамилия
char role[64];//роль
actor *next;//указатель на следующего актёра в списке
actor *prev;//указатель на предыдущего актёра в списке
};
struct attribute
{
char author[64];//автор сценария
char director[64];//режиссёр
actor *main_roles;//спиок исполнителей главных ролей
premium *prem;//список премий
};
struct VHS
{
char name[64];//название
char year[64];//год
char studio[64];//киностудия
attribute *attrib;//атрибуты фильма
} **VHSs;
unsigned int num_of_VHSs;//кол-во кассет
bool read_file(char *filename)//чтение данных о кассетах из файла
{
ifstream file;//объект файл
file.open(filename);//открываем файл с именем filename
if (file.fail()) return false;//не смогли открыть - возвращаем false
file>>num_of_VHSs;//считываем кол-во кассет из файла
VHSs = new VHS*[num_of_VHSs];//создаём массив из заданного кол-ва кассет
for (int i=0; i<num_of_VHSs; i++)//цикл считывания данных о странах
{
VHSs[i]=new VHS;//создали новую кассету
file>>VHSs[i]->name>>VHSs[i]->year>>VHSs[i]->studio;//прочитали название фильма, студию
VHSs[i]->attrib=new attribute;//создали новые аттрибуты
file>>VHSs[i]->attrib->author>>VHSs[i]->attrib->director;//прочитали автора сценария и режиссёра
unsigned int count;//количество элементов в списке
file>>count;//прочиатли кол-во жлементов в списке
if (count!=0)//если у нас не ноль элементов, то заполняем список
{
VHSs[i]->attrib->main_roles=new actor;//создаём нового актёра
file>>VHSs[i]->attrib->main_roles->fio>>VHSs[i]->attrib->main_roles->role;//считываем его фио и роль
VHSs[i]->attrib->main_roles->next=NULL;//у первого элемента в линейном двунаправленном списке нет предшествующего
VHSs[i]->attrib->main_roles->prev=NULL;//и ПОКА нет следующего
actor *cur_a=VHSs[i]->attrib->main_roles;//создаём вспомогательный указатель, который будет бегать по списку и через который будем осуществлять добавлением
for (int j=0; j<count-1; j++)//цикл добавления count-1 актёром в список одного уже добавили)
{
cur_a->next=new actor;//создаём следующего актёра
cur_a->next->prev=cur_a;//предыдущим для следующего будет текущий актёр
cur_a=cur_a->next;//переходим к новому актёру
file>>cur_a->fio>>cur_a->role;//считываем его фамилию и роль
}
cur_a->next=NULL;//добавили всех актёров, значит у последнего актёра нет следующего
}
else VHSs[i]->attrib->main_roles=NULL;//еслиу нас 0 актёров, то так и запишем
file>>count;//получаем кол-во премий
if (count!=0)//аналогично верхнему случаю
{
VHSs[i]->attrib->prem=new premium;
file>>VHSs[i]->attrib->prem->fest>>VHSs[i]->attrib->prem->date;
VHSs[i]->attrib->prem->next=NULL;
VHSs[i]->attrib->prem->prev=NULL;
premium *cur_p=VHSs[i]->attrib->prem;
for (int j=0; j<count-1; j++)
{
cur_p->next=new premium;
cur_p->next->prev=cur_p;
cur_p=cur_p->next;
file>>cur_p->fest>>cur_p->date;
}
cur_p->next=NULL;
}
else VHSs[i]->attrib->prem=NULL;
}
file.close();//закроем файл
return true;
}
int main()
{
cout<<"Enter filename with VHSs: ";//просим ввести имя файла с описанием кассет
char temp[64];//строка для хранения имени файла
cin>>temp;//считываем строку
if (!read_file(temp))//если не удалось открыть файл с такми именем, то
{
cout<<"ERROR!"<<endl;//выведем сообщение об ошибке
return -1;//и выйдем из программы
}
unsigned int choice=0;//здесь будет храниться выбор пункта меню
unsigned int a;//счётчик фильмов режиссёра
while (choice!=6)//пока пользователь не выберет пункт ВЫХОД
{
cout<<"1. Calculate number of films for director."<<endl
<<"2. Find all films, which have premiums on festival."<<endl
<<"3. Find all directors from one studio."<<endl
<<"4. Find all roles of actor in films, which have premium"<<endl
<<"5. Find all authors in which films play role actor."<<endl
<<"6. Exit."<<endl
<<"Enter number: ";
cin>>choice;
switch (choice)
{
case 1:
cout<<"Enter director name: ";//спросим имя режиссёра
cin>>temp;//прочитаем имя в строку temp
a=0;//обнуляем счётчик фильмов режиссёра
for (int i=0; i<num_of_VHSs; i++)//пробегаем по всем кассетам
{
if (!strcmp(temp, VHSs[i]->attrib->director))//если имя совпадает с именем режиссёра текущего фильма
a++;//то увеличиваем счётчик фильмов режиссёра на 1
}
cout<<"Number of films: "<<a<<endl;//выведем кол-во фильмов
break;
case 2:
cout<<"Enter festival: ";
cin>>temp;
for (int i=0; i<num_of_VHSs; i++)//пробегаем по всем кассетам
{
premium *cur_p=VHSs[i]->attrib->prem;//указатель для прохода по всем премиям текущего фильма
while (cur_p)//пока есть премии
{
if (!strcmp(temp, cur_p->fest))//если совпадает фестиваль с фестивалем текущего фильма
cout<<VHSs[i]->name<<endl;//то выведем имя фильма
cur_p=cur_p->next;//переходим к следующей премии
}
}
break;
case 3:
cout<<"Enter studio name: ";
cin>>temp;
for (int i=0; i<num_of_VHSs; i++)//пробегаем по всем кассетам
{
if (!strcmp(temp, VHSs[i]->studio))//если студия совпадает со студией текущего фильма
cout<<VHSs[i]->attrib->director<<endl;//то выведем имя режиссёра
}
break;
case 4:
cout<<"Enter actors name: ";
cin>>temp;
for (int i=0; i<num_of_VHSs; i++)//пробегаем по всем кассетам
{
if (VHSs[i]->attrib->prem)//если у текущего фильма есть премии
{
actor *cur_a=VHSs[i]->attrib->main_roles;//создаём указатель для прохода по всем главным ролям
while (cur_a)//пока есть роли
{
if (!strcmp(temp, cur_a->fio))//если фамилии совпадают
cout<<cur_a->role<<endl;//то выводим роль
cur_a=cur_a->next;//переходим к следующей роли в списке
}
}
}
break;
case 5:
cout<<"Enter actors name: ";
cin>>temp;
for (int i=0; i<num_of_VHSs; i++)//пробегаем по всем кассетам
{
actor *cur_a=VHSs[i]->attrib->main_roles;//указатель для прохода по всем главным ролям текущего фильма
while (cur_a)//пока есть роли
{
if (!strcmp(temp, cur_a->fio))//сравниваем фио актёра с заданным
{
cout<<VHSs[i]->attrib->author<<endl;//если совпали, то выводим имя сценариста
break;//и выходим из цикла
}
cur_a=cur_a->next;//переходим к следующей роли
}
}
break;
case 6:
break;
default:
cout<<"Error! No such menu!"<<endl;
break;
}
}
return 0;//успешный выход из программы
}