Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // точно окончательный.cpp : Defines the entry point for the console application.
- //
- // может окончательный.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;//год издания
- }Books;
- typedef struct T
- {
- Books *book;//указатель на информационные поля
- struct T *next;//указатель на следующий элемент
- }List;
- int Menu();//вывод главного меню
- int Menu1();//вывод подменю для добавления элемента
- int Menu2();//вывод подменю для удаления элемента
- List* InputOne();//ввод элемента списка
- char* InputGenre();//ввод поля "жанр"
- void OutputList(List*);//вывод списка на экран
- void NewEnd(List*);//добавление элемента в конец списка
- void DeleteEnd(List*);//удаление последнего элемента
- void Free(List*);//освобождение памяти
- void OutputFile(List*);
- List* InputFile();
- void main()
- {
- List *first = NULL, *second = NULL;
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- int S, s;
- bool A = false, B = false;
- do
- {
- system("cls");
- S = Menu();
- switch (S)
- {
- // добавление элементов
- case 1:
- system("cls");
- s = Menu1();
- switch (s)
- {
- // с клавиатуры
- case 1:
- system("cls");
- if (A == false)
- {
- first = InputOne();
- A = true;
- }
- else
- {
- NewEnd(first);
- }
- break;
- // из файла
- case 2:
- system("cls");
- first = InputFile();
- A = true;
- break;
- case 3:
- system("cls");
- DeleteEnd(first);
- puts("Элемнет удален");
- system("pause");
- break;
- case 0:
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- break;
- }
- break;
- case 2:
- system("cls");
- if (A == true)
- {
- s = Menu2();
- switch (s)
- {
- case 1:
- system("cls");
- OutputList(first);
- system("pause");
- break;
- case 2:
- system("cls");
- OutputFile(first);
- system("pause");
- break;
- case 3:
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- }
- }
- else
- {
- system("cls");
- puts("Список не введен");
- system("pause");
- }
- break;
- case 0:
- if (A == true)
- Free(first);
- break;
- default:
- puts("Ошибка. Выберите один из пунктов меню");
- break;
- }
- } while (S != 0);
- }
- //вывод главного меню
- int Menu()
- {
- int S;
- puts("Выберите один из пунктов меню");
- puts("1.Ввод списка");
- puts("2.Вывод списка");
- puts("0.Выход из программы");
- scanf_s("%d", &S);
- return S;
- }
- //вывод подменю для добавления элемента
- int Menu1()
- {
- int s;
- puts("1.Добавить элементы с клавиатуры");
- puts("2.Добавить элементы из файла");
- puts("3.Удалить элемент из файла");
- puts("0.Вернуться в главное меню");
- scanf_s("%d", &s);
- return s;
- }
- //вывод подменю для вывода списка
- int Menu2()
- {
- int s;
- puts("1.Вывести список на экран");
- puts("2.Вывести список в файл");
- puts("0.Вернуться в главное меню");
- scanf_s("%d", &s);
- return s;
- }
- //ввод элемента списка
- 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)));
- 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;
- }
- }
- //вывод списка на экран
- void OutputList(List *N)
- {
- if (N != NULL)
- {
- while (N->next != NULL)
- {
- printf("\nНазвание книги: %s", N->book->name);
- printf("\nАвтор книги: %s", N->book->writer);
- printf("\nЖанр: %s\n", N->book->genre);
- printf("Год выпуска: %d\n", N->book->data);
- N = N->next;
- }
- printf("\nНазвание книги: %s", N->book->name);
- printf("\nАвтор книги: %s", N->book->writer);
- printf("\nЖанр: %s\n", N->book->genre);
- printf("Год выпуска: %d\n", (N->book->data));
- }
- else
- {
- puts("В списке нет элементов");
- system("pause");
- }
- }
- //добавление элемента в конец списка
- void NewEnd(List *N)
- {
- List* H;
- H = InputOne();
- while (N->next != NULL)
- N = N->next;
- N->next = H;
- }
- //удаление последнего элемента списка
- void DeleteEnd(List* N)
- {
- if (N != NULL)
- {
- List* K, *H;
- H = N;
- while (H->next != NULL)
- H = H->next;
- K = H;
- free(K->book);
- free(K);
- }
- else
- {
- puts("В списке нет элементов");
- system("pause");
- }
- }
- //освобождение памяти
- void 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);
- }
- }
- void OutputFile(List* N)
- {
- FILE* f;
- f = fopen("test.txt", "w");
- while (N != NULL)
- {
- fprintf(f, "%s\t\%s\t\%s\t\%d\n", N->book->name, N->book->writer, N->book->genre, N->book->data);
- N = N->next;
- }
- fclose(f);
- }
- List* InputFile()
- {
- FILE* f;
- List *N, *H = NULL, *P = NULL ;
- Books *O ;
- if ((f = fopen("test.txt", "r")))
- {
- 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 %s %s %d", N->book->name, N->book->writer, N->book->genre, &(N->book->data));
- if (P == NULL)
- H = N;
- else
- P->next = N;
- P = N;
- }
- fclose(f);
- P->next = NULL;
- }
- return H;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement