Advertisement
MARSHAL327

Untitled

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