Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdlib.h>
- #include <string>
- #include <iomanip>
- #include <conio.h>
- #include <fstream>
- #include <locale.h>
- #include <windows.h>
- #include <io.h>
- #include <fcntl.h>
- using namespace std;
- //----КОНСТАНТЫ----------
- const int up = 72,
- down = 80,
- right_btn = 77,
- left_btn = 75,
- enter = 13,
- esc = 27,
- del = 83,
- d_n = 20;
- const string items[10] =
- {
- "Создать список или добавить новый эл-т ",
- " Удаление всех элементов списка ",
- " Просмотр списка ",
- " Запись данных в файл ",
- " Чтение из файла ",
- " Изменить ",
- " Поиск ",
- " Сортировка по дате ",
- " Старые книги ",
- " Выход "
- };
- const string items2[10] =
- {
- "Поиск по автору книги ",
- "Поиск по названию книги",
- "Поиск по жанру книги",
- "Выход"
- };
- //=======ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ===============
- string filename;
- int num_pages = 5, // Кол-во элементов на одной странице
- width = 0, // Ширина окна
- height = 0; // Высота окна
- //-------------------------------------------
- struct info
- {
- string autor;
- string name;
- string izdatelstvo;
- string janr;
- int d = 0, m = 0, g = 0, cost = 0;
- };
- struct book
- {
- info inf;
- book* next = 0;
- book* pred = 0;
- };
- //-------------------------------------------
- book vvod_book();
- book* dob(book* end, const book& s);
- book* dob_first(const book& s);
- book* udal(book* beg);
- void cls();
- void gotoxy(int xpos, int ypos);
- void print(const book& s);
- void prosmotr(book* beg);
- void old_book(book beg);
- void sort_cost(book** beg);
- void sort_data(book* beg);
- void searchname(book* beg);
- void searchautor(book* beg);
- void searchjanr(book* beg);
- wchar_t* UnicodeString(string input);
- int change(book* beg, string& user_autor, string& new_user_autor);
- int read_file(char* filename, book** beg, book** end);
- int write_file(char* filename, book* temp);
- int write_file_binary(string filename, book* beg);
- int read_bin_file(string filename, book** beg, book** end);
- int menu(int& active, const string items[], int num_el);
- void SetColor(int text, int bg);
- //===========основная программа===================================================
- int main()
- {
- // меняем размер шрифта
- CONSOLE_FONT_INFOEX cfi;
- cfi.cbSize = sizeof(cfi);
- cfi.nFont = 0;
- cfi.dwFontSize.X = 0; // Width of each character in the font
- cfi.dwFontSize.Y = 24; // Height
- cfi.FontFamily = FF_DONTCARE;
- cfi.FontWeight = FW_NORMAL;
- SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
- //----------------------------------
- HANDLE hCon;
- // вытаскиваем ширину и высоту
- hCon = GetStdHandle(-12);
- CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
- if (GetConsoleScreenBufferInfo(hCon, &consoleInfo))
- {
- width = consoleInfo.srWindow.Right - consoleInfo.srWindow.Left + 1;
- height = consoleInfo.srWindow.Bottom - consoleInfo.srWindow.Top + 1;
- }
- //======================================================================
- system("cls");
- ShowWindow(GetConsoleWindow(), SW_MAXIMIZE); // полноэкранный режим
- setlocale(LC_ALL, "Rus");
- system("color 8F");
- book* beg = NULL,
- * end = NULL, input;
- string filename;
- int Num, current = 1;
- string user_autor, new_user_autor;
- while (1) {
- system("cls");
- switch (menu(current, items, 10))
- {
- case 1://создание списка или добовление нового эл-та в список
- system("cls");
- if (beg)
- end = dob(end, vvod_book());
- else
- {
- beg = dob_first(vvod_book());
- end = beg;
- }
- break;
- case 2://удаление всех элементов в списке
- system("cls");
- beg = udal(beg);
- cout << "Нажмите любую клавишу" << endl;
- cin.get();
- break;
- case 3://просмотр
- system("cls");
- prosmotr(beg);
- break;
- case 4://запись в файл
- system("cls");
- write_file_binary(filename, beg);
- //write_file(filename, beg);
- break;
- case 5://чтение из файла
- system("cls");
- //read_file(filename, &beg, &end);
- read_bin_file(filename, &beg, &end);
- break;
- case 6://редактирование списка
- system("cls");
- cout << "Введите автора, которого вы хотите изменить: " << endl;
- cin >> user_autor;
- cout << "Введите нового атвора: " << endl;
- cin >> new_user_autor;
- Num = change(beg, user_autor, new_user_autor);
- if (Num == 1) cout << "Автор успешно перезаписан." << endl;
- else cout << "Автор не найден!" << endl;
- system("pause");
- change(beg, user_autor, new_user_autor);
- cin.get();
- break;
- case 7://поиск
- {
- system("cls");
- int current = 1;
- switch (menu(current, items2, 4))
- {
- case 1://поск по автору
- system("cls");
- searchautor(beg);
- cin.get();
- break;
- case 2:
- system("cls");
- searchname(beg);//поиск по названию книги
- cin.get();
- break;
- case 3:
- searchjanr(beg);
- break;
- case 4:break;
- }
- break;
- }
- case 8:
- {
- system("cls");
- int current = 1;
- switch (menu(current, items2, 3))
- {
- case 1://поск по автору
- system("cls");
- sort_cost(&beg); break;
- cin.get();
- break;
- case 2:
- system("cls");
- searchname(beg);//поиск по названию книги
- cin.get();
- break;
- case 3:break;
- }
- break;
- }
- case 9:
- if (!beg)
- {
- MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
- break;
- }
- old_book(*beg);
- break;
- case 10: return 0;
- }
- }
- return 0;
- }
- //-----------------------------------------------------------------------------
- int change(book * beg, string & user_autor, string & new_user_autor)
- {
- book* temp = beg;
- while (temp != NULL)
- {
- if (temp->inf.autor == user_autor)
- {
- temp->inf.autor = new_user_autor;
- return 1;
- }
- else
- {
- temp = temp->next;
- }
- }
- return 0;
- }
- //------------------------------------------------------------------------------
- void searchjanr(book * beg)
- {
- book* temp = beg;
- char fname[d_n];
- int fl = 0;
- system("cls");
- if (!beg)
- {
- MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
- return;
- }
- cout << "Введите название жанра для поиска" << endl;
- cin >> fname;
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- cout << "| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- while (temp)
- {
- if (fname == temp->inf.janr)
- {
- print(*temp);
- fl = 1;
- }
- temp = temp->next;
- }
- if (fl != 1)
- {
- cout << "Книги с таким жанром не найдено" << endl;
- }
- system("pause");
- }
- //------------------------------------------------------------------------------
- void searchname(book * beg)
- {
- book* temp = beg;
- char fname[d_n];
- int fl = 0;
- system("cls");
- if (!beg)
- {
- MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
- return;
- }
- cout << "Введите название книги для поиска" << endl;
- cin >> fname;
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- cout << "| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- while (temp)
- {
- if (fname == temp->inf.name)
- {
- print(*temp);
- fl = 1;
- }
- temp = temp->next;
- }
- if (fl != 1)
- {
- cout << "Книги с таким названием не найдено" << endl;
- }
- system("pause");
- }
- //-----------------------------------------------------------------------------
- void searchautor(book * beg)
- {
- book* temp = beg;
- int fl = 0;
- char fa[d_n];
- system("cls");
- if (!beg)
- {
- MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
- return;
- }
- cout << "Введите автора для поиска" << endl;
- cin >> fa;
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- cout << "| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- while (temp)
- {
- if (fa == temp->inf.autor)
- {
- print(*temp);
- fl = 1;
- }
- temp = temp->next;
- }
- if (fl != 1) {
- cout << "Книги с таким автором не найдено" << endl;
- }
- system("pause");
- }
- //-----------------------------------------------------------------------------
- void old_book(book beg)
- {
- book* temp = &beg;
- sort_data(&beg);
- system("cls");
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- cout << "| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- for (int i = 0; i < 5; i++) {
- print(*temp);
- temp = temp->next;
- }
- system("pause");
- return;
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- cin.get();
- }
- //-----------------------------------------------------------------------------
- void prosmotr(book * beg)
- {
- if (!beg)
- {
- cout << "список пустой" << endl;
- cin.get();
- return;
- }
- book* temp = beg;
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- cout << "| Автор | Название | Издательство | Жанр | Дата поступления | Стоимость |" << endl;
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- while (temp)
- {
- print(*temp);
- temp = temp->next;
- }
- cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
- cin.get();
- }
- //-----------------------------------------------------------------------------
- book vvod_book()
- {
- book s;
- cout << "Введите автора:" << endl;
- while (1)
- {
- cin >> s.inf.autor;
- //if (atoi(s.autor)==0)
- // if((s.autor[0] <= '0') && (s.autor[0] >= '9' ) )
- break;
- cout << "Ошибка ввода!" << endl;
- }
- cout << "Введите название книги:" << endl;
- while (1)
- {
- cin >> s.inf.name;
- //if (atoi(s.name)==0)
- break;
- cout << "Ошибка ввода!" << endl;
- }
- cout << "Введите издательство:" << endl;
- while (1)
- {
- cin >> s.inf.izdatelstvo;
- //if (atoi(s.izdatelstvo) == 0)
- break;
- cout << "Ошибка ввода!" << endl;
- }
- cout << "Введите жанр:" << endl;
- while (1)
- {
- cin >> s.inf.janr;
- //if (atoi(s.janr) == 0)
- break;
- cout << "Ошибка ввода!" << endl;
- }
- cout << "Введите дату поступления:" << endl;
- cout << "Введите день:";
- while (1)
- {
- cin >> s.inf.d;
- if ((s.inf.d >= 1) && (s.inf.d <= 31))
- break;
- cout << "Ошибка ввода!Ведите правильную дату!" << endl;
- }
- cout << "Введите месяц:";
- while (1)
- {
- cin >> s.inf.m;
- if ((s.inf.m >= 1) && (s.inf.m <= 12))
- break;
- cout << "Ошибка ввода!Ведите правильную дату!" << endl;
- }
- cout << "Введите год:";
- while (1)
- {
- cin >> s.inf.g;
- if ((s.inf.g >= 1900) && (s.inf.g <= 2050))
- break;
- cout << "Ошибка ввода!Ведите правильную дату!" << endl;
- }
- cout << "Введите стоимость книги:" << endl;
- cin >> s.inf.cost;
- return s;
- }
- //-----------------------------------------------------------------------------
- void print(const book & s)
- {
- cout << "|" << s.inf.autor << setw(20 - (s.inf.autor).length()) << "|";
- cout << s.inf.name << setw(21 - (s.inf.name).length()) << "|";
- cout << s.inf.izdatelstvo << setw(19 - (s.inf.izdatelstvo).length()) << "|";
- cout << s.inf.janr << setw(17 - (s.inf.janr).length()) << "|";
- if (s.inf.d < 10) {
- cout << 0 << s.inf.d << ".";
- } else {
- cout << s.inf.d << ".";
- }
- if (s.inf.m < 10) {
- cout << 0 << s.inf.m << ".";
- }
- else {
- cout << s.inf.m << ".";
- }
- cout << s.inf.g << setw(9) << "|";
- int count = 0;
- int re_cost = s.inf.cost;
- while (re_cost = re_cost / 10 != 0)
- {
- count++;
- }
- count = 13 - count;
- cout << s.inf.cost << setw(count) << "|" << endl;
- }
- //--------------ф-я добавления или создания эл-та-------------------------------
- book* dob(book * end, const book & s)
- {
- book* newE = new book;
- *newE = s;
- newE->next = 0;
- newE->pred = end;
- end->next = newE;
- end = newE;
- return end;
- }
- //--------------создание первого эл-та------------------------------
- book* dob_first(const book & s)
- {
- book* beg = new book;
- *beg = s;
- beg->next = 0;
- beg->pred = 0;
- return beg;
- }
- //-----------------------------------------------------------------------------
- int read_file(char* filename, book * *beg, book * *end)
- {
- cout << "Введите название файла" << endl;
- cin >> filename;
- ifstream fin(filename, ios::in);
- if (!fin) {
- MessageBox(0, L"Невозможно открыть файл!", L"Ошибка", MB_ICONERROR | MB_SETFOREGROUND);
- return 0;
- }
- book s;
- *beg = 0;
- fin.seekg(0, ios::beg);
- while (fin >> s.inf.autor)
- {
- fin >> s.inf.name;
- fin >> s.inf.izdatelstvo;
- fin >> s.inf.janr;
- fin >> s.inf.d;
- fin >> s.inf.m;
- fin >> s.inf.g;
- fin >> s.inf.cost;
- if (*beg)
- * end = dob(*end, s);
- else
- {
- *beg = dob_first(s); *end = *beg;
- }
- }
- cout << "Считывание прошло успешно" << endl;
- cin.get();
- cin.get();
- return 0;
- }
- //-----------------------------------------------------------------------------
- int write_file(char* filename, book * temp)
- {
- cout << "Введите название файла" << endl;
- cin >> filename;
- ofstream fout(filename, ios_base::app); // открытие файла
- if (!fout)
- {
- cout << "Не могу открыть файл для записи" << endl;
- return 1;
- }
- while (temp)// пока temp!=0 выводим эл-ты в файл
- {
- fout << temp->inf.autor << endl;
- fout << temp->inf.name << endl;
- fout << temp->inf.izdatelstvo << endl;
- fout << temp->inf.janr << endl;
- fout << temp->inf.d << endl;
- fout << temp->inf.m << endl;
- fout << temp->inf.g << endl;
- fout << temp->inf.cost << endl;
- temp = temp->next;
- }
- cout << "Данные сохранены в файле: " << filename << endl;
- cout << "==============================" << endl;
- cout << "Нажмите любую клавишу" << endl;
- cin.get();
- return 0;
- }
- //-----------------------------------------------------------------------------
- int write_file_binary(string filename, book * beg)
- {
- cout << "Введите название файла" << endl;
- cin >> filename;
- book* temp = beg;
- ofstream fout(filename + ".dat", ios::binary); // открытие файла
- if (!fout)
- {
- cout << "Не могу открыть файл для записи" << endl;
- return 1;
- }
- while (temp) {
- fout.write((char*)&temp->inf, sizeof temp->inf);
- temp = temp->next;
- }
- fout.close();
- cout << "Данные сохранены в файле: " << filename << endl;
- cout << "==============================" << endl;
- cout << "Нажмите любую клавишу" << endl;
- cin.get();
- return 0;
- }
- // ==========ЧТЕНИЕ ИЗ БИНАРНОГО ФАЙЛА==========
- int read_bin_file(string filename, book ** beg, book ** end)
- {
- cout << "Введите название файла" << endl;
- cin >> filename;
- ifstream fin(filename + ".dat", ios::binary);
- if (!fin) {
- MessageBox(0, L"Нет файла!", L"Ошибка", MB_ICONERROR | MB_SETFOREGROUND);
- return 1;
- }
- fin.seekg(ios_base::beg);
- book* t = new book;
- t->next = NULL;
- t->pred = NULL;
- *beg = 0;
- while (fin.read((char*)& t->inf, sizeof t->inf))
- {
- if (*beg)
- *end = dob(*end, *t);
- else {
- *beg = dob_first(*t);
- *end = *beg;
- }
- }
- fin.close();
- return 0;
- }
- //-----------------------------------------------------------------------------
- book* udal(book * beg)
- {
- book* temp;
- if (!beg)
- {
- cout << "список пустой" << endl;
- cin.get();
- return 0;
- }
- while (beg)
- {
- temp = beg;
- beg = beg->next;
- delete temp;
- }
- cout << "==============================" << endl;
- cout << "====удаление прошло успешно===" << endl;
- cout << "==============================" << endl;
- return beg;
- }
- //----------------------------------------------------------------
- void sort_data(book * beg)
- {
- book* temp_i = beg, * temp_j = beg;
- for (; temp_i; temp_i = temp_i->next)
- {
- for (temp_j = temp_i; temp_j; temp_j = temp_j->next)
- {
- if (temp_i->inf.g != temp_j->inf.g)
- {
- if (temp_i->inf.g > temp_j->inf.g)
- {
- swap(temp_i->inf, temp_j->inf);
- continue;
- }
- }
- else if (temp_i->inf.m != temp_j->inf.m)
- {
- if (temp_i->inf.m > temp_j->inf.m)
- {
- swap(temp_i->inf, temp_j->inf);
- continue;
- }
- }
- else if (temp_i->inf.d > temp_j->inf.d)
- {
- swap(temp_i->inf, temp_j->inf);
- continue;
- }
- }
- }
- cout << "Сортировка прошла успешно" << endl;
- system("pause");
- }
- //----------------------------------------
- void sort_cost(book * *beg) {
- book* temp_i = *beg,
- * temp_j = *beg;
- for (; temp_i; temp_i = temp_i->next) {
- for (temp_j = temp_i; temp_j; temp_j = temp_j->next) {
- if (temp_i->inf.cost > temp_j->inf.cost) {
- swap(temp_i->inf, temp_j->inf);
- }
- }
- }
- cout << "Сортировка прошла успешно" << endl;
- system("pause");
- }
- // ==========ШАБЛОН ПЕЧАТИ МЕНЮ==========
- void print_menu(int sym, const string items[], const int N_ITEMS)
- {
- for (int i = 1; i <= N_ITEMS; i++)
- {
- SetColor(15, 8);
- gotoxy((width / 2) - 10, (height / 2) + i - 3); // ставим меню в центр
- if (i == sym)
- {
- SetColor(16, 3);
- }
- cout << items[i - 1] << endl;
- SetColor(15, 8);
- }
- }
- // ==========МЕНЮ==========
- int menu(int& active, const string items[], int num_el)
- {
- wint_t buf;
- while (1)
- {
- cls();
- print_menu(active, items, num_el);
- buf = _getwch();
- switch (buf)
- {
- case up: // клавиша вверх
- if (active > 1) active--;
- break;
- case down: // клавиша вниз
- if (active < num_el) active++;
- break;
- case enter: // клавиша enter
- return active;
- case esc: // клавиша escape
- return -1;
- }
- }
- }
- // ==========УСТАНОВКА ЦВЕТА ТЕКСТА И ФОНА==========
- void SetColor(int text, int bg)
- {
- HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(hStdOut, (WORD)((bg << 4) | text));
- }
- // ==========ПЕРЕМЕЩЕНИЕ КУРСОРА НА ВЫБРАННУЮ ПОЗИЦИЮ==========
- void gotoxy(int xpos, int ypos)
- {
- COORD scrn;
- HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
- scrn.X = xpos; scrn.Y = ypos;
- SetConsoleCursorPosition(hOuput, scrn);
- }
- //=====================================
- wchar_t* UnicodeString(string input) {
- const char* orig = input.c_str();
- size_t origsize = strlen(orig) + 1;
- const size_t newsize = 100;
- size_t convertedChars = 0;
- wchar_t* wcstring = new wchar_t[newsize];
- mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);
- return wcstring;
- }
- // ==========ОЧИСТКА ЭКРАНА БЕЗ МЕРЦАНИЯ==========
- void cls() {
- HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
- COORD cd;
- cd.X = 0;
- cd.Y = 0;
- SetConsoleCursorPosition(hd, cd);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement