Advertisement
MARSHAL327

Untitled

Dec 1st, 2019
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 19.11 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. using namespace std;
  10. //----КОНСТАНТЫ----------
  11. const int up = 72,
  12. down = 80,
  13. right_btn = 77,
  14. left_btn = 75,
  15. enter = 13,
  16. esc = 27,
  17. del = 83,
  18. d_n = 20;
  19.  
  20.  
  21. const string items[10] = {
  22.     "Создать список или добавить новый эл-т   ",
  23.     "Удаление всех элементов списка",
  24.     "Просмотр списка",
  25.     "Запись данных в файл",
  26.     "Чтение из файла",
  27.     "Изменить",
  28.     "Поиск",
  29.     "Сортировка по дате",
  30.     "Старые книги",
  31.     "Выход"};
  32.  
  33.  
  34. //-------------------------------------------
  35. struct info {
  36.     string autor;
  37.     string name;
  38.     string izdatelstvo;
  39.     string janr;
  40.     int d = 0, m = 0, g = 0, cost = 0;
  41. };
  42. struct book {
  43.     info inf;
  44.     book* next;
  45.     book* pred;
  46. };
  47. //-------------------------------------------
  48. book vvod_book();
  49. book* dob(book* end, const book& s);
  50. book* dob_first(const book& s);
  51. book* udal(book* beg);
  52. void print(const book& s);
  53. void prosmotr(book* beg);
  54. void old_book(book beg);
  55. void sort_cost(book** beg);
  56. void sort_data(book* book);
  57. void searchname(book* beg);
  58. void searchautor(book* beg);
  59. int change(book* beg, string& user_autor, string& new_user_autor);
  60. int read_file(char* filename, book** beg, book** end);
  61. int write_file(char* filename, book* temp);
  62. int menu(int& active, const string items[], int num_el);
  63. int menu2();
  64. void SetColor(int text, int bg);
  65. //--------основная программа-----------------------------------
  66. int main()
  67. {
  68.     ShowWindow(GetConsoleWindow(), SW_MAXIMIZE); // полноэкранный режим
  69.     setlocale(LC_ALL, "Rus");
  70.     system("color 8F");
  71.     book* beg = NULL,
  72.         * end = NULL, input;
  73.     char filename[20];
  74.     int Num, current = 1;
  75.     string user_autor, new_user_autor;
  76.     while (1) {
  77.         switch (menu(current, items, 10))
  78.         {
  79.         case 1://создание списка или добовление нового эл-та в список
  80.             if (beg)
  81.                 end = dob(end, vvod_book());
  82.             else
  83.             {
  84.                 beg = dob_first(vvod_book());
  85.                 end = beg;
  86.             }
  87.             break;
  88.         case 2://удаление всех элементов в списке
  89.             beg = udal(beg);
  90.             cout << "Нажмите любую клавишу" << endl;
  91.             cin.get();
  92.             break;
  93.         case 3://просмотр
  94.             prosmotr(beg);
  95.             cin.get();
  96.             break;
  97.         case 4://запись в файл
  98.             write_file(filename, beg);
  99.             break;
  100.         case 5://чтение из файла
  101.             read_file(filename, &beg, &end);
  102.             break;
  103.         case 6://редактирование списка
  104.             cout << "Введите автора, которого вы хотите изменить: " << endl;
  105.             cin >> user_autor;
  106.             cout << "Введите нового атвора: " << endl;
  107.             cin >> new_user_autor;
  108.             Num = change(beg, user_autor, new_user_autor);
  109.             if (Num == 1) cout << "Автор успешно перезаписан." << endl;
  110.             else cout << "Автор не найден!" << endl;
  111.             system("pause");
  112.             change(beg, user_autor, new_user_autor);
  113.             cin.get();
  114.             break;
  115.         case 7://поиск
  116.         {
  117.             switch (menu2()) {
  118.             case 1://поск по автору
  119.                 searchautor(beg);
  120.                 cin.get();
  121.                 break;
  122.             case 2:
  123.                 searchname(beg);//поиск по названию книги
  124.                 cin.get();
  125.                 break;
  126.             case 3:
  127.             case 9:break;
  128.             }
  129.             break;
  130.         }
  131.         case 8: sort_cost(&beg); break;
  132.         case 9:
  133.             if (!beg) {
  134.                 MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  135.                 break;
  136.             }
  137.             old_book(*beg);
  138.             break;
  139.         case 10: return 0;
  140.         }
  141.     }
  142.     return 0;
  143. }
  144.  
  145. //-----------------------------------------------------------------------------
  146. int menu()
  147. {
  148.     char buf[7];
  149.     int k;
  150.     do
  151.     {
  152.         system("CLS");
  153.         cout << "============================" << endl;
  154.         cout << "            МЕНЮ            " << endl;
  155.         cout << "============================" << endl;
  156.         cout << "Введите номер пункта меню" << endl;
  157.         cout << "1 - Создать список или добавить новый эл-т" << endl;
  158.         cout << "2 - Удаление всех элементов списка" << endl;
  159.         cout << "3 - Просмотр списка" << endl;
  160.         cout << "4 - Запись данных в файл" << endl;
  161.         cout << "5 - Чтение из файла" << endl;
  162.         cout << "6 - Изменить" << endl;
  163.         cout << "7 - Поиск" << endl;
  164.         cout << "8 - Сортировка по дате" << endl;
  165.         cout << "9 - Выход" << endl;
  166.         cout << "============================" << endl;
  167.         cin >> buf;
  168.         cin.get();
  169.         k = atoi(buf);
  170.         if (!k)
  171.         {
  172.             cout << "Вам следует вводить число от 1 до 7" << endl;
  173.             cin.get();
  174.         }
  175.     } while (!k);
  176.     return k;
  177. }
  178. //-----------------------------------------------------------------------------
  179. int menu2()
  180. {
  181.     char buf[7];
  182.     int m;
  183.     do
  184.     {
  185.         system("CLS");
  186.         cout << "============================" << endl;
  187.         cout << "Выберите поле по которому хотите осуществить поиск" << endl;
  188.         cout << "1 - Автор книги" << endl;
  189.         cout << "2 - Название книги" << endl;
  190.         cout << "9 - Выход в главное меню" << endl;
  191.         cout << "============================" << endl;
  192.         cin >> buf;
  193.         cin.get();
  194.         m = atoi(buf);
  195.         if (!m)
  196.         {
  197.             cout << "Вам следует вводить число от 1 до 7" << endl;
  198.             cin.get();
  199.         }
  200.     } while (!m);
  201.     return m;
  202. }
  203.  
  204. //-----------------------------------------------------------------------------
  205. int change(book* beg, string& user_autor, string& new_user_autor)
  206. {
  207.     book* temp = beg;
  208.     while (temp != NULL)
  209.     {
  210.         if (temp->inf.autor == user_autor)
  211.         {
  212.             temp->inf.autor = new_user_autor;
  213.             return 1;
  214.         }
  215.         else
  216.         {
  217.             temp = temp->next;
  218.  
  219.         }
  220.     }
  221.     return 0;
  222. }
  223. //------------------------------------------------------------------------------
  224. void searchname(book* beg)
  225. {
  226.     book* temp = beg;
  227.     char fname[d_n];
  228.  
  229.     system("cls");
  230.  
  231.     if (!beg)
  232.     {
  233.         MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  234.         return;
  235.     }
  236.  
  237.     cout << "Введите название книги для поиска" << endl;
  238.     cin >> fname;
  239.  
  240.     while (temp)
  241.     {
  242.         if (fname == temp->inf.name)
  243.         {
  244.             cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  245.             cout << "|       Автор       |      Название      |   Издательство   |      Жанр      | Дата поступления |   Стоимость   |" << endl;
  246.             cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  247.             print(*temp);
  248.             system("pause");
  249.             return;
  250.         }
  251.         temp = temp->next;
  252.  
  253.     }
  254.     cout << "Книги с таким названием не найдено" << endl;
  255.     system("pause");
  256. }
  257. //-----------------------------------------------------------------------------
  258. void searchautor(book * beg)
  259. {
  260.     book* temp = beg;
  261.     char fa[d_n];
  262.     system("cls");
  263.     if (!beg)
  264.     {
  265.         MessageBox(0, L"Список пуст", L"Уведомление", MB_ICONINFORMATION | MB_SETFOREGROUND);
  266.         return;
  267.     }
  268.     cout << "Введите автора для поиска" << endl;
  269.     cin >> fa;
  270.     while (temp)
  271.     {
  272.         if (fa == temp->inf.autor)
  273.         {
  274.             cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  275.             cout << "|       Автор       |      Название      |   Издательство   |      Жанр      | Дата поступления |   Стоимость   |" << endl;
  276.             cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  277.             print(*temp);
  278.             system("pause");
  279.             return;
  280.         }
  281.         temp = temp->next;
  282.     }
  283.     cout << "Книги с таким автором не найдено" << endl;
  284.     system("pause");
  285. }
  286. //-----------------------------------------------------------------------------
  287. void old_book(book beg)
  288. {
  289.     book *temp = &beg;
  290.     sort_data(&beg);
  291.     system("cls");
  292.  
  293.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  294.     cout << "|       Автор       |      Название      |   Издательство   |      Жанр      | Дата поступления |   Стоимость   |" << endl;
  295.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  296.     for (int i = 0; i < 5; i++) {
  297.         print(*temp);
  298.         temp = temp->next;
  299.     }
  300.        
  301.     system("pause");
  302.     return;
  303.    
  304.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  305.     cin.get();
  306. }
  307. //-----------------------------------------------------------------------------
  308. void prosmotr(book * beg)
  309. {
  310.     if (!beg)
  311.     {
  312.         cout << "список пустой" << endl;
  313.         cin.get();
  314.         return;
  315.     }
  316.     book* temp = beg;
  317.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  318.     cout << "|       Автор       |      Название      |   Издательство   |      Жанр      | Дата поступления |   Стоимость   |" << endl;
  319.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  320.     while (temp)
  321.     {
  322.         print(*temp);
  323.         temp = temp->next;
  324.     }
  325.     cout << "+———————————————————+————————————————————+——————————————————+————————————————+——————————————————+———————————————+" << endl;
  326.     cin.get();
  327. }
  328. //-----------------------------------------------------------------------------
  329. book vvod_book()
  330. {
  331.     book s;
  332.     cout << "Введите автора:" << endl;
  333.     while (1)
  334.     {
  335.         cin >> s.inf.autor;
  336.         //if (atoi(s.autor)==0)
  337.     //  if((s.autor[0] <= '0') && (s.autor[0] >= '9' ) )
  338.         break;
  339.         cout << "Ошибка ввода!" << endl;
  340.     }
  341.     cout << "Введите название книги:" << endl;
  342.     while (1)
  343.     {
  344.         cin >> s.inf.name;
  345.         //if (atoi(s.name)==0)
  346.         break;
  347.         cout << "Ошибка ввода!" << endl;
  348.     }
  349.     cout << "Введите издательство:" << endl;
  350.     while (1)
  351.     {
  352.         cin >> s.inf.izdatelstvo;
  353.         //if (atoi(s.izdatelstvo) == 0)
  354.         break;
  355.         cout << "Ошибка ввода!" << endl;
  356.     }
  357.     cout << "Введите жанр:" << endl;
  358.     while (1)
  359.     {
  360.         cin >> s.inf.janr;
  361.         //if (atoi(s.janr) == 0)
  362.         break;
  363.         cout << "Ошибка ввода!" << endl;
  364.     }
  365.     cout << "Введите дату поступления:" << endl;
  366.     cout << "Введите день:";
  367.     while (1)
  368.     {
  369.         cin >> s.inf.d;
  370.         if ((s.inf.d >= 1) && (s.inf.d <= 31))
  371.             break;
  372.         cout << "Ошибка ввода!Ведите правильную дату!" << endl;
  373.     }
  374.     cout << "Введите месяц:";
  375.     while (1)
  376.     {
  377.         cin >> s.inf.m;
  378.         if ((s.inf.m >= 1) && (s.inf.m <= 12))
  379.             break;
  380.         cout << "Ошибка ввода!Ведите правильную дату!" << endl;
  381.     }
  382.     cout << "Введите год:";
  383.     while (1)
  384.     {
  385.         cin >> s.inf.g;
  386.         if ((s.inf.g >= 1900) && (s.inf.g <= 2050))
  387.             break;
  388.         cout << "Ошибка ввода!Ведите правильную дату!" << endl;
  389.     }
  390.     cout << "Введите стоимость книги:" << endl;
  391.     cin >> s.inf.cost;
  392.     return s;
  393. }
  394. //-----------------------------------------------------------------------------
  395. void print(const book & s)
  396. {
  397.     cout << "|" << s.inf.autor << setw(20 - (s.inf.autor).length()) << "|";
  398.     cout << s.inf.name << setw(21 - (s.inf.name).length()) << "|";
  399.     cout << s.inf.izdatelstvo << setw(19 - (s.inf.izdatelstvo).length()) << "|";
  400.     cout << s.inf.janr << setw(17 - (s.inf.janr).length()) << "|";
  401.     if (s.inf.d < 10) cout << 0 << s.inf.d << ".";
  402.     if (s.inf.m < 10) cout << 0 << s.inf.m << "." << s.inf.g << setw(19) << "|";
  403.     cout << s.inf.cost << setw(16) << "|" << endl;
  404.  
  405. }
  406. //--------------ф-я добавления или создания эл-та-------------------------------
  407. book * dob(book * end, const book & s)
  408. {
  409.     book* newE = new book;
  410.     *newE = s;
  411.     newE->next = 0;
  412.     end->next = newE;
  413.     end = newE;
  414.     return end;
  415. }
  416. //--------------создание первого эл-та------------------------------
  417. book* dob_first(const book & s)
  418. {
  419.     book* beg = new book;
  420.     *beg = s;
  421.     beg->next = 0;
  422.     return beg;
  423. }
  424. //-----------------------------------------------------------------------------
  425. int read_file(char* filename, book * *beg, book * *end)
  426. {
  427.     cout << "Введите название файла" << endl;
  428.     cin >> filename;
  429.     ifstream fin(filename, ios::in);
  430.     if (!fin) {
  431.  
  432.         MessageBox(0, L"Невозможно открыть файл!", L"Ошибка", MB_ICONERROR | MB_SETFOREGROUND);
  433.         return 0;
  434.  
  435.     }
  436.     book s;
  437.     *beg = 0;
  438.     fin.seekg(0, ios::beg);
  439.     while (fin >> s.inf.autor)
  440.     {
  441.         fin >> s.inf.name;
  442.         fin >> s.inf.izdatelstvo;
  443.         fin >> s.inf.janr;
  444.         fin >> s.inf.d;
  445.         fin >> s.inf.m;
  446.         fin >> s.inf.g;
  447.         fin >> s.inf.cost;
  448.         if (*beg)
  449.             * end = dob(*end, s);
  450.         else
  451.         {
  452.             *beg = dob_first(s); *end = *beg;
  453.         }
  454.     }
  455.     cout << "Считывание прошло успешно" << endl;
  456.     cin.get();
  457.     cin.get();
  458.     return 0;
  459. }
  460. //-----------------------------------------------------------------------------
  461. int write_file(char* filename, book * temp)
  462. {
  463.     cout << "Введите название файла" << endl;
  464.     cin >> filename;
  465.     ofstream fout(filename, ios_base::app); // открытие файла
  466.     if (!fout)
  467.     {
  468.         cout << "Не могу открыть файл для записи" << endl;
  469.         return 1;
  470.     }
  471.     while (temp)// пока temp!=0 выводим эл-ты в файл
  472.     {
  473.         fout << temp->inf.autor << endl;
  474.         fout << temp->inf.name << endl;
  475.         fout << temp->inf.izdatelstvo << endl;
  476.         fout << temp->inf.janr << endl;
  477.         fout << temp->inf.d << endl;
  478.         fout << temp->inf.m << endl;
  479.         fout << temp->inf.g << endl;
  480.         fout << temp->inf.cost << endl;
  481.         temp = temp->next;
  482.     }
  483.     cout << "Данные сохранены в файле: " << filename << endl;
  484.     cout << "==============================" << endl;
  485.     cout << "Нажмите любую клавишу" << endl;
  486.     cin.get();
  487.     return 0;
  488. }
  489. //-----------------------------------------------------------------------------
  490. book* udal(book * beg)
  491. {
  492.     book* temp;
  493.     if (!beg)
  494.     {
  495.         cout << "список пустой" << endl;
  496.         cin.get();
  497.         return 0;
  498.     }
  499.     while (beg)
  500.     {
  501.         temp = beg;
  502.         beg = beg->next;
  503.         delete temp;
  504.     }
  505.     cout << "==============================" << endl;
  506.     cout << "====удаление прошло успешно===" << endl;
  507.     cout << "==============================" << endl;
  508.     return beg;
  509. }
  510. //----------------------------------------------------------------
  511. void sort_data(book *beg)
  512. {
  513.     book* temp_i = beg, * temp_j = beg;
  514.     for (; temp_i; temp_i = temp_i->next)
  515.     {
  516.         for (temp_j = temp_i; temp_j; temp_j = temp_j->next)
  517.         {
  518.             if (temp_i->inf.g != temp_j->inf.g)
  519.             {
  520.                 if (temp_i->inf.g > temp_j->inf.g)
  521.                 {
  522.                     swap(temp_i->inf, temp_j->inf);
  523.                     continue;
  524.                 }
  525.             }
  526.             else if (temp_i->inf.m != temp_j->inf.m)
  527.             {
  528.                 if (temp_i->inf.m > temp_j->inf.m)
  529.                 {
  530.                     swap(temp_i->inf, temp_j->inf);
  531.                     continue;
  532.                 }
  533.             }
  534.             else if (temp_i->inf.d > temp_j->inf.d)
  535.             {
  536.                 swap(temp_i->inf, temp_j->inf);
  537.                 continue;
  538.             }
  539.         }
  540.     }
  541.     cout << "Сортировка прошла успешно" << endl;
  542.     system("pause");
  543. }
  544. //----------------------------------------
  545. void sort_cost(book * *beg) {
  546.     book* temp_i = *beg,
  547.         * temp_j = *beg;
  548.  
  549.     for (; temp_i; temp_i = temp_i->next) {
  550.         for (temp_j = temp_i; temp_j; temp_j = temp_j->next) {
  551.             if (temp_i->inf.cost > temp_j->inf.cost) {
  552.                 swap(temp_i->inf, temp_j->inf);
  553.             }
  554.         }
  555.     }
  556.  
  557.     cout << "Сортировка прошла успешно" << endl;
  558.     system("pause");
  559. }
  560.  
  561.  
  562.  
  563.  
  564. // ==========ШАБЛОН ПЕЧАТИ МЕНЮ==========
  565. void print_menu(int sym, const string items[], const int N_ITEMS) {
  566.     for (int i = 1; i <= N_ITEMS; i++) {
  567.         SetColor(15, 8);
  568.         if (i == sym) {
  569.             SetColor(15, 5);
  570.         }
  571.         cout << items[i - 1] << endl;
  572.         SetColor(15, 8);
  573.     }
  574. }
  575.  
  576. // ==========МЕНЮ==========
  577. int menu(int& active, const string items[], int num_el) {
  578.     wint_t buf;
  579.  
  580.     do {
  581.         system("cls");
  582.         print_menu(active, items, num_el);
  583.  
  584.         buf = _getwch();
  585.         switch (buf) {
  586.         case up: // клавиша вверх
  587.             if (active > 1) active--;
  588.             break;
  589.         case down: // клавиша вниз
  590.             if (active < num_el) active++;
  591.             break;
  592.         case enter: // клавиша enter
  593.             return active;
  594.         case esc: // клавиша escape
  595.             return -1;
  596.         }
  597.     } while (1);
  598. }
  599.  
  600.  
  601. // ==========УСТАНОВКА ЦВЕТА ТЕКСТА И ФОНА==========
  602. void SetColor(int text, int bg) {
  603.     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  604.     SetConsoleTextAttribute(hStdOut, (WORD)((bg << 4) | text));
  605. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement