MARSHAL327

Untitled

Dec 15th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 29.08 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include <iomanip>
  5. #include <conio.h>
  6. #include <fstream>
  7. #include <locale.h>
  8. #include <windows.h>
  9. #include <io.h>
  10. #include <fcntl.h>
  11. using namespace std;
  12. //----КОНСТАНТЫ----------
  13. const int up = 72,
  14. down = 80,
  15. right_btn = 77,
  16. left_btn = 75,
  17. enter = 13,
  18. esc = 27,
  19. del = 83,
  20. d_n = 20;
  21. const string items[10] =
  22. {
  23.     "Создать список или добавить новый эл-т ",
  24.     "    Удаление всех элементов списка     ",
  25.     "            Просмотр списка            ",
  26.     "         Запись данных в файл          ",
  27.     "           Чтение из файла             ",
  28.     "               Изменить                ",
  29.     "                Поиск                  ",
  30.     "               Удалить                 ",
  31.     "            Старые книги               ",
  32.     "                Выход                  "
  33. };
  34. const string items2[4] =
  35. {
  36.     "Поиск по автору книги ",
  37.     "Поиск по названию книги",
  38.     "Поиск по жанру книги",
  39.     "Выход(esc)"
  40. };
  41. const string items3[3] =
  42. {
  43.     "Запись в текстовый файл",
  44.     "Запись в бинарный файл"
  45.     "Выход(esc)"
  46. };
  47. const string items4[3] =
  48. {
  49.     "Чтение из текстового файла",
  50.     "Чтение из бинарного файла",
  51.     "Выход(esc)"
  52. };
  53. //=======ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ===============
  54. string filename;
  55. int num_pages = 5, // Кол-во элементов на одной странице
  56. width = 0, // Ширина окна
  57. height = 0; // Высота окна
  58. int kol_el = 1;// Кол-во элементов
  59. //-------------------------------------------
  60. struct info
  61. {
  62.     string autor;
  63.     string name;
  64.     string izdatelstvo;
  65.     string janr;
  66.     string cost;
  67.     int d = 0, m = 0, g = 0;
  68. };
  69. struct book
  70. {
  71.     info inf;
  72.     book* next = 0;
  73.     book* pred = 0;
  74. };
  75. //-------------------------------------------
  76. book vvod_book();
  77. book* dob(book* end, const book& s);
  78. book* dob_first(const book& s);
  79. book* udal(book* beg);
  80. book* list(book* beg, int active, int page, int k);
  81. book* delete_el(book* beg);
  82. void cls();
  83. void gotoxy(int xpos, int ypos);
  84. void print(const book& s);
  85. void prosmotr(book* beg);
  86. void old_book(book beg);
  87. void sort_cost(book** beg);
  88. void sort_data(book* beg);
  89. void searchname(book* beg);
  90. void searchautor(book* beg);
  91. void searchjanr(book* beg);
  92. wchar_t* UnicodeString(string input);
  93. int change(book* beg, string& user_autor, string& new_user_autor);
  94. int read_file(string filename, book** beg, book** end);
  95. int write_file(string filename, book* temp);
  96. int write_file_binary(string filename, book* beg);
  97. int read_file_binary(string filename, book** beg, book** end);
  98. int menu(int& active, const string items[], int num_el);
  99. void SetColor(int text, int bg);
  100.  
  101. //===========основная программа===================================================
  102. int main()
  103. {
  104.     // меняем размер шрифта
  105.     CONSOLE_FONT_INFOEX cfi;
  106.     cfi.cbSize = sizeof(cfi);
  107.     cfi.nFont = 0;
  108.     cfi.dwFontSize.X = 0;                   // Width of each character in the font
  109.     cfi.dwFontSize.Y = 24;                  // Height
  110.     cfi.FontFamily = FF_DONTCARE;
  111.     cfi.FontWeight = FW_NORMAL;
  112.     SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
  113.     //----------------------------------
  114.     HANDLE hCon;
  115.     // вытаскиваем ширину и высоту
  116.     hCon = GetStdHandle(-12);
  117.     CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
  118.     if (GetConsoleScreenBufferInfo(hCon, &consoleInfo))
  119.     {
  120.         width = consoleInfo.srWindow.Right - consoleInfo.srWindow.Left + 1;
  121.         height = consoleInfo.srWindow.Bottom - consoleInfo.srWindow.Top + 1;
  122.     }
  123.     //======================================================================
  124.     system("cls");
  125.     ShowWindow(GetConsoleWindow(), SW_MAXIMIZE); // полноэкранный режим
  126.     setlocale(LC_ALL, "Rus");
  127.     system("color 8F");
  128.     book* beg = NULL,
  129.         * end = NULL, input;
  130.     string filename;
  131.     int Num, current = 1;
  132.     string user_autor, new_user_autor;
  133.     int num_e = 0;
  134.     int k = 0;
  135.     while (1) {
  136.         system("cls");
  137.         switch (menu(current, items, 10))
  138.         {
  139.         case 1://создание списка или добовление нового эл-та в список
  140.             system("cls");
  141.             if (beg)
  142.                 end = dob(end, vvod_book());
  143.             else
  144.             {
  145.                 beg = dob_first(vvod_book());
  146.                 end = beg;
  147.             }
  148.             kol_el++;
  149.             break;
  150.         case 2://удаление всех элементов в списке
  151.             system("cls");
  152.             delete_el(beg);
  153.             /*beg = udal(beg);
  154.             cout << "Нажмите любую клавишу" << endl;
  155.             cin.get();*/
  156.             break;
  157.         case 3://просмотр
  158.             system("cls");
  159.             //prosmotr(beg);
  160.             list(beg, 0, 0, 0);
  161.             break;
  162.         case 4://запись в файл
  163.         {
  164.             system("cls");
  165.             int current = 1;
  166.             cout << "Выберите формат файла в который хотите записать:";
  167.             switch (menu(current, items3, 3))
  168.             {
  169.             case 1://Запись в текстовый файл
  170.                 system("cls");
  171.                 write_file(filename, beg);
  172.                 break;
  173.             case 2://Запись в бинарный файл
  174.                 write_file_binary(filename, beg);
  175.                 cin.get();
  176.                 break;
  177.             case 27:break;
  178.             }
  179.         }
  180.         break;
  181.         case 5://чтение из файла
  182.         {
  183.             system("cls");
  184.             int current = 1;
  185.             cout << "Выберите формат файла в который хотите записать:";
  186.             switch (menu(current, items4, 3))
  187.             {
  188.             case 1://чтение из текстового файла
  189.                 system("cls");
  190.                 read_file(filename, &beg, &end);
  191.                 break;
  192.             case 2://чтение из бинарного файла
  193.                 read_file_binary(filename, &beg, &end);
  194.                 cin.get();
  195.                 break;
  196.             case 27:break;
  197.             }
  198.         }
  199.  
  200.         break;
  201.         case 6://редактирование списка
  202.             system("cls");
  203.             cout << "Введите автора, которого вы хотите изменить " << endl;
  204.             cin >> user_autor;
  205.             cout << "Введите нового атвора: " << endl;
  206.             cin >> new_user_autor;
  207.             Num = change(beg, user_autor, new_user_autor);
  208.             if (Num == 1) cout << "Автор успешно перезаписан." << endl;
  209.             else cout << "Автор не найден!" << endl;
  210.             system("pause");
  211.             change(beg, user_autor, new_user_autor);
  212.             cin.get();
  213.             break;
  214.         case 7://поиск
  215.         {
  216.             system("cls");
  217.             int current = 1;
  218.             switch (menu(current, items2, 4))
  219.             {
  220.             case 1://поск по автору
  221.                 system("cls");
  222.                 searchautor(beg);
  223.                 cin.get();
  224.                 break;
  225.             case 2:
  226.                 system("cls");
  227.                 searchname(beg);//поиск по названию книги
  228.                 cin.get();
  229.                 break;
  230.             case 3:
  231.                 searchjanr(beg);
  232.                 break;
  233.             case 27:break;
  234.             }
  235.             break;
  236.         }
  237.         case 8:
  238.             system("cls");
  239.             delete_el(beg);
  240.             break;
  241.         case 9://старые книги
  242.             if (!beg)
  243.             {
  244.                 MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  245.                 break;
  246.             }
  247.             old_book(*beg);
  248.             break;
  249.         case 10: return 0;
  250.         }
  251.     }
  252.     return 0;
  253. }
  254.  
  255. //-----------------------------------------------------------------------------
  256. int change(book * beg, string & user_autor, string & new_user_autor)
  257. {
  258.     book* temp = beg;
  259.     while (temp != NULL)
  260.     {
  261.         if (temp->inf.autor == user_autor)
  262.         {
  263.             temp->inf.autor = new_user_autor;
  264.             return 1;
  265.         }
  266.         else
  267.         {
  268.             temp = temp->next;
  269.  
  270.         }
  271.     }
  272.     return 0;
  273. }
  274. //------------------------------------------------------------------------------
  275. void searchjanr(book * beg)
  276. {
  277.     book* temp = beg;
  278.     char fname[d_n];
  279.     int fl = 0;
  280.  
  281.     system("cls");
  282.  
  283.     if (!beg)
  284.     {
  285.         MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  286.         return;
  287.     }
  288.  
  289.     cout << "Введите название жанра для поиска" << endl;
  290.     cin >> fname;
  291.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  292.     cout << "|       Автор       |      Название      |   Издательство   |      Жанр      | Дата поступления |   Стоимость   |" << endl;
  293.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  294.     while (temp)
  295.     {
  296.         if (fname == temp->inf.janr)
  297.         {
  298.             print(*temp);
  299.             fl = 1;
  300.         }
  301.         temp = temp->next;
  302.     }
  303.     if (fl != 1)
  304.     {
  305.         cout << "Книги с таким жанром не найдено" << endl;
  306.     }
  307.     system("pause");
  308. }
  309. //------------------------------------------------------------------------------
  310. void searchname(book * beg)
  311. {
  312.     book* temp = beg;
  313.     char fname[d_n];
  314.     int fl = 0;
  315.  
  316.     system("cls");
  317.  
  318.     if (!beg)
  319.     {
  320.         MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  321.         return;
  322.     }
  323.  
  324.     cout << "Введите название книги для поиска" << endl;
  325.     cin >> fname;
  326.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  327.     cout << "|       Автор       |      Название      |   Издательство   |      Жанр      | Дата поступления |   Стоимость   |" << endl;
  328.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  329.     while (temp)
  330.     {
  331.         if (fname == temp->inf.name)
  332.         {
  333.             print(*temp);
  334.             fl = 1;
  335.         }
  336.         temp = temp->next;
  337.     }
  338.     if (fl != 1)
  339.     {
  340.         cout << "Книги с таким названием не найдено" << endl;
  341.     }
  342.     system("pause");
  343. }
  344. //-----------------------------------------------------------------------------
  345. void searchautor(book * beg)
  346. {
  347.     book* temp = beg;
  348.     int fl = 0;
  349.     char fa[d_n];
  350.     system("cls");
  351.     if (!beg)
  352.     {
  353.         MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  354.         return;
  355.     }
  356.     cout << "Введите автора для поиска" << endl;
  357.     cin >> fa;
  358.  
  359.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  360.     cout << "|       Автор       |      Название      |   Издательство   |      Жанр      | Дата поступления |   Стоимость   |" << endl;
  361.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  362.     while (temp)
  363.     {
  364.         if (fa == temp->inf.autor)
  365.         {
  366.             print(*temp);
  367.             fl = 1;
  368.         }
  369.         temp = temp->next;
  370.     }
  371.     if (fl != 1) {
  372.         cout << "Книги с таким автором не найдено" << endl;
  373.     }
  374.     system("pause");
  375. }
  376. //-----------------------------------------------------------------------------
  377. void old_book(book beg)
  378. {
  379.     book* temp = &beg;
  380.     sort_data(&beg);
  381.     system("cls");
  382.  
  383.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  384.     cout << "|       Автор       |      Название      |   Издательство   |      Жанр      | Дата поступления |   Стоимость   |" << endl;
  385.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  386.     for (int i = 0; i < 5; i++) {
  387.         print(*temp);
  388.         temp = temp->next;
  389.     }
  390.  
  391.     system("pause");
  392.     return;
  393.  
  394.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  395.     cin.get();
  396. }
  397. //-----------------------------------------------------------------------------
  398. void prosmotr(book * beg)
  399. {
  400.     int k = 1;
  401.     if (!beg)
  402.     {
  403.         cout << "список пустой" << endl;
  404.         cin.get();
  405.         return;
  406.     }
  407.     book* temp = beg;
  408.     cout << "+—|—————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  409.     cout << "|№|      Автор      |      Название      |   Издательство   |      Жанр      | Дата поступления |   Стоимость   |" << endl;
  410.     cout << "+—|—————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  411.     while (temp)
  412.     {
  413.         cout << "|" << k++ << "|";
  414.         print(*temp);
  415.         temp = temp->next;
  416.  
  417.     }
  418.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  419.     cin.get();
  420. }
  421. //-----------------------------------------------------------------------------
  422. book vvod_book()
  423. {
  424.     book s;
  425.     cout << "Введите автора:" << endl;
  426.     while (1)
  427.     {
  428.         cin >> s.inf.autor;
  429.         //if (atoi(s.autor)==0)
  430.         if ((s.inf.autor[0] >= '0') && (s.inf.autor[0] <= '9'))
  431.             break;
  432.         cout << "Ошибка ввода!" << endl;
  433.     }
  434.     cout << "Введите название книги:" << endl;
  435.     while (1)
  436.     {
  437.         cin >> s.inf.name;
  438.         //if (atoi(s.name)==0)
  439.         break;
  440.         cout << "Ошибка ввода!" << endl;
  441.     }
  442.     cout << "Введите издательство:" << endl;
  443.     while (1)
  444.     {
  445.         cin >> s.inf.izdatelstvo;
  446.         //if (atoi(s.izdatelstvo) == 0)
  447.         break;
  448.         cout << "Ошибка ввода!" << endl;
  449.     }
  450.     cout << "Введите жанр:" << endl;
  451.     while (1)
  452.     {
  453.         cin >> s.inf.janr;
  454.         //if (atoi(s.janr) == 0)
  455.         break;
  456.         cout << "Ошибка ввода!" << endl;
  457.     }
  458.     cout << "Введите дату поступления:" << endl;
  459.     cout << "Введите день:";
  460.     while (1)
  461.     {
  462.         cin >> s.inf.d;
  463.         if ((s.inf.d >= 1) && (s.inf.d <= 31))
  464.             break;
  465.         cout << "Ошибка ввода!Ведите правильную дату!" << endl;
  466.     }
  467.     cout << "Введите месяц:";
  468.     while (1)
  469.     {
  470.         cin >> s.inf.m;
  471.         if ((s.inf.m >= 1) && (s.inf.m <= 12))
  472.             break;
  473.         cout << "Ошибка ввода!Ведите правильную дату!" << endl;
  474.     }
  475.     cout << "Введите год:";
  476.     while (1)
  477.     {
  478.         cin >> s.inf.g;
  479.         if ((s.inf.g >= 1900) && (s.inf.g <= 2050))
  480.             break;
  481.         cout << "Ошибка ввода!Ведите правильную дату!" << endl;
  482.     }
  483.     cout << "Введите стоимость книги:" << endl;
  484.     cin >> s.inf.cost;
  485.  
  486.     kol_el++;
  487.     return s;
  488. }
  489. //-----------------------------------------------------------------------------
  490. void print(const book & s)
  491. {
  492.     cout << s.inf.autor << setw(18 - (s.inf.autor).length()) << "|";
  493.     cout << s.inf.name << setw(21 - (s.inf.name).length()) << "|";
  494.     cout << s.inf.izdatelstvo << setw(19 - (s.inf.izdatelstvo).length()) << "|";
  495.     cout << s.inf.janr << setw(17 - (s.inf.janr).length()) << "|";
  496.     if (s.inf.d < 10) {
  497.         cout << 0 << s.inf.d << ".";
  498.     }
  499.     else {
  500.         cout << s.inf.d << ".";
  501.     }
  502.     if (s.inf.m < 10) {
  503.         cout << 0 << s.inf.m << ".";
  504.     }
  505.     else {
  506.         cout << s.inf.m << ".";
  507.     }
  508.     cout << s.inf.g << setw(9) << "|";
  509.     cout << s.inf.cost << setw(16 - (s.inf.cost).length()) << "|" << endl;
  510.  
  511. }
  512. //--------------ф-я добавления или создания эл-та-------------------------------
  513. book * dob(book * end, const book & s)
  514. {
  515.     book* newE = new book;
  516.     *newE = s;
  517.     newE->next = 0;
  518.     newE->pred = end;
  519.     end->next = newE;
  520.     end = newE;
  521.     return end;
  522. }
  523. //--------------создание первого эл-та------------------------------
  524. book* dob_first(const book & s)
  525. {
  526.     book* beg = new book;
  527.     *beg = s;
  528.     beg->next = 0;
  529.     beg->pred = 0;
  530.     return beg;
  531. }
  532. //-----------------------------------------------------------------------------
  533. int read_file(string filename, book * *beg, book * *end)
  534. {
  535.     cout << "Введите название файла" << endl;
  536.     cin >> filename;
  537.     ifstream fin(filename, ios::in);
  538.     if (!fin) {
  539.  
  540.         MessageBox(0, L"Невозможно открыть файл!", L"Ошибка", MB_ICONERROR | MB_SETFOREGROUND);
  541.         return 0;
  542.  
  543.     }
  544.     book s;
  545.     *beg = 0;
  546.     fin.seekg(0, ios::beg);
  547.     while (fin >> s.inf.autor)
  548.     {
  549.         fin >> s.inf.name;
  550.         fin >> s.inf.izdatelstvo;
  551.         fin >> s.inf.janr;
  552.         fin >> s.inf.d;
  553.         fin >> s.inf.m;
  554.         fin >> s.inf.g;
  555.         fin >> s.inf.cost;
  556.  
  557.  
  558.         if (*beg) {
  559.             *end = dob(*end, s);
  560.         }
  561.         else {
  562.             *beg = dob_first(s); *end = *beg;
  563.         }
  564.  
  565.         kol_el++;
  566.     }
  567.     cout << "Считывание прошло успешно" << endl;
  568.     cin.get();
  569.     cin.get();
  570.     return 0;
  571. }
  572. //-----------------------------------------------------------------------------
  573. int write_file(string filename, book * temp)
  574. {
  575.     cout << "Введите название файла" << endl;
  576.     cin >> filename;
  577.     ofstream fout(filename, ios_base::app); // открытие файла
  578.     if (!fout)
  579.     {
  580.         cout << "Не могу открыть файл для записи" << endl;
  581.         return 1;
  582.     }
  583.     while (temp)// пока temp!=0 выводим эл-ты в файл
  584.     {
  585.         fout << temp->inf.autor << endl;
  586.         fout << temp->inf.name << endl;
  587.         fout << temp->inf.izdatelstvo << endl;
  588.         fout << temp->inf.janr << endl;
  589.         fout << temp->inf.d << endl;
  590.         fout << temp->inf.m << endl;
  591.         fout << temp->inf.g << endl;
  592.         fout << temp->inf.cost << endl;
  593.         temp = temp->next;
  594.     }
  595.     cout << "Данные сохранены в файле: " << filename << endl;
  596.     cout << "==============================" << endl;
  597.     cout << "Нажмите любую клавишу" << endl;
  598.     cin.get();
  599.     return 0;
  600. }
  601. //-----------------------------------------------------------------------------
  602. int write_file_binary(string filename, book * beg)
  603. {
  604.     cout << "Введите название файла" << endl;
  605.     cin >> filename;
  606.     book* temp = beg;
  607.     ofstream fout(filename + ".dat", ios::binary); // открытие файла
  608.     if (!fout)
  609.     {
  610.         cout << "Не могу открыть файл для записи" << endl;
  611.         return 1;
  612.     }
  613.     while (temp) {
  614.         fout.write((char*)& temp->inf, sizeof temp->inf);
  615.         temp = temp->next;
  616.     }
  617.     fout.close();
  618.     cout << "Данные сохранены в файле: " << filename << endl;
  619.     cout << "==============================" << endl;
  620.     cout << "Нажмите любую клавишу" << endl;
  621.     cin.get();
  622.     return 0;
  623. }
  624.  
  625. // ==========ЧТЕНИЕ ИЗ БИНАРНОГО ФАЙЛА==========
  626. int read_file_binary(string filename, book * *beg, book * *end)
  627. {
  628.     cout << "Введите название файла" << endl;
  629.     cin >> filename;
  630.     ifstream fin(filename + ".dat", ios::binary);
  631.  
  632.     if (!fin) {
  633.         MessageBox(0, L"Нет файла!", L"Ошибка", MB_ICONERROR | MB_SETFOREGROUND);
  634.         return 1;
  635.     }
  636.  
  637.     fin.seekg(ios_base::beg);
  638.     book* t = new book;
  639.     t->next = NULL;
  640.     t->pred = NULL;
  641.     *beg = 0;
  642.  
  643.     while (fin.read((char*)& t->inf, sizeof t->inf))
  644.     {
  645.         if (*beg)
  646.             * end = dob(*end, *t);
  647.         else {
  648.             *beg = dob_first(*t);
  649.             *end = *beg;
  650.         }
  651.     }
  652.     fin.close();
  653.     cout << "Чтене прошло успешно" << endl;
  654.     cout << "==============================" << endl;
  655.     cout << "Нажмите любую клавишу" << endl;
  656.     return 0;
  657. }
  658.  
  659. //-----------------------------------------------------------------------------
  660. book* udal(book * beg)
  661. {
  662.     book* temp;
  663.     if (!beg)
  664.     {
  665.         cout << "список пустой" << endl;
  666.         cin.get();
  667.         return 0;
  668.     }
  669.     while (beg)
  670.     {
  671.         temp = beg;
  672.         beg = beg->next;
  673.         delete temp;
  674.     }
  675.     cout << "==============================" << endl;
  676.     cout << "====удаление прошло успешно===" << endl;
  677.     cout << "==============================" << endl;
  678.     return beg;
  679. }
  680. //----------------------------------------------------------------
  681. void sort_data(book * beg)
  682. {
  683.     book* temp_i = beg, * temp_j = beg;
  684.     for (; temp_i; temp_i = temp_i->next)
  685.     {
  686.         for (temp_j = temp_i; temp_j; temp_j = temp_j->next)
  687.         {
  688.             if (temp_i->inf.g != temp_j->inf.g)
  689.             {
  690.                 if (temp_i->inf.g > temp_j->inf.g)
  691.                 {
  692.                     swap(temp_i->inf, temp_j->inf);
  693.                     continue;
  694.                 }
  695.             }
  696.             else if (temp_i->inf.m != temp_j->inf.m)
  697.             {
  698.                 if (temp_i->inf.m > temp_j->inf.m)
  699.                 {
  700.                     swap(temp_i->inf, temp_j->inf);
  701.                     continue;
  702.                 }
  703.             }
  704.             else if (temp_i->inf.d > temp_j->inf.d)
  705.             {
  706.                 swap(temp_i->inf, temp_j->inf);
  707.                 continue;
  708.             }
  709.         }
  710.     }
  711.     cout << "Сортировка прошла успешно" << endl;
  712.     system("pause");
  713. }
  714. //----------------------------------------
  715. void sort_cost(book * *beg) {
  716.     book* temp_i = *beg,
  717.         * temp_j = *beg;
  718.  
  719.     for (; temp_i; temp_i = temp_i->next) {
  720.         for (temp_j = temp_i; temp_j; temp_j = temp_j->next) {
  721.             if (stoi(temp_i->inf.cost) > stoi(temp_j->inf.cost)) {
  722.                 swap(temp_i->inf, temp_j->inf);
  723.             }
  724.         }
  725.     }
  726.  
  727.     cout << "Сортировка прошла успешно" << endl;
  728.     system("pause");
  729. }
  730. // ==========ШАБЛОН ПЕЧАТИ МЕНЮ==========
  731. void print_menu(int sym, const string items[], const int N_ITEMS)
  732. {
  733.     for (int i = 1; i <= N_ITEMS; i++)
  734.     {
  735.         SetColor(15, 8);
  736.         gotoxy((width / 2) - 10, (height / 2) + i - 3); // ставим меню в центр
  737.         if (i == sym)
  738.         {
  739.             SetColor(16, 3);
  740.         }
  741.         cout << items[i - 1] << endl;
  742.         SetColor(15, 8);
  743.     }
  744. }
  745. // ==========МЕНЮ==========
  746. int menu(int& active, const string items[], int num_el)
  747. {
  748.     wint_t buf;
  749.     while (1)
  750.     {
  751.         cls();
  752.         print_menu(active, items, num_el);
  753.  
  754.         buf = _getwch();
  755.         switch (buf)
  756.         {
  757.         case up: // клавиша вверх
  758.             if (active > 1) active--;
  759.             break;
  760.         case down: // клавиша вниз
  761.             if (active < num_el) active++;
  762.             break;
  763.         case enter: // клавиша enter
  764.             return active;
  765.         case esc: // клавиша escape
  766.             return -1;
  767.         }
  768.     }
  769. }
  770. // ==========УСТАНОВКА ЦВЕТА ТЕКСТА И ФОНА==========
  771. void SetColor(int text, int bg)
  772. {
  773.     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  774.     SetConsoleTextAttribute(hStdOut, (WORD)((bg << 4) | text));
  775. }
  776. // ==========ПЕРЕМЕЩЕНИЕ КУРСОРА НА ВЫБРАННУЮ ПОЗИЦИЮ==========
  777.  
  778. void gotoxy(int xpos, int ypos)
  779. {
  780.     COORD scrn;
  781.     HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
  782.     scrn.X = xpos; scrn.Y = ypos;
  783.     SetConsoleCursorPosition(hOuput, scrn);
  784. }
  785. //=====================================
  786. wchar_t* UnicodeString(string input) {
  787.     const char* orig = input.c_str();
  788.     size_t origsize = strlen(orig) + 1;
  789.     const size_t newsize = 100;
  790.     size_t convertedChars = 0;
  791.     wchar_t* wcstring = new wchar_t[newsize];
  792.     mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);
  793.     return wcstring;
  794. }
  795. // ==========ОЧИСТКА ЭКРАНА БЕЗ МЕРЦАНИЯ==========
  796. void cls() {
  797.     HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
  798.     COORD cd;
  799.     cd.X = 0;
  800.     cd.Y = 0;
  801.     SetConsoleCursorPosition(hd, cd);
  802. }
  803. // ==========УДАЛЕНИЕ==========
  804. book* delete_el(book * beg)
  805. {
  806.     book* temp;
  807.     book* buf;
  808.     int num_del = 0,
  809.         count = 0;
  810.  
  811.     if (!beg) {
  812.         MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  813.         return 0;
  814.     }
  815.  
  816.     temp = beg;
  817.  
  818.     cout << "Введите номер элемента,который хотите удалить" << endl;
  819.     cin >> num_del;
  820.  
  821.     // если один элемент в списке
  822.     if (beg->next == 0) {
  823.         delete temp;
  824.         return 0;
  825.     }
  826.  
  827.     while (temp) {
  828.         if (num_del == ++count) { // если введённый номер совпал с шифром задания
  829.             buf = temp->next;
  830.  
  831.             // если удаляется второй элемент
  832.             if (temp->pred == 0) {
  833.                 buf->pred = 0;
  834.                 delete temp;
  835.                 return buf;
  836.             }
  837.  
  838.             if (buf != 0) buf->pred = temp->pred; // если следующий элемент не 0
  839.  
  840.             buf = temp->pred;
  841.             buf->next = temp->next;
  842.             delete temp;
  843.             return beg;
  844.         }
  845.         temp = temp->next;
  846.     }
  847.     MessageBox(0, L"Произошла ошибка!", L"Ошибка", MB_ICONERROR | MB_SETFOREGROUND);
  848.     return beg;
  849.  
  850. }
  851.  
  852. book* list(book * beg, int active, int page, int k)
  853. {
  854.     book* temp = beg,
  855.         * buf_temp = beg,
  856.         * buf_el = beg,
  857.         * first_temp = beg;
  858.  
  859.     int c = 0,
  860.         key = 0,
  861.         extreme_page = 2,// переменная для первой страницы, если это первая страница, тогда 1, в остальных случаях = 2
  862.         first_k = 0,
  863.         k_this_page = 0;
  864.  
  865.     int num_del = 0; // номер для удаления
  866.     k = 0;
  867.     page = 1;
  868.     active = 1;
  869.  
  870.     while (1)
  871.     {
  872.         if (!beg)
  873.         {
  874.             MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  875.             return beg;
  876.         }
  877.  
  878.         if (k != kol_el + 1 && extreme_page != 1)
  879.         {
  880.             k_this_page = 0;
  881.             cout << "+—|—————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  882.             cout << "|№|      Автор      |      Название      |   Издательство   |      Жанр      | Дата поступления |   Стоимость   |" << endl;
  883.             cout << "+—|—————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  884.  
  885.             do {
  886.                 k_this_page++;
  887.                 // вытаскиваем первый элемент текущей страницы
  888.                 if (k % 5 == 0) {
  889.                     first_k = k;
  890.                     first_temp = temp;
  891.                 }
  892.                 // находим первый элемент с предыдущей страницы
  893.                 if (k % 5 == 0 && page != 1) {
  894.                     buf_el = temp;
  895.  
  896.                     for (int j = 0; j < 5; j++, temp = temp->pred) {
  897.                         buf_temp = temp->pred;
  898.                     }
  899.                     temp = buf_el;
  900.                 }
  901.  
  902.                 cout << "|" << ++k << "|";
  903.                 print(*temp);
  904.                 temp = temp->next;
  905.             } while (temp && k % 5 != 0);
  906.  
  907.             cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  908.             cout << "Страница " << page << " из " << ceil(kol_el/ 5);
  909.         }
  910.  
  911.         c = _getwch();
  912.         if (c == esc) return 0;
  913.         key = _getwch();
  914.  
  915.         switch (key) {
  916.         case right_btn:
  917.             extreme_page = 2;
  918.             if (k + 1 != kol_el) {
  919.                 page++;
  920.             }
  921.             else {
  922.                 k = first_k;
  923.                 temp = first_temp;
  924.             }
  925.             system("cls");
  926.             break;
  927.         case left_btn:
  928.             if (page != 1) {
  929.                 system("cls");
  930.                 k -= k_this_page + 5;
  931.                 page--;
  932.                 temp = buf_temp;
  933.             }
  934.             else extreme_page = 1;
  935.             break;
  936.         }
  937.     }
  938. }
Add Comment
Please, Sign In to add comment