Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ура.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <stdlib.h>
- #include <cstdio>
- #include "locale.h"
- #include <cstdlib>
- #include <Windows.h>
- #pragma warning (disable:4996)
- typedef struct R
- {
- char name[25];//название книги
- char writer[50];//имя автора
- char *genre;//жанр
- int data;//год издания
- char country[30];//страна издания
- int page;//количество страниц
- long int tirag;//тираж
- }Books;
- typedef struct T
- {
- Books *book;//указатель на информационные поля
- struct T *next;//указатель на следующий элемент
- }List;
- //меню и подменю
- int Menu();//вывод главного меню
- List* Menu1(List*);//вывод подменю для добавления элемента
- int Menu2();//вывод подменю для удаления элемента
- void Menu3(List*, List*);//вывод подменю для вывода списка
- //Добавление элементов
- List* NewElement(List*);//добавление элементов
- List* NewBegin(List*);//добавление элемента в начало списка
- void NewPlace(List*);//добавление элемента в место, указанное пользователем
- void NewEnd(List*);//добавление элемента в конец списка
- List* InputFile(FILE*);//добавление элемента из файла
- //Ввод элементов
- List* InputOne();//ввод элемента списка
- char* InputGenre();//ввод поля "жанр"
- //Удаление элементов
- List* DeleteElement(List* N);//удаление элементов
- List* DeleteBegin(List*);//удаление первого элемента списка
- void DeletePlace(List*);//удаление элемента, указанного пользователем
- void DeleteEnd(List*);//удаление последнего элемента
- //Поиск элементов
- List* SearchElement(List*);//поиск нужного элемента
- List* Search(List *);//сортировка по заданному параметру
- List* SearchLast(List*);//поиск последнего
- List* NewList(List*);//формирование нового списка
- //Сортировка элементов
- void Sorting(List*);//сортировка по алфавиту
- int summa(List*);//вспомогательная функция к сортировке по алфавиту
- void end(List*);//вспомогательная функция к сортировке по алфавиту
- void end1(List*);//вспомогательная функция к сортировке по алфавиту
- //Вывод списка
- void OutputList(List*);//вывод списка на экран
- void OutputFile(FILE*, List*);//вывод списка в файл
- List* Free(List*);//освобождение памяти
- void Wellcome();//приветствие
- void Help();//справка
- void main()
- {
- List *first = NULL, *second = NULL;
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- int S;
- Wellcome();
- system("pause");
- do
- {
- system("cls");
- S = Menu();
- switch (S)
- {
- // добавление элементов
- case 1:
- system("cls");
- first = Menu1(first);
- break;
- //удаление элементов
- case 2:
- if (first != NULL)
- {
- system("cls");
- first = DeleteElement(first);
- }
- else
- {
- puts("Картотека не введена");
- system("pause");
- }
- break;
- //поиск элементов
- case 3:
- if (first != NULL)
- {
- second = Search(first);
- system("cls");
- }
- else
- puts("Картотека не введена");
- system("pause");
- break;
- //Сортировка элементов
- case 4:
- if (first != NULL)
- Sorting(first);
- else
- puts("Картотека не введена");
- system("pause");
- break;
- //Вывод элементов
- case 5:
- system("cls");
- Menu3(first, second);
- break;
- case 6:
- system("cls");
- Help();
- system("pause");
- break;
- case 0:
- first = Free(first);
- second = Free(second);
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- break;
- }
- } while (S != 0);
- }
- //вывод главного меню
- int Menu()
- {
- int S;
- puts("Выберите один из пунктов меню");
- puts("1.Добавить элементы в картотеку");
- puts("2.Удалить элементы из картотеки");
- puts("3.Найти нужный элемент");
- puts("4.Сортировать картотеку");
- puts("5.Вывести картотеку");
- puts("6.Помощь");
- puts("0.Выход из программы");
- scanf_s("%d", &S);
- return S;
- }
- //вывод подменю для добавления элемента
- List* Menu1(List* first)
- {
- int s;
- char w[30];
- FILE* file;
- List* H = NULL;
- puts("1.Ввести элементы с клавиатуры");
- puts("2.Ввести элементы из файла");
- puts("0.Вернуться в меню");
- scanf_s("%d", &s);
- switch (s)
- {
- case 1:
- system("cls");
- first = NewElement(first);
- break;
- case 2:
- system("cls");
- printf("Введите название файла:");
- fflush(stdin);
- gets(w);
- system("cls");
- puts("1.Добавить элементы в уже существующую картотеку");
- puts("2.Создать новую картотеку");
- puts("0.Вернуться в меню");
- puts("Если вы создатите новую картотеку, старая будет удалена");
- scanf("%d", &s);
- switch (s)
- {
- case 1:
- if (file = fopen(w, "r"))
- {
- H = InputFile(file);
- if (first != NULL)
- while (first->next != 0)
- first = first->next;
- first = H;
- if (first != NULL)
- puts("Картотека добавлена");
- else
- puts("Файл пуст");
- }
- else
- puts("Не удалось открыть файл");
- system("pause");
- break;
- case 2:
- Free(first);
- if (file = fopen(w, "r"))
- {
- first = InputFile(file);
- if (first != NULL)
- puts("Картотека добавлена");
- else
- puts("Файл пуст");
- }
- else
- puts("Не удалось открыть файл");
- system("pause");
- break;
- default:
- puts("Ошибка.Выберите один из пуктов меню");
- break;
- }
- break;
- case 3:
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- break;
- }
- return first;
- }
- //вывод подменю для удаления элемента
- int Menu2()
- {
- int s;
- puts("1.Удалить первый элемент");
- puts("2.Удалить выбранный элемент");
- puts("3.Удалить последний элемент");
- puts("0.Вернуться в главное меню");
- scanf_s("%d", &s);
- return s;
- }
- //вывод подменю для вывода списка
- void Menu3(List* first, List* second)
- {
- int s;
- FILE* file;
- char w[30];
- if (first != NULL || second != NULL)
- {
- puts("1.Вывести исходную картотеку на экран");
- puts("2.Вывести исходную картотеку в файл");
- puts("3.Вывести отсортированную картотеку на экран");
- puts("4.Вывести отсортированную картотеку в файл");
- puts("0.Вернуться в главное меню");
- scanf_s("%d", &s);
- switch (s)
- {
- case 1:
- system("cls");
- OutputList(first);
- system("pause");
- break;
- case 2:
- system("cls");
- printf("Введите имя файла:");
- fflush(stdin);
- gets(w);
- system("cls");
- puts("\n1.Добавить элементы в уже существующую картотеку");
- puts("2.Создать новую картотеку в файле");
- puts("0.Вернуться в главное меню");
- scanf_s("%d", &s);
- switch (s)
- {
- case 1:
- if (file = fopen(w, "a"))
- {
- OutputFile(file, first);
- system("pause");
- }
- break;
- case 2:
- if (file = fopen(w, "w"))
- {
- OutputFile(file, first);
- system("pause");
- }
- break;
- case 0:
- break;
- default:
- puts("Выберите один из пунктов меню");
- break;
- }
- case 3:
- system("cls");
- OutputList(second);
- system("pause");
- break;
- case 4:
- system("cls");
- printf("Введите имя файла:");
- fflush(stdin);
- gets(w);
- system("cls");
- puts("\n1.Добавить элементы в уже существующeую картотеку");
- puts("2.Создать новую картотеку в файле");
- puts("0.Вернуться в главное меню");
- scanf_s("%d", &s);
- switch (s)
- {
- case 1:
- if (file = fopen(w, "a"))
- {
- OutputFile(file, second);
- system("pause");
- }
- break;
- case 2:
- if (file = fopen(w, "w"))
- {
- OutputFile(file, second);
- system("pause");
- }
- break;
- case 0:
- break;
- default:
- puts("Выберите один из пунктов меню");
- break;
- }
- case 0:
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- }
- }
- else
- puts("Картотека не введена");
- }
- //ввод элемента списка
- List* InputOne()
- {
- List *N = NULL;
- N = (List*)malloc(sizeof(List));
- N->book = (Books*)malloc(sizeof(Books));
- N->next = NULL;
- do
- {
- printf("Введите название книги(не более 25 символов):");
- fflush(stdin);
- fgets((N->book->name), 30, stdin);
- if (strlen(N->book->name) > 25)
- puts("Извините, поле превышает 25 символов. Повторите ввод.");
- if (*(N->book->name) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(N->book->name) > 25) || (*(N->book->name) == '\n'));
- N->book->name[strlen(N->book->name) - 1] = '\0';
- do
- {
- printf("\nВведите автора книги(не более 25 символов):");
- fflush(stdin);
- fgets(N->book->writer, 55, stdin);
- if (strlen(N->book->writer) > 50)
- puts("Извините, поле превышает 50 символов. Повторите ввод.");
- if (*(N->book->writer) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(N->book->writer) > 50) || (*(N->book->writer) == '\n'));
- N->book->writer[strlen(N->book->writer) - 1] = '\0';
- N->book->genre = InputGenre();
- do
- {
- printf("\nВведите год издания:");
- fflush(stdin);
- scanf_s("%d", &(N->book->data));
- if ((N->book->data) > 2016)
- puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
- if ((N->book->data) <1600)
- puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
- } while ((((N->book->data) > 2016) || ((N->book->data) < 1600)));
- do
- {
- printf("\nВведите страну издания(не более 30 символов):");
- fflush(stdin);
- fgets(N->book->country, 55, stdin);
- if (strlen(N->book->country) > 30)
- puts("Извините, поле превышает 30 символов. Повторите ввод.");
- if (*(N->book->country) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(N->book->country) > 30) || (*(N->book->country) == '\n'));
- N->book->country[strlen(N->book->country) - 1] = '\0';
- do
- {
- printf("\nВведите количество страниц:");
- fflush(stdin);
- scanf_s("%d", &(N->book->page));
- if ((N->book->page) > 1500)
- puts("Извините, в книге не может быть больше 1500 страниц. Повторите ввод.");
- if ((N->book->page) <50)
- puts("Извините, в книге не может быть меньше 50 страниц. Повторите ввод.");
- } while ((((N->book->page) > 1500) || ((N->book->page) < 50)));
- do
- {
- printf("\nВведите тираж:");
- fflush(stdin);
- scanf_s("%d", &(N->book->tirag));
- if ((N->book->tirag) > 10000000)
- puts("Извините, книга не может быть выпущена тиражом более 10000000. Повторите ввод.");
- if ((N->book->tirag) <0)
- puts("Извините, книга не может быть выпущена тиражом меньше 0. Повторите ввод.");
- } while ((((N->book->tirag) > 10000000) || ((N->book->tirag) < 0)));
- return N;
- }
- //ввод поля "жанр"
- char* InputGenre()
- {
- int a;
- puts("\nВыберите жанр книги:");
- puts("1.Биография");
- puts("2.Детектив");
- puts("3.Детская литература");
- puts("4.Историческая литература");
- puts("5.Научная литература:");
- puts("6.Повесть");
- puts("7.Поэзия");
- puts("8.Роман");
- puts("9.Фантастика");
- scanf_s("%d", &a);
- switch (a)
- {
- case 1:
- return "Биография";
- break;
- case 2:
- return "Детектив";
- break;
- case 3:
- return "Детская_литература";
- break;
- case 4:
- return "Историческая_литература";
- break;
- case 5:
- return "Научная _литература";
- break;
- case 6:
- return "Повесть";
- break;
- case 7:
- return "Поэзия";
- break;
- case 8:
- return "Роман";
- break;
- case 9:
- return "Фантастика";
- break;
- default:
- return ("Жанр не указан");
- break;
- }
- }
- //добавление элемента в начало списка
- List* NewBegin(List *N)
- {
- List* H;
- H = InputOne();
- H->next = N;
- return H;
- }
- //добавление элемента в конец списка
- void NewEnd(List *N)
- {
- List* H;
- H = InputOne();
- while (N->next != NULL)
- N = N->next;
- N->next = H;
- }
- //добавление элемента в место, указанное пользователем
- void NewPlace(List* N)
- {
- List* K;
- N = SearchElement(N);
- if (N == NULL)
- {
- puts("Такого элемента нет");
- system("pause");
- }
- else
- {
- K = InputOne();
- K->next = N->next;
- N->next = K;
- }
- }
- //добавление элементов
- List* NewElement(List*N)
- {
- if (N != NULL)
- {
- int s;
- puts("1.Добавить элемент в начало");
- puts("2.Добавить элемент после выбранного элемента");
- puts("3.Добавить элемент в конец");
- puts("0.Вернуться в главное меню");
- scanf_s("%d", &s);
- switch (s)
- {
- // в начало
- case 1:
- system("cls");
- N = NewBegin(N);
- break;
- // после выбранного
- case 2:
- system("cls");
- NewPlace(N);
- break;
- // в конец
- case 3:
- system("cls");
- NewEnd(N);
- break;
- case 0:
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- break;
- }
- }
- else
- {
- N = InputOne();
- }
- return N;
- }
- //добавление элемента из файла
- List* InputFile(FILE* f)
- {
- List *N, *H = NULL, *P = NULL;
- Books *O;
- fpos_t pos;
- fseek(f, 0L, SEEK_END);
- fgetpos(f, &pos);
- fseek(f, 0L, SEEK_SET);
- if (pos != 0)
- {
- while (!feof(f))
- {
- N = (List*)malloc(sizeof(List));
- O = (Books*)malloc(sizeof(Books));
- O->genre = (char*)malloc(sizeof(char));
- N->book = O;
- fscanf(f, "%s\t\%s\t\%s\t\%d\t\%s\t\%d\t\%d\n", N->book->name, N->book->writer, N->book->genre, &(N->book->data), N->book->country, &(N->book->page), &(N->book->tirag));
- if (P == NULL)
- H = N;
- else
- P->next = N;
- P = N;
- }
- fclose(f);
- P->next = NULL;
- }
- return H;
- }
- //удаление первго элемента списка
- List* DeleteBegin(List* N)
- {
- if (N != NULL)
- {
- List* H;
- H = N->next;
- free(N->book);
- free(N);
- return H;
- }
- else
- {
- puts("Картотека не введена");
- system("pause");
- }
- }
- //удаление последнего элемента списка
- void DeleteEnd(List* N)
- {
- if (N != NULL)
- {
- List* K, *H;
- H = N;
- if (H->next != NULL)
- {
- H = SearchLast(H);
- }
- K = H;
- free(K->book);
- free(K);
- }
- else
- {
- puts("Картотека не введена");
- system("pause");
- }
- }
- //удаление элемента, указанного пользователем
- void DeletePlace(List* H)
- {
- if (H != NULL)
- {
- List* N, *K;
- N = H;
- N = SearchElement(N);
- if (N = NULL)
- {
- puts("Такого элемента нет");
- system("pause");
- }
- else
- {
- K = N->next;
- N->next = N->next->next;
- free(K->book);
- free(K);
- }
- }
- else
- {
- puts("Картотека не введена");
- system("pause");
- }
- }
- //удаление элементов
- List* DeleteElement(List* N)
- {
- if (N != NULL)
- {
- int s;
- system("cls");
- s = Menu2();
- switch (s)
- {
- // первый элемент
- case 1:
- system("cls");
- N = DeleteBegin(N);
- puts("Элемент удален");
- system("pause");
- break;
- // выбранный элемент
- case 2:
- system("cls");
- DeletePlace(N);
- puts("Элемент удален");
- system("pause");
- break;
- // последний элемент
- case 3:
- system("cls");
- DeleteEnd(N);
- puts("Элемент удален");
- system("pause");
- break;
- case 0:
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- break;
- }
- }
- else
- {
- puts("Картотека не введена");
- system("pause");
- }
- return N;
- }
- //вывод списка на экран
- void OutputList(List *N)
- {
- if (N != NULL)
- {
- while (N != NULL)
- {
- printf("\nНазвание книги: %s\n", N->book->name);
- printf("Автор книги: %s\n", N->book->writer);
- printf("Жанр: %s\n", N->book->genre);
- printf("Год выпуска: %d\n", N->book->data);
- printf("Страна: %s\n", N->book->country);
- printf("Количество страниц: %d\n", N->book->page);
- printf("Тираж: %d\n", N->book->tirag);
- N = N->next;
- }
- }
- else
- {
- puts("Картотека не введена");
- }
- }
- //вывод списка в файл
- void OutputFile(FILE* file, List* N)
- {
- while (N != NULL)
- {
- fprintf(file, "%s\t\%s\t\%s\t\%d\t\%s\t\%d\t\%d\n", N->book->name, N->book->writer, N->book->genre, N->book->data, N->book->country, N->book->page, N->book->tirag);
- N = N->next;
- }
- fclose(file);
- }
- //освобождение памяти
- List *Free(List* N)
- {
- if (N != NULL)
- {
- List* H, *K = NULL;
- Books* M;
- while (N->next != NULL)
- {
- H = N->next;
- K = N;
- //free(N->book->genre);
- M = N->book;
- free(M);
- free(K);
- if (H != NULL)
- N = H;
- }
- free(N->book);
- free(N);
- }
- return NULL;
- }
- //формирование нового списка
- List* NewList(List* N, List *NN)
- {
- List* B;
- B = (List*)malloc(sizeof(List));
- B->book = N->book;
- B->next = NULL;
- if (NN != NULL)
- NN->next = B;
- else
- NN = B;
- return NN;
- }
- //поиск элемента
- List* SearchElement(List *N)
- {
- int y;
- Books* search = (Books*)malloc(sizeof(Books));
- puts("Выберите по какому полю вы хотите произвести поиск:\n1.Название книги\n2.Автор книги\n3.Жанр\n4.Год издания\n5.Страна издания\n6.Количество страниц\n7.Тираж\n0.Завершить поиск");
- scanf_s("%d", &y);
- switch (y)
- {
- case 1:
- do
- {
- printf("Введите название книги(не более 25 символов):");
- fflush(stdin);
- fgets((search->name), 30, stdin);
- if (strlen(search->name) > 25)
- puts("Извините, поле превышает 25 символов. Повторите ввод.");
- if (*(search->name) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(search->name) > 25) || (*(search->name) == '\n'));
- search->name[strlen(search->name) - 1] = '\0';
- for (; N != NULL; N = N->next)
- {
- y = strcmp(N->book->name, search->name);
- if (y == 0)
- return N;
- }
- break;
- case 2:
- do
- {
- printf("\nВведите автора книги(не более 25 символов):");
- fflush(stdin);
- fgets(search->writer, 55, stdin);
- if (strlen(search->writer) > 50)
- puts("Извините, поле превышает 50 символов. Повторите ввод.");
- if (*(search->writer) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(search->writer) > 50) || (*(search->writer) == '\n'));
- search->writer[strlen(search->writer) - 1] = '\0';
- for (; N != NULL; N = N->next)
- {
- y = strcmp(N->book->writer, search->writer);
- if (y == 0)
- return N;
- }
- break;
- case 3:
- search->genre = (char*)malloc(sizeof(char));
- search->genre = InputGenre();
- for (; N != NULL; N = N->next)
- {
- y = strcmp(N->book->genre, search->genre);
- if (y == 0)
- return N;
- }
- break;
- case 4:
- do
- {
- printf("\nВведите год издания:");
- fflush(stdin);
- scanf_s("%d", &(search->data));
- if ((search->data) > 2016)
- puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
- if ((search->data) < 1600)
- puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
- } while ((((search->data) > 2016) || ((search->data) < 1600)));
- for (; N != NULL; N = N->next)
- {
- if (N->book->data == search->data);
- return N;
- }
- break;
- case 5:
- do
- {
- printf("\nВведите страну издания(не более 30 символов):");
- fflush(stdin);
- fgets(search->country, 55, stdin);
- if (strlen(search->country) > 30)
- puts("Извините, поле превышает 30 символов. Повторите ввод.");
- if (*(search->country) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(search->country) > 30) || (*(search->country) == '\n'));
- search->country[strlen(search->country) - 1] = '\0';
- for (; N != NULL; N = N->next)
- {
- y = strcmp(N->book->country, search->country);
- if (y == 0)
- return N;
- }
- break;
- case 6:
- do
- {
- printf("\nВведите количество страниц:");
- fflush(stdin);
- scanf_s("%d", &(search->page));
- if ((search->page) > 1500)
- puts("Извините, в книге не может быть больше 1500 страниц. Повторите ввод.");
- if ((search->page) < 50)
- puts("Извините, в книге не может быть меньше 50 страниц. Повторите ввод.");
- } while ((((search->page) > 1500) || ((search->page) < 50)));
- for (; N != NULL; N = N->next)
- {
- if ((N->book->page == search->page))
- return N;
- }
- break;
- case 7:
- do
- {
- printf("\nВведите тираж:");
- fflush(stdin);
- scanf_s("%d", &(search->tirag));
- if ((search->tirag) > 10000000)
- puts("Извините, книга не может быть выпущена тиражом более 10000000. Повторите ввод.");
- if ((search->tirag) < 0)
- puts("Извините, книга не может быть выпущена тиражом меньше 0. Повторите ввод.");
- } while ((((search->tirag) > 10000000) || ((search->tirag) < 0)));
- for (; N != NULL; N = N->next)
- {
- if ((N->book->tirag == search->tirag))
- return N;
- }
- break;
- case 0:
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- break;
- }
- return NULL;
- }
- //сортировка элементов по значению
- List* Search(List* N)
- {
- List* NN = NULL, *Q = NULL;
- int y, i = 0;
- Books* search = (Books*)malloc(sizeof(Books));
- do
- {
- system("cls");
- puts("Выберите по какому полю вы хотите произвести поиск:\n1.Название книги\n2.Автор книги\n3.Жанр\n4.Год издания\n5.Страна издания\n6.Количество страниц\n7.Тираж\n0.Завершить сортировку");
- scanf_s("%d", &y);
- i++;
- switch (y)
- {
- case 1:
- do
- {
- printf("Введите название книги(не более 25 символов):");
- fflush(stdin);
- fgets((search->name), 30, stdin);
- if (strlen(search->name) > 25)
- puts("Извините, поле превышает 25 символов. Повторите ввод.");
- if (*(search->name) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(search->name) > 25) || (*(search->name) == '\n'));
- search->name[strlen(search->name) - 1] = '\0';
- if (i == 1)
- {
- for (; N != NULL; N = N->next)
- {
- y = strcmp(N->book->name, search->name);
- if (y == 0)
- NN = NewList(N, NN);
- }
- }
- else
- {
- for (; NN != NULL; NN = NN->next)
- {
- y = strcmp(N->book->name, search->name);
- if (y == 0)
- Q = NewList(NN, Q);
- }
- NN = Q;
- Free(Q);
- }
- puts("Поиск выполнен");
- system("pause");
- break;
- case 2:
- do
- {
- printf("\nВведите автора книги(не более 25 символов):");
- fflush(stdin);
- fgets(search->writer, 55, stdin);
- if (strlen(search->writer) > 50)
- puts("Извините, поле превышает 50 символов. Повторите ввод.");
- if (*(search->writer) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(search->writer) > 50) || (*(search->writer) == '\n'));
- search->writer[strlen(search->writer) - 1] = '\0';
- if (i == 1)
- {
- for (; N != NULL; N = N->next)
- {
- y = strcmp(N->book->writer, search->writer);
- if (y == 0)
- NN = NewList(N, NN);
- }
- }
- else
- {
- for (; NN != NULL; NN = NN->next)
- {
- y = strcmp(N->book->writer, search->writer);
- if (y == 0)
- Q = NewList(NN, Q);
- }
- NN = Q;
- Free(Q);
- }
- puts("Поиск выполнен");
- system("pause");
- break;
- case 3:
- search->genre = (char*)malloc(sizeof(char));
- search->genre = InputGenre();
- if (i == 1)
- {
- for (; N != NULL; N = N->next)
- {
- y = strcmp(N->book->genre, search->genre);
- if (y == 0)
- NN = NewList(N, NN);
- }
- }
- else
- {
- for (; NN != NULL; NN = NN->next)
- {
- y = strcmp(N->book->genre, search->genre);
- if (y == 0)
- Q = NewList(NN, Q);
- }
- NN = Q;
- Free(Q);
- }
- puts("Поиск выполнен");
- system("pause");
- break;
- case 4:
- do
- {
- printf("\nВведите год издания:");
- fflush(stdin);
- scanf_s("%d", &(search->data));
- if ((search->data) > 2016)
- puts("Извините, книга не может быть выпущена после 2016 года. Повторите ввод.");
- if ((search->data) <1600)
- puts("Извините, книга не может быть выпущена раньше 1600 года. Повторите ввод.");
- } while ((((search->data) > 2016) || ((search->data) < 1600)));
- if (i == 1)
- {
- for (; N != NULL; N = N->next)
- {
- if (N->book->data == search->data)
- NN = NewList(N, NN);
- }
- }
- else
- {
- for (; NN != NULL; NN = NN->next)
- {
- if (N->book->data == search->data)
- Q = NewList(NN, Q);
- }
- NN = Q;
- Free(Q);
- }
- puts("Поиск выполнен");
- system("pause");
- break;
- case 5:
- do
- {
- printf("\nВведите страну издания(не более 30 символов):");
- fflush(stdin);
- fgets(search->country, 55, stdin);
- if (strlen(search->country) > 30)
- puts("Извините, поле превышает 30 символов. Повторите ввод.");
- if (*(search->country) == '\n')
- puts("Извините, поле пустое. Повторите ввод.");
- } while ((strlen(search->country) > 30) || (*(search->country) == '\n'));
- search->country[strlen(search->country) - 1] = '\0';
- if (i == 1)
- {
- for (; N != NULL; N = N->next)
- {
- y = strcmp(N->book->country, search->country);
- if (y == 0)
- NN = NewList(N, NN);
- }
- }
- else
- {
- for (; NN != NULL; NN = NN->next)
- {
- y = strcmp(N->book->country, search->country);
- if (y == 0)
- Q = NewList(NN, Q);
- }
- NN = Q;
- Free(Q);
- }
- puts("Поиск выполнен");
- system("pause");
- break;
- case 6:
- do
- {
- printf("\nВведите количество страниц:");
- fflush(stdin);
- scanf_s("%d", &(search->page));
- if ((search->page) > 1500)
- puts("Извините, в книге не может быть больше 1500 страниц. Повторите ввод.");
- if ((search->page) <50)
- puts("Извините, в книге не может быть меньше 50 страниц. Повторите ввод.");
- } while ((((search->page) > 1500) || ((search->page) < 50)));
- if (i == 1)
- {
- for (; N != NULL; N = N->next)
- {
- if (N->book->page == search->page)
- NN = NewList(N, NN);
- }
- }
- else
- {
- for (; NN != NULL; NN = NN->next)
- {
- if (N->book->page == search->page)
- Q = NewList(NN, Q);
- }
- NN = Q;
- Free(Q);
- }
- puts("Поиск выполнен");
- system("pause");
- break;
- case 7:
- do
- {
- printf("\nВведите тираж:");
- fflush(stdin);
- scanf_s("%d", &(search->tirag));
- if ((search->tirag) > 10000000)
- puts("Извините, книга не может быть выпущена тиражом более 10000000. Повторите ввод.");
- if ((search->tirag) <0)
- puts("Извините, книга не может быть выпущена тиражом меньше 0. Повторите ввод.");
- } while ((((search->tirag) > 10000000) || ((search->tirag) < 0)));
- if (i == 1)
- {
- for (; N != NULL; N = N->next)
- {
- if (N->book->tirag == search->tirag)
- NN = NewList(N, NN);
- }
- }
- else
- {
- for (; NN != NULL; NN = NN->next)
- {
- if (N->book->tirag == search->tirag)
- Q = NewList(NN, Q);
- }
- NN = Q;
- Free(Q);
- }
- puts("Поиск выполнен");
- system("pause");
- break;
- case 0:
- break;
- default:
- puts("Ошибка.Выберите поле для сортировки");
- system("pause");
- break;
- }
- } while (y != 0);
- return NN;
- }
- //сортировка элементов по алфавиту
- void Sorting(List* H)
- {
- int summ, summ1;
- summ = summa(H);
- do
- {
- summ1 = summa(H);
- if (summ1 > 2)
- end(H);
- else
- {
- if (summ1 == 2)
- end1(H);
- }
- H = H->next;
- summ--;
- } while (summ != 0);
- }
- //вспомогательная функция к Sorting
- void end(List *h)
- {
- List *p = NULL, *q, *w, *e;
- int z, stop = 0, summ;
- summ = summa(h);
- if (h == NULL)
- stop = 1;
- if (stop != 1)
- {
- do
- {
- z = strcmp(h->book->name, (h->next)->book->name);
- if (z <= 0)//отсылка мах в конец
- {
- e = h->next;
- q = (List*)malloc(sizeof(List));
- q->book = e->book;
- q->next = NULL;
- h->next = e->next;
- free(e);
- if (h->next != NULL)
- if (h->next != NULL)
- {
- p = SearchLast(h);
- (p->next)->next = q;
- }
- }
- if (z > 0) //смена мест
- {
- q = (List*)malloc(sizeof(List));
- w = h->next;
- q->book = w->book;
- w->book = h->book;
- h->book = q->book;
- free(q);
- summ++;
- }
- summ--;
- } while (summ != 0);
- }
- }
- //вспомогательная функция к Sorting
- void end1(List *h)
- {
- List *p, *e, *q, *w;
- int z;
- z = strcmp(h->book->writer, (h->next)->book->writer);
- if (z < 0)//отсылка мах в конец
- {
- e = h->next;
- q = (List*)malloc(sizeof(List));
- q->book = e->book;
- q->next = NULL;
- h->next = q;
- free(e);
- if (h->next != NULL)
- {
- p = SearchLast(h);
- (p->next)->next = q;
- q->next = NULL;
- }
- }
- if (z > 0) //смена мест
- {
- q = (List*)malloc(sizeof(List));
- w = h->next;
- q->book = w->book;
- w->book = h->book;
- h->book = q->book;
- free(q);
- }
- }
- //посдчет элементов
- int summa(List *p)
- {
- int i = 0;
- while (p != NULL)
- {
- i = i + 1;
- p = p->next;
- }
- return i;
- }
- //поиск последнего элемента
- List *SearchLast(List *H)
- {
- List *R;
- R = NULL;
- if (H != NULL)
- {
- R = H;
- if (R->next != NULL)
- {
- while ((R->next)->next != NULL)
- R = R->next;
- }
- }
- return R;
- }
- void Wellcome()
- {
- puts("Здравствуйте! Вас Приветствует Электронная Библиотека!\n");
- puts("С помочью 1 пункта меню, Вы можете создать электронную картотеку");
- puts("Вашей библиотеки. Вы можете вводить данные с клавиатуры ");
- puts("или загрузить их из файла.\n");
- puts("С помощью 2 пункта меню Вы можете удалить элементы ");
- puts("картотеки.\n");
- puts("С помощью 3 пункта меню Вы можете найти элементы картотеки, ");
- puts("по значению одного или нескольких полей.\n");
- puts("С помощью пункта 4 меню Вы можете отсортировать Вашу картотеку");
- puts("в алфавитном порядке.\n");
- puts("С помощью пункта 5 меню Вы можете посмотреть вашу картотеку");
- puts("или сохранить её в файл.\n");
- puts("Если у Вас возникли какие-то сложности, с выполнение программы");
- puts("в 6 пункте меню, вы можете посмотреть подсказки.\n");
- puts("Для завершения работы программы, выберите нажмите 0.");
- }
- void Help()
- {
- puts("• Ввести элементы картотеки – нажать 1.");
- puts("• Удалить элементы картотеки - нажать 2.");
- puts("• Найти элементы - нажать 3.");
- puts("• Выполнить сортировку по алфавиту – нажать 4");
- puts("• Посмотреть или сохранить картотеку – нажать 5");
- puts("• Help – нажать 6.");
- puts("• Завершить работу программы – нажать 0.");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement