#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<string.h>

#include<locale.h>

#define N 50

//Структуры данных

struct dir_actors_prod

{

char actor[N];

char director[N];

char producer[N];

};

struct film

{

int budget;

int cash;

int time;

int year;

int num_a;

int num_d;

int num_p;

char country[N];

char name[N];

char rating[N];

char type[N];

dir_actors_prod actors[N];

dir_actors_prod directors[N];

dir_actors_prod producers[N];

film *next;

};

//Прототипы функций

void Create(film **films); //добавление в очередь информации о фильме

void ShowList(film *films);//просмотр очереди

void WriteInFile(film *films,FILE *myfile);//запись очереди в файл

void ReadFromFile(film **films,FILE *myfile);//чтение из файла в очередь

void YearSort(film *films);//поиск фильмов по году

void TypeSort(film *films);//поиск фильмов по жанру

void CountrySort(film *films);//поиск фильмов по стране

void RatingSort(film *films);//поиск фильмов по рейтингу

void DirectorSort(film *films);//поиск фильмов по режиссеру

void ActorSort(film *films);//поиск фильмов по актеру

void ShowAllActors(film *films);//показ всех актеров по всем фильмам

void WriteOneInFile(film *films,FILE *potok);//запись одного фильма в файл

void Delete(film **h);//удаление информации по фильму из очереди

//Головная функция

int main()

{

setlocale(LC_CTYPE,"Russian");

film *films = NULL;

FILE *myfile = fopen("info.txt","a+");

while(1)

{

printf("==========================ИНФОРМАЦИОННАЯ СИСТЕМА КИНОТЕ");

printf("ÀÒÐÀ=====================\n");

puts("Выберите операцию:");

puts(" 1 - Добавить фильм в инф. систему");

puts(" 2 - Просмотр всех фильмов");

puts(" 3 - Поиск фильмов по году");

puts(" 4 - Поиск фильмов по жанру");

puts(" 5 - Поиск фильмов по стране");

puts(" 6 - Поиск фильмов по рейтингу");

puts(" 7 - Поиск фильмов по режиссеру");

puts(" 8 - Поиск фильмов по актеру");

puts(" 9 - Просмотр всех актеров по всем фильмам");

puts(" d - Удаление любого фильма из файла");

puts(" 0 - Выйти");

fflush(stdin);

switch(getch())

{

case '1' : //Добавить фильм в файл

ReadFromFile(&films,myfile);

Create(&films);

fclose(myfile);

myfile = fopen("info.txt","w+");

WriteInFile(films,myfile);

fclose(myfile);

break;

case '2' : //Просмотр всех фильмов из файла

free(films);

films = NULL;

myfile = fopen("info.txt","a+");

ReadFromFile(&films,myfile);

ShowList(films);

fclose(myfile);

free(films);

films = NULL;

break;

case '3' : //Поиск фильмов по году

free(films);

films = NULL;

myfile = fopen("info.txt","a+");

ReadFromFile(&films,myfile);

YearSort(films);

fclose(myfile);

free(films);

films = NULL;

break;

case '4' : //Поиск фильмов по определенному жанра

free(films);

films = NULL;

myfile = fopen("info.txt","a+");

ReadFromFile(&films,myfile);

TypeSort(films);

fclose(myfile);

free(films);

films = NULL;

break;

case '5' : //Поиск фильмов по стране

free(films);

films = NULL;

myfile = fopen("info.txt","a+");

ReadFromFile(&films,myfile);

CountrySort(films);

fclose(myfile);

free(films);

films = NULL;

break;

case '6' : //Поиск фильмов по рейтингу

free(films);

films = NULL;

myfile = fopen("info.txt","a+");

ReadFromFile(&films,myfile);

RatingSort(films);

fclose(myfile);

free(films);

films = NULL;

break;

case '7' : //Поиск фильмов по режиссеру

free(films);

films = NULL;

myfile = fopen("info.txt","a+");

ReadFromFile(&films,myfile);

DirectorSort(films);

fclose(myfile);

free(films);

films = NULL;

break;

case '8' : //Поиск фильмов по актеру

free(films);

films = NULL;

myfile = fopen("info.txt","a+");

ReadFromFile(&films,myfile);

ActorSort(films);

fclose(myfile);

free(films);

films = NULL;

break;

case '9' : //Показ всех актеров по всем фильмам

free(films);

films = NULL;

myfile = fopen("info.txt","a+");

ReadFromFile(&films,myfile);

ShowAllActors(films);

fclose(myfile);

free(films);

films = NULL;

break;

case 'd' : //удаление любого фильма из файла

free(films);

films = NULL;

myfile = fopen("info.txt","a+");

ReadFromFile(&films,myfile);

fclose(myfile);

Delete(&films);

myfile = fopen("info.txt","w");

WriteInFile(films,myfile);

fclose(myfile);

free(films);

films = NULL;

break;

case '0' : return 0;

}

}

system("pause");

}

//Функция добавления в очередь информации о фильме

void Create(film **films)

{

system("cls");

film *films_copy;

do{

if(!(films_copy = (film *)calloc(1,sizeof(film))))

{

puts("===Нет свободной памяти===");

return;

}

//Непосредственно ввод данных

printf("Введите название фильма:");

fflush(stdin);

gets(films_copy->name);

strcat(films_copy->name,"\n");

printf("Введите год выпуска фильма:");

scanf("%d",&films_copy->year);

printf("Введите жанр фильма:");

fflush(stdin);

gets(films_copy->type);

strcat(films_copy->type,"\n");

printf("Введите страну:");

fflush(stdin);

gets(films_copy->country);

strcat(films_copy->country,"\n");

printf("Введите бюджет фильма:");

scanf("%d",&films_copy->budget);

printf("Введите сборы в мире:");

scanf("%d",&films_copy->cash);

printf("Введите рейтинг:(*-ми(макс *****)):");

fflush(stdin);

gets(films_copy->rating);

strcat(films_copy->rating,"\n");

printf("Введите количество режиссеров:");

scanf("%d",&films_copy->num_d);

printf(" ====Ввод режиссеров====\n\n");

for(int i=0;i<films_copy->num_d;i++)

{

printf(" Введите имя %d -го режиссера:",i+1);

fflush(stdin);

gets(films_copy->directors[i].director);

strcat(films_copy->directors[i].director,"\n");

}

printf("Введите кол-во актеров:");

scanf("%d",&films_copy->num_a);

printf(" ====Ввод актеров====\n\n");

for(int i=0;i<films_copy->num_a;i++)

{

printf(" Введите %d -го актера:",i+1);

fflush(stdin);

gets(films_copy->actors[i].actor);

strcat(films_copy->actors[i].actor,"\n");

}

printf("Введите кол-во продюссеров:");

scanf("%d",&films_copy->num_p);

printf(" ====Ввод продюссеров====\n\n");

for(int i=0;i<films_copy->num_p;i++)

{

printf(" Введите %d -го продюссера:",i+1);

fflush(stdin);

gets(films_copy->producers[i].producer);

strcat(films_copy->producers[i].producer,"\n");

}

//Тут заканчивается непосредственно ввод данных

if(!*films) *films = films_copy;

else

{

films_copy->next = *films;

*films = films_copy;

}

puts("Продолжить ввод фильмов?(y/n)");

fflush(stdin);

}while(getch() == 'y');

}

//Функция просмотра всех фильмов из файла

void ShowList(film *films)

{

system("cls");

if(!films)

{

puts("Очередь пуста!");

return;

}

printf("\n==============================СПИСОК ФИЛЬМОВ========");

printf("===========================\n\n");

do{

if(films->name[0] != '\0'){

printf("Название фильма:%s",films->name);

printf("Год выпуска:%d\n",films->year);

printf("Жанр фильма:%s",films->type);

printf("Страна:%s",films->country);

printf("Бюджет:%d дол.\n",films->budget);

printf("Сборы в мире:%d дол.\n",films->cash);

printf("Рейтинг:%s",films->rating);

printf("Режиссеры:\n");

for(int i=0;i<films->num_d;i++)

printf(" %s",films->directors[i].director);

printf("Актеры:\n");

for(int i=0;i<films->num_a;i++)

printf(" %s",films->actors[i].actor);

printf("Продюссеры:\n");

for(int i=0;i<films->num_p;i++)

printf(" %s",films->producers[i].producer);

printf("\n===================================================");

printf("============================\n\n");}

films = films->next;

}while(films);

system("pause");

}

//Функция записи очереди в файл

void WriteInFile(film *films,FILE *myfile)

{

if(!films)

{

puts("\nЗапись в файл невозможна!\n");

return;

}

do{

if(films->name[0] != '\0')

{

fputs(films->name,myfile);

fprintf(myfile,"%d\n",films->year);

fputs(films->type,myfile);

fputs(films->country,myfile);

fprintf(myfile,"%d\n",films->budget);

fprintf(myfile,"%d\n",films->cash);

fputs(films->rating,myfile);

fprintf(myfile,"%d\n",films->num_d);

for(int i=0;i<films->num_d;i++)

fputs(films->directors[i].director,myfile);

fprintf(myfile,"%d\n",films->num_a);

for(int i=0;i<films->num_a;i++)

fputs(films->actors[i].actor,myfile);

fprintf(myfile,"%d\n",films->num_p);

for(int i=0;i<films->num_p;i++)

fputs(films->producers[i].producer,myfile);

}

films = films->next;

}while(films);

}

//Функция чтения из файла в очередь

void ReadFromFile(film **films,FILE *myfile)

{

film *films_copy;

rewind(myfile);

do{

if(!(films_copy = (film *)calloc(1,sizeof(film))))

{

puts("Нет свободной памяти!");

return;

}

fgets(films_copy->name,N,myfile);//считываем имя из файла

fscanf(myfile,"%d\n",&films_copy->year);//год выпуска

fgets(films_copy->type,N,myfile);//æàíð

fgets(films_copy->country,N,myfile);//страна

fscanf(myfile,"%d\n",&films_copy->budget);//бюджет

fscanf(myfile,"%d\n",&films_copy->cash);//сборы в мире

fgets(films_copy->rating,N,myfile);//рейтинг

fscanf(myfile,"%d\n",&films_copy->num_d);

for(int i=0;i<films_copy->num_d;i++)

fgets(films_copy->directors[i].director,N,myfile);

fscanf(myfile,"%d\n",&films_copy->num_a);

for(int i=0;i<films_copy->num_a;i++)

fgets(films_copy->actors[i].actor,N,myfile);

fscanf(myfile,"%d\n",&films_copy->num_p);

for(int i=0;i<films_copy->num_p;i++)

fgets(films_copy->producers[i].producer,N,myfile);

if(!*films) *films = films_copy;

else

{

films_copy->next = *films;

*films = films_copy;

}

}while(!feof(myfile));

}

//Функция поиска фильмов по заданному году

void YearSort(film *films)

{

FILE *potok;

int y_flag;

int year;

char *name = (char *)malloc(N*sizeof(char));

system("cls");

printf("Записать рез-ты поиска в файл?(0-нет/1-да):");

scanf("%d",&y_flag);

if(y_flag == 1)

{

printf("Введите имя файла:");

fflush(stdin);

gets(name);

strcat(name,".txt");

potok = fopen(name,"w");

}

else y_flag == 0;

system("cls");

if(!films)

{

puts("Очередь пуста!");

return;

}

printf("Введите год:");

scanf("%d",&year);

system("cls");

printf("\n==============================СПИСОК ФИЛЬМОВ %d-го года==");

printf("=====================\n\n",year);

do{

if(films->name[0] != '\0' && year == films->year){

printf("Название фильма:%s",films->name);

printf("Год выпуска:%d\n",films->year);

printf("Жанр фильма:%s",films->type);

printf("Страна:%s",films->country);

printf("Бюджет:%d дол.\n",films->budget);

printf("Сборы в мире:%d дол.\n",films->cash);

printf("Рейтинг:%s",films->rating);

printf("Режиссеры:\n");

for(int i=0;i<films->num_d;i++)

printf(" %s",films->directors[i].director);

printf("Актеры:\n");

for(int i=0;i<films->num_a;i++)

printf(" %s",films->actors[i].actor);

printf("Продюссеры:\n");

for(int i=0;i<films->num_p;i++)

printf(" %s",films->producers[i].producer);

printf("\n================================================");

printf("===============================\n\n");

if(y_flag == 1) WriteOneInFile(films,potok);

}

films = films->next;

}while(films);

system("pause");

}

//Функция сортировки по определенному жанру

void TypeSort(film *films)

{

FILE *potok;

int y_flag;

int flag;

char *type = (char *)malloc(N*sizeof(char));

char *copy = (char *)malloc(N*sizeof(char));

char *name = (char *)malloc(N*sizeof(char));

system("cls");

printf("Записать рез-ты поиска в файл?(0-нет/1-да):");

scanf("%d",&y_flag);

if(y_flag == 1)

{

printf("Введите имя файла:");

fflush(stdin);

gets(name);

strcat(name,".txt");

potok = fopen(name,"w");

}

else y_flag == 0;

if(!films)

{

puts("Очередь пуста!");

return;

}

printf("Ввести свой жанр/выбрать из популярных(0/1):");

scanf("%d",&flag);

if(flag == 0)

{

system("cls");

printf("Введите жанр:");

fflush(stdin);

gets(type);

strcpy(copy,type);

strcat(type,"\n");

}

else if(flag == 1)

{

system("cls");

puts("Выберите жанр:\n");

puts(" 1 - Action\n 2 - Fantasy\n 3 - Sport\n 4 - Drama");

fflush(stdin);

switch(getch())

{

case '1' : strcpy(copy,"Action");

strcpy(type,"Action\n"); break;

case '2' : strcpy(copy,"Fantasy");

strcpy(type,"Fantasy\n"); break;

case '3' : strcpy(copy,"Sport");

strcpy(type,"Sport\n"); break;

case '4' : strcpy(copy,"Drama");

strcpy(type,"Drama\n"); break;

}

}

system("cls");

printf("\n==============================СПИСОК ФИЛЬМОВ(Жанр:%s)====");

printf("===================\n\n",copy);

do{

if(films->name[0] != '\0' && !strcmp(films->type,type))

{

printf("Название фильма:%s",films->name);

printf("Год выпуска:%d\n",films->year);

printf("Жанр фильма:%s",films->type);

printf("Страна:%s",films->country);

printf("Бюджет:%d дол.\n",films->budget);

printf("Сборы в мире:%d дол.\n",films->cash);

printf("Рейтинг:%s",films->rating);

printf("Режиссеры:\n");

for(int i=0;i<films->num_d;i++)

printf(" %s",films->directors[i].director);

printf("Актеры:\n");

for(int i=0;i<films->num_a;i++)

printf(" %s",films->actors[i].actor);

printf("Продюссеры:\n");

for(int i=0;i<films->num_p;i++)

printf(" %s",films->producers[i].producer);

printf("\n===========================================");

printf("====================================\n\n");

if(y_flag == 1) WriteOneInFile(films,potok);

}

films = films->next;

}while(films);

system("pause");

}

//Функция поиска фильмов по стране

void CountrySort(film *films)

{

FILE *potok;

int y_flag;

char *country = (char *)malloc(N*sizeof(char));

char *name = (char *)malloc(N*sizeof(char));

system("cls");

printf("Записать рез-ты поиска в файл?(0-нет/1-да):");

scanf("%d",&y_flag);

if(y_flag == 1)

{

printf("Введите имя файла:");

fflush(stdin);

gets(name);

strcat(name,".txt");

potok = fopen(name,"w");

}

else y_flag == 0;

printf("Введите страну для поиска:");

fflush(stdin);

gets(country);

if(!films)

{

puts("Очередь пуста!");

return;

}

system("cls");

printf("\n==============================СПИСОК ФИЛЬМОВ(Страна:%s)==");

printf("=====================\n\n",country);

strcat(country,"\n");

do{

if(films->name[0] != '\0' && !strcmp(films->country,country)){

printf("Название фильма:%s",films->name);

printf("Год выпуска:%d\n",films->year);

printf("Жанр фильма:%s",films->type);

printf("Страна:%s",films->country);

printf("Бюджет:%d дол.\n",films->budget);

printf("Сборы в мире:%d дол.\n",films->cash);

printf("Рейтинг:%s",films->rating);

printf("Режиссеры:\n");

for(int i=0;i<films->num_d;i++)

printf(" %s",films->directors[i].director);

printf("Актеры:\n");

for(int i=0;i<films->num_a;i++)

printf(" %s",films->actors[i].actor);

printf("Продюссеры:\n");

for(int i=0;i<films->num_p;i++)

printf(" %s",films->producers[i].producer);

printf("\n=====================================================");

printf("==========================\n\n");

if(y_flag == 1) WriteOneInFile(films,potok);

}

films = films->next;

}while(films);

system("pause");

}

//Функция поиска фильмов по рейтингу

void RatingSort(film *films)

{

FILE *potok;

int y_flag;

char *rating = (char *)malloc(N*sizeof(char));

char *name = (char *)malloc(N*sizeof(char));

system("cls");

printf("Записать рез-ты поиска в файл?(0-нет/1-да):");

scanf("%d",&y_flag);

if(y_flag == 1)

{

printf("Введите имя файла:");

fflush(stdin);

gets(name);

strcat(name,".txt");

potok = fopen(name,"w");

}

else y_flag == 0;

printf("Введите рейтинг фильма для поиска:");

fflush(stdin);

gets(rating);

if(!films)

{

puts("Очередь пуста!");

return;

}

system("cls");

printf("\n==============================СПИСОК ФИЛЬМОВ(Рейтинг:%s)===");

printf("====================\n\n",rating);

strcat(rating,"\n");

do{

if(films->name[0] != '\0' && !strcmp(films->rating,rating)){

printf("Название фильма:%s",films->name);

printf("Год выпуска:%d\n",films->year);

printf("Жанр фильма:%s",films->type);

printf("Страна:%s",films->country);

printf("Бюджет:%d дол.\n",films->budget);

printf("Сборы в мире:%d дол.\n",films->cash);

printf("Рейтинг:%s",films->rating);

printf("Режиссеры:\n");

for(int i=0;i<films->num_d;i++)

printf(" %s",films->directors[i].director);

printf("Актеры:\n");

for(int i=0;i<films->num_a;i++)

printf(" %s",films->actors[i].actor);

printf("Продюссеры:\n");

for(int i=0;i<films->num_p;i++)

printf(" %s",films->producers[i].producer);

printf("\n======================================================");

printf("=========================\n\n");

if(y_flag == 1) WriteOneInFile(films,potok);

}

films = films->next;

}while(films);

system("pause");

}

//Функция поиска фильмов по режиссеру

void DirectorSort(film *films)

{

FILE *potok;

int y_flag;

char *director = (char *)malloc(N*sizeof(char));

char *name = (char *)malloc(N*sizeof(char));

system("cls");

printf("Записать рез-ты поиска в файл?(0-нет/1-да):");

scanf("%d",&y_flag);

if(y_flag == 1)

{

printf("Введите имя файла:");

fflush(stdin);

gets(name);

strcat(name,".txt");

potok = fopen(name,"w");

}

else y_flag == 0;

printf("Введите имя режиссера для поиска фильмов:");

fflush(stdin);

gets(director);

if(!films)

{

puts("Очередь пуста!");

return;

}

system("cls");

printf("\n==============================СПИСОК ФИЛЬМОВ(Режиссер:%s)=");

printf("======================\n\n",director);

strcat(director,"\n");

do{

for(int i=0;i<films->num_d;i++)

{

if(films->name[0] != '\0' &&

!strcmp(films->directors[i].director,director))

{

printf("Название фильма:%s",films->name);

printf("Год выпуска:%d\n",films->year);

printf("Жанр фильма:%s",films->type);

printf("Страна:%s",films->country);

printf("Бюджет:%d дол.\n",films->budget);

printf("Сборы в мире:%d дол.\n",films->cash);

printf("Рейтинг:%s",films->rating);

printf("Режиссеры:\n");

for(int i=0;i<films->num_d;i++)

printf(" %s",films->directors[i].director);

printf("Актеры:\n");

for(int i=0;i<films->num_a;i++)

printf(" %s",films->actors[i].actor);

printf("Продюссеры:\n");

for(int i=0;i<films->num_p;i++)

printf(" %s",films->producers[i].producer);

printf("\n============================================");

printf("===================================\n\n");

if(y_flag == 1) WriteOneInFile(films,potok);

}

}

films = films->next;

}while(films);

system("pause");

}

//Функция поиска фильмов по определенному актеру

void ActorSort(film *films)

{

FILE *potok;

int y_flag;

char *actor = (char *)malloc(N*sizeof(char));

char *name = (char *)malloc(N*sizeof(char));

system("cls");

printf("Записать рез-ты поиска в файл?(0-нет/1-да):");

scanf("%d",&y_flag);

if(y_flag == 1)

{

printf("Введите имя файла:");

fflush(stdin);

gets(name);

strcat(name,".txt");

potok = fopen(name,"w");

}

else y_flag == 0;

printf("Введите имя актера для поиска фильмов:");

fflush(stdin);

gets(actor);

if(!films)

{

puts("Очередь пуста!");

return;

}

system("cls");

printf("\n==============================СПИСОК ФИЛЬМОВ(Актер:%s)===");

printf("====================\n\n",actor);

strcat(actor,"\n");

do{

for(int i=0;i<films->num_a;i++)

{

if(films->name[0] != '\0' &&

!strcmp(films->actors[i].actor,actor))

{

printf("Название фильма:%s",films->name);

printf("Год выпуска:%d\n",films->year);

printf("Жанр фильма:%s",films->type);

printf("Страна:%s",films->country);

printf("Бюджет:%d дол.\n",films->budget);

printf("Сборы в мире:%d дол.\n",films->cash);

printf("Рейтинг:%s",films->rating);

printf("Режиссеры:\n");

for(int i=0;i<films->num_d;i++)

printf(" %s",films->directors[i].director);

printf("Актеры:\n");

for(int i=0;i<films->num_a;i++)

printf(" %s",films->actors[i].actor);

printf("Продюссеры:\n");

for(int i=0;i<films->num_p;i++)

printf(" %s",films->producers[i].producer);

printf("\n============================================");

printf("===================================\n\n");

if(y_flag == 1) WriteOneInFile(films,potok);

}

}

films = films->next;

}while(films);

system("pause");

}

//Функция показа всех актеров по всем фильмам

void ShowAllActors(film *films)

{

if(!films)

{

puts("Очередь пуста!");

return;

}

system("cls");

printf("\n==============================СПИСОК ВСЕХ АКТЕРОВ======");

printf("=================\n\n");

do{

if(films->name[0] != '\0')

{

for(int i=0;i<films->num_a;i++)

printf(" %s",films->actors[i].actor);

}

films = films->next;

}while(films);

system("pause");

}

//Функция записи информации по 1-му фильму в файл

void WriteOneInFile(film *films,FILE *potok)

{

fputs(films->name,potok);

fprintf(potok,"%d\n",films->year);

fputs(films->type,potok);

fputs(films->country,potok);

fprintf(potok,"%d\n",films->budget);

fprintf(potok,"%d\n",films->cash);

fputs(films->rating,potok);

fprintf(potok,"%d\n",films->num_d);

for(int i=0;i<films->num_d;i++)

fputs(films->directors[i].director,potok);

fprintf(potok,"%d\n",films->num_a);

for(int i=0;i<films->num_a;i++)

fputs(films->actors[i].actor,potok);

fprintf(potok,"%d\n",films->num_p);

for(int i=0;i<films->num_p;i++)

fputs(films->producers[i].producer,potok);

}

//Функция удаления из очереди

void Delete(film **h)

{

system("cls");

char *st = (char *)malloc(N*sizeof(char));

printf("Введите название фильма для удаления:");

fflush(stdin);

gets(st);

strcat(st,"\n");

film *f,*pr;

if (!(*h)->next && // в очереди только один элемент

(!strcmp((*h)->name,st) || *st=='\0'))

{

free(*h);

*h=NULL; // очередь пуста

return;

}

pr=*h;

f=pr; // далее f предыдущий к pr элемент

while(pr)

{

if (!strcmp(pr->name,st)) // найден элемент со строкой st

{

if (pr==*h) {*h=pr->next; free(pr); f=pr=*h;}

else

{

f->next=pr->next; // обходим элемент pr

free(pr); // удаляем элемент pr очереди

pr=f->next; // выбор следующего элемента очереди pr

}

}

else {f=pr; pr=pr->next;} // переход к следующему элементу

}

puts("\n\n===Фильм удален!!!===\n\n");

system("pause");

}

Соседние файлы в папке MY TR(variant 19)