Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <windows.h>
- #include <conio.h>
- #include <iostream>
- using namespace std;
- struct Book //Структура книги
- {
- char* author; //Имя автора книги
- char* name; //Название книги
- int pages; //Количество страниц в книге
- int price; //Цена книги
- Book* next; //Указатель на следующую книгу
- Book* prev; //Указатель
- };
- Book* CreateBook(); //Функция создания стандартной книги
- Book* AddBook(Book* List); //Функция добавления книги в список книг
- Book* EditBook(Book* book); //Функция редактирования книги в списке книг
- Book* RemoveBook(Book* book); //Функция удаления книги из списка книг
- Book* BookEditor(Book* book); //Редактор книги
- int Write_int(bool zero = false); //Безопасный ввод числа
- char* strEdit(bool Number = false); //Редактор строки
- Book* FindBookOnIndex(Book* List, UINT index); //Функция поиска книги по индексу. Возвращает NULL если не нашёл
- int GetListSize(Book* List); //Возвращает длину списка
- void OutputBooks(Book* List); //Вывод списка книг
- void DeleteList(Book* List); //Удаляет список книг
- Book* ReadFile(const char* fileName); //Функция считывает структуры из файла в бинарном виде
- void WriteFile(const char* fileName, Book* List); //Функция записывает структуры в файл в бинарном виде
- char* myStrCpy(char* str, int &start, char symbol_stop); //Строка которую читаем, позиция с которой необходимо считать, символ на котором чтение будет закончено
- Book* GetFirstElementList(Book* List); //Функция возвращает первый элемент списка
- int main()
- {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- Book* List = NULL; //Создаём указатель на список книг
- bool whileRun = true;
- while(whileRun) //Главный цикл программы
- {
- system("cls"); //Очистка экрана
- printf("[Главное меню]\n1.Добавить книгу\n2.Редактировать книгу\n3.Удалить книгу\n4.Показать список книг\n5.Сохранить список книг\n6.Загрузить список книг\n7.Выход\nВвод: ");
- switch(Write_int())
- {
- case 1: //[Главное меню] :: Добавить книгу
- {
- List = AddBook(List);
- break;
- }
- case 2: //[Главное меню] :: Редактировать книгу
- List = EditBook(List);
- break;
- case 3: //[Главное меню] :: Удалить книгу
- List = RemoveBook(List);
- break;
- case 4: //[Главное меню] :: Показать список книг
- OutputBooks(List);
- break;
- case 5: //[Главное меню] :: Сохранить список книг
- WriteFile("out.txt", List);
- break;
- case 6: //[Главное меню] :: Загрузить список книг
- List = ReadFile("out.txt");
- break;
- case 7: //[Главное меню] :: Выход
- whileRun = false;
- break;
- default:
- break;
- }
- }
- DeleteList(List);
- return 0;
- }
- Book* CreateBook() //Функция создания книги
- {
- Book* newBook = new Book;
- newBook->author = new char[7];
- strcpy(newBook->author, "Author");
- newBook->name = new char[5];
- strcpy(newBook->name, "Name");
- newBook->pages = 0;
- newBook->price = 0;
- newBook->prev = NULL;
- newBook->next = NULL;
- return newBook;
- }
- int Write_int(bool zero) //Безопасный ввод числа
- {
- char str[10];
- int value = 0;
- while(true)
- {
- scanf("%s", str);
- value = atoi(str)? atoi(str) : 0;
- if(zero)
- {
- if(str[0] == '0')
- value = 0;
- if(value >= 0)
- break;
- else
- printf("Введите значение |n| >= 0: ");
- }
- else
- {
- if(value > 0)
- break;
- else
- printf("Введите значение |n| > 0: ");
- }
- }
- return value;
- }
- Book* AddBook(Book* List) //Функция добавления книги в список книг
- {
- if(List != NULL)
- {
- Book* copyList = List;
- Book* newBook = BookEditor(NULL);
- while(copyList->next != NULL)
- copyList = copyList->next;
- copyList->next = newBook;
- newBook->prev = copyList;
- }
- else
- List = BookEditor(NULL);
- printf("Книга успешно добавлена в список книг!\n");
- printf("Нажмите любую клавишу для продолжения...\n");
- _getch();
- return List;
- }
- Book* EditBook(Book* List) //Функция редактирования книги в списке книг
- {
- system("cls");
- printf("Введите индекс редактируемой книги: ");
- UINT index = Write_int(true);
- Book* editBook = FindBookOnIndex(List, index);
- if(editBook != NULL)
- {
- BookEditor(editBook);
- printf("Книга %d была успешно изменена!\n", index);
- }
- else
- {
- printf("Книга не найдена...\n");
- }
- printf("Нажмите любую клавишу для продолжения...\n");
- _getch();
- return List;
- }
- Book* RemoveBook(Book* List) //Функция удаления книги из списка книг
- {
- system("cls");
- printf("Введите индекс удаляемой книги: ");
- UINT index = Write_int(true);
- Book* deletedBook = FindBookOnIndex(List, index);
- if(deletedBook == NULL)
- {
- printf("Книга не найдена...\n");
- }
- else
- {
- if(deletedBook->prev != NULL && deletedBook->next != NULL)
- {
- deletedBook->prev->next = deletedBook->next;
- deletedBook->next->prev = deletedBook->prev;
- }
- else
- {
- if(deletedBook->prev != NULL)
- deletedBook->prev->next = NULL;
- else
- if(deletedBook->next != NULL)
- deletedBook->next->prev = NULL;
- else
- List = NULL;
- }
- delete deletedBook;
- }
- printf("Нажмите любую клавишу для продолжения...\n");
- _getch();
- return List;
- }
- int GetListSize(Book* List) //Возвращает длину списка
- {
- Book* copyList = List;
- int i = 0;
- while(copyList != NULL)
- {
- copyList = copyList->next;
- i++;
- }
- return i;
- }
- Book* GetFirstElementList(Book* List) //Функция возвращает первый элемент списка
- {
- Book* copyList = List;
- while(copyList->prev != NULL)
- copyList = copyList->prev;
- return copyList;
- }
- void DeleteList(Book* List) //Удаляет список книг
- {
- while(List != NULL)
- {
- Book* tmp = List;
- List = List->next;
- delete tmp;
- }
- }
- char* strEdit(bool Number) //Редактор строки
- {
- system("cls");
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- COORD pos;
- pos.Y = 1;
- pos.X = 0;
- char* cloneStr = NULL;
- char* str = NULL;
- if(Number)
- printf("Число:\n");
- else
- printf("Строка:\n");
- while(true)
- {
- int symbol = _getch();
- cloneStr = new char[pos.X + 1];
- for (int i = 0; i < pos.X; i++)
- if (str[i] != '\0')
- cloneStr[i] = str[i];
- str = new char[pos.X + 1];
- for (int i = 0; i < pos.X; i++)
- str[i] = cloneStr[i];
- delete[] cloneStr;
- if (symbol >= 97 && symbol <= 122 && !Number && pos.X < 50)
- {
- str[pos.X] = symbol;
- printf("%c", str[pos.X]);
- pos.X++;
- }
- if(symbol == 32 && !Number && pos.X < 50)
- {
- str[pos.X] = ' ';
- printf("%c", ' ');
- pos.X++;
- }
- if(symbol >= 48 && symbol <= 58 && pos.X < 50 && Number)
- {
- str[pos.X] = symbol;
- printf("%c", str[pos.X]);
- pos.X++;
- }
- if (symbol == 8 && pos.X > 0)
- {
- str[pos.X] = ' ';
- pos.X--;
- SetConsoleCursorPosition(hConsole, pos);
- printf("%s", " ");
- }
- SetConsoleCursorPosition(hConsole, pos);
- if (symbol == 13)
- {
- str[pos.X] = '\0';
- break;
- }
- }
- delete[] cloneStr;
- return str;
- }
- Book* BookEditor(Book* book)
- {
- if(book == NULL)
- book = CreateBook();
- bool RUN = true;
- while(RUN)
- {
- system("cls");
- printf("[Редактор книг]\n1.Автор\n2.Название\n3.Кол. стр.\n4.Цена\n5.Сохранить\n6.Стандартная книга.\nВыбор: ");
- int intt = Write_int();
- switch(intt)
- {
- case 1:
- book->author = strEdit();
- break;
- case 2:
- book->name = strEdit();
- break;
- case 3:
- book->pages = atoi(strEdit(true));
- break;
- case 4:
- book->price = atoi(strEdit(true));
- break;
- case 5:
- RUN = false;
- break;
- case 6:
- if(book != NULL)
- delete book;
- book = CreateBook();
- RUN = false;
- break;
- default:
- break;
- }
- }
- return book;
- }
- Book* FindBookOnIndex(Book* List, UINT index) //Функция поиска книги по индексу. Возвращает NULL если не нашёл;
- {
- Book* copyList = List;
- UINT i = 0;
- while(copyList != NULL && i != index)
- {
- copyList = copyList->next;
- i++;
- }
- return copyList;
- }
- void OutputBooks(Book* List) //Вывод списка книг
- {
- if(List == NULL)
- {
- system("cls");
- printf("Список пуст, заполните список хотя-бы одним элементом!\nНажмите любую клавишу для продолжения...\n");
- _getch();
- return;
- }
- UINT Size = GetListSize(List);
- Book* copyList = List;
- Book** Array = new Book*[Size];
- int* index = new int[Size];
- for(UINT i = 0; i < Size; i++)
- {
- index[i] = i;
- Array[i] = copyList;
- if(copyList->next != NULL)
- copyList = copyList->next;
- }
- int temp = 0; //Временная переменная, чтобы менять индексы местами
- bool RUN = true, output = false;
- while(RUN)
- {
- system("cls");
- printf("[Вывод списка книг]\n1.По индексу\n2.По автору\n3.По названию\n4.По кол. стр.\n5.По цене\n6.Рекомендация\n7.Назад\nВыбор: ");
- switch(Write_int())
- {
- case 1:
- RUN = false;
- output = true;
- break;
- case 2: //Сортировка по автору
- for (UINT i = 0; i < Size - 1; i++)
- for (UINT j = 0; j < Size - i - 1; j++)
- if (strcmp(Array[index[j]]->author, Array[index[j + 1]]->author)> 0)
- {
- temp = index[j];
- index[j] = index[j + 1];
- index[j + 1] = temp;
- }
- RUN = false;
- output = true;
- break;
- case 3: //Сортировка по названию
- for (UINT i = 0; i < Size - 1; i++)
- for (UINT j = 0; j < Size - i - 1; j++)
- if (strcmp(Array[index[j]]->name, Array[index[j + 1]]->name)> 0)
- {
- temp = index[j];
- index[j] = index[j + 1];
- index[j + 1] = temp;
- }
- RUN = false;
- output = true;
- break;
- case 4: //Сортировка по количеству страниц
- for (UINT i = 0; i < Size - 1; i++)
- for (UINT j = 0; j < Size - i - 1; j++)
- if (Array[index[j]]->pages > Array[index[j + 1]]->pages)
- {
- temp = index[j];
- index[j] = index[j + 1];
- index[j + 1] = temp;
- }
- RUN = false;
- output = true;
- break;
- case 5: //Сортировка по цене
- for (UINT i = 0; i < Size - 1; i++)
- for (UINT j = 0; j < Size - i - 1; j++)
- if (Array[index[j]]->price > Array[index[j + 1]]->price)
- {
- temp = index[j];
- index[j] = index[j + 1];
- index[j + 1] = temp;
- }
- RUN = false;
- output = true;
- break;
- case 6:
- printf("[Вывод списка/Рекомендация]\n");
- for(UINT i = 0; i < Size; i++)
- if(Array[i]->pages <= 100)
- printf("[%d] %s %s %d %d\n", index[i], Array[index[i]]->author,
- Array[index[i]]->name, Array[index[i]]->pages, Array[index[i]]->price);
- RUN = false;
- break;
- case 7:
- RUN = false;
- break;
- default:
- break;
- }
- if(output)
- {
- system("cls");
- printf("[Вывод списка/По индексу]\n");
- for (UINT i = 0; i < Size; i++)
- printf("[%d] %s %s %d %d\n", index[i], Array[index[i]]->author,
- Array[index[i]]->name, Array[index[i]]->pages, Array[index[i]]->price);
- }
- delete[] index;
- delete[] Array;
- }
- printf("Для продолжения нажмите любую клавишу...\n");
- _getch();
- }
- char* myStrCpy(char* str, int &start, char symbol_stop) //Строка которую читаем, позиция с которой необходимо считать, символ на котором чтение будет закончено
- {
- char* buffer = NULL;
- int bufferSize = 0;
- while(str[start + bufferSize] != symbol_stop)
- {
- bufferSize++;
- }
- buffer = new char[bufferSize + 1];
- for(int currentCursor = 0; currentCursor < bufferSize; currentCursor++)
- buffer[currentCursor] = str[start + currentCursor];
- buffer[bufferSize] = '\0';
- start += bufferSize + 1;
- return buffer;
- }
- Book* ReadFile(const char* fileName) //Функция считывает структуры из файла в бинарном виде
- {
- FILE* f = fopen(fileName, "rb");
- Book* List = NULL;
- if(f == NULL)
- printf("Ошибка открытия файла!\n");
- else
- {
- fseek(f, 0, SEEK_END);
- long lSize = ftell(f);
- char* buffer = new char[lSize + 1];
- int ListSize = 0;
- rewind(f);
- if(fread(buffer, 1, lSize, f))
- {
- buffer[lSize] = '\0';
- for(int i = 0; i < lSize; i++)
- if(buffer[i] == '\n')
- ListSize++;
- int start = 0;
- for(int i = 0; i < ListSize; i++)
- {
- Book* newBook = new Book;
- char* temp = myStrCpy(buffer, start, ',');
- newBook->author = new char[strlen(temp)];
- strcpy(newBook->author, temp);
- delete[] temp;
- temp = myStrCpy(buffer, start, ',');
- newBook->name = new char[strlen(temp)];
- strcpy(newBook->name, temp);
- delete[] temp;
- temp = myStrCpy(buffer, start, ',');
- newBook->pages = atoi(temp);
- delete[] temp;
- temp = myStrCpy(buffer, start, '\n');
- newBook->price = atoi(temp);
- delete[] temp;
- if(List != NULL)
- {
- List->next = newBook;
- newBook->prev = List;
- newBook->next = NULL;
- List = List->next;
- }
- else
- {
- List = newBook;
- List->next = NULL;
- List->prev = NULL;
- }
- }
- }
- }
- if(f != NULL)
- fclose(f);
- List = GetFirstElementList(List);
- printf("Из файла было считано %d книг и сохранены в список.\n", GetListSize(List));
- printf("Для продолжения нажмите любую клавишу...\n");
- _getch();
- return List;
- }
- void WriteFile(const char* fileName, Book* List) //Функция записывает структуры в файл в бинарном виде
- {
- if(List == NULL)
- printf("Список пуст, нечего записывать в файл!\n");
- else
- {
- FILE* f = fopen(fileName, "wb");
- if(f == NULL)
- {
- printf("Ошибка открытия файла!\n");
- }
- else
- {
- rewind(f);
- Book* copyList = List;
- for(int i = 0; i < GetListSize(List); i++)
- {
- char string[10] = "";
- fwrite(copyList->author, sizeof(char) * strlen(copyList->author), sizeof(char), f);
- printf("|%s|", copyList->author);
- fwrite(",", 1, 1, f);
- fwrite(copyList->name, sizeof(char) * strlen(copyList->name), sizeof(char), f);
- fwrite(",", 1, 1, f);
- itoa(copyList->pages, string, 10);
- fwrite(string, sizeof(char) * strlen(string), sizeof(char), f);
- fwrite(",", 1, 1, f);
- itoa(copyList->price, string, 10);
- fwrite(string, sizeof(char) * strlen(string), sizeof(char), f);
- fwrite("\n", 1, 1, f);
- copyList = copyList->next;
- }
- }
- if(f != NULL)
- fclose(f);
- }
- system("cls");
- printf("[Сохранить список книг]\nБыло сохранено %d книг в файл.\n", GetListSize(List));
- printf("Для продолжения нажмите любую клавишу...\n");
- _getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement