Advertisement
Guest User

хай

a guest
Mar 20th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 28.80 KB | None | 0 0
  1. #include "pch.h"
  2. #include "iostream"
  3. #include "stdio.h"
  4. #include "conio.h"
  5. #include "iomanip"
  6. #include "fstream"
  7. #include "string"
  8. #include "windows.h"
  9.  
  10. using namespace std;
  11. string ver = "0.9.9 RC 3";
  12.  
  13. struct our_data {
  14.     int tab_num;
  15.     char fio[30];
  16.     int god_rozhdeniya;
  17.     int pol;
  18.     char professiya[10];
  19.     int staj_raboty;
  20.     int razryad;
  21.     int nomer_zeha;
  22.     int nomer_uchastka;
  23.     int summa_zp;
  24. };
  25. struct worker {
  26.     our_data d;
  27.     worker *next;
  28. };
  29.  
  30. worker *st = 0, *en = 0;
  31. int zcount = 0;
  32. char file[30] = "workers.bin";
  33. char filetxt[30] = "workers.txt";
  34. char filereport[30] = "report.txt";
  35.  
  36. void input_clear()
  37. {
  38.     cin.clear();
  39.     fflush(stdin);
  40. }
  41.  
  42. void msg(string s, int arg = 0, int delay = 1500)
  43. //вывод сообщения
  44. {
  45.     system("color B0");
  46.     if (arg == 1)
  47.     {
  48.         system("cls");
  49.         cout << endl << endl;
  50.         cout << "   +---------------------------------------------------+" << endl;
  51.  
  52.     }
  53.     cout << "   |      " << s << setw(46 - s.length()) << " |" << endl;
  54.     cout << "   +---------------------------------------------------+" << endl;
  55.     if (delay >= 0) Sleep(delay);
  56.     else cin.get();
  57.     system("color F0");
  58.     return;
  59. }
  60.  
  61. void print(int k = 0, worker *tmp = NULL, int i = 1)
  62. // вывод элемента
  63. // key: 0 - шапка
  64. //      1 - 1 элемент
  65. //      2 - элемент
  66. //      3 - разделитель
  67. //      4 - разделитель и пауза
  68. //      5 - продолжение
  69. //      6 - конец списка
  70. {
  71.     if ((k == 0) || (k == 1))
  72.     {
  73.         system("cls");
  74.         cout << "+-----------------------------------------------------------------------------------------------------------------+\n";
  75.         cout << "| № | Таб. № |              ФИО              | Год р.| Пол | Профессия | Стаж | Разряд | цех № | № уч.| Сумма З.П.|\n";
  76.         cout << "+-----------------------------------------------------------------------------------------------------------------+\n";
  77.     }
  78.     if ((k == 1) || (k == 2))
  79.         if (tmp) printf("|%2d | %-6d | %-29s | %-5d |%4d |%10s |%5d |%7d |%6d |%5d |%10d |\n", i, tmp->d.tab_num, tmp->d.fio, tmp->d.god_rozhdeniya, tmp->d.pol, tmp->d.professiya, tmp->d.staj_raboty, tmp->d.razryad, tmp->d.nomer_zeha, tmp->d.nomer_uchastka, tmp->d.summa_zp);
  80.         else cout << "Выход за пределы допустимой области памяти" << endl;
  81.     if (k == 3)
  82.         cout << "+-----------------------------------------------------------------------------------------------------------------+" << endl;
  83.     if ((k == 1) || (k == 4)) {
  84.         cout << "+-----------------------------------------------------------------------------------------------------------------+" << endl;
  85.         system("pause");
  86.     }
  87.     if (k == 5)
  88.         cout << "| * |                            ---== ............ ==---                                    * |" << endl;
  89.     if (k == 6)
  90.         cout << "| * |                       ---== Конец списка ==---                             * |" << endl;
  91. }
  92.  
  93. void view()
  94. // просмотр 2
  95. {
  96.     system("TITLE Просмотр списка");//заголовок консоли
  97.     worker *tmp = st;
  98.     int vnum = 4;
  99.     int ibeg = 1, iend = vnum;
  100.     int stop = 0;
  101.     int a;
  102.  
  103.     if (!st)
  104.     {
  105.         msg("Список пуст", 1, -1);
  106.         return;
  107.     }
  108.  
  109.     while (1)
  110.     {
  111.         tmp = st;
  112.         for (int count = 1; count < ibeg; count++)
  113.         {
  114.             tmp = tmp->next;
  115.             if (count >= zcount) { stop = 1; break; }
  116.         }
  117.  
  118.         print(0);   //шапка
  119.         if (stop != 1)
  120.             for (int count = ibeg; count <= iend; count++)
  121.             {
  122.                 print(2, tmp, count);       //печать элемента
  123.                 if (count >= zcount)
  124.                 {
  125.                     print(6);
  126.                     print(3);
  127.                     stop = 1;
  128.                     break;
  129.                 }
  130.                 tmp = tmp->next;
  131.             }
  132.  
  133.         if (stop != 1)
  134.         {
  135.             print(5);
  136.             print(3);
  137.         }
  138.         cout << "Навигация: <вверх>, <вниз>, Enter или ESC для выхода" << endl;
  139.         do a = _getch();
  140.         while (a == 224);
  141.         switch ((int)a) {
  142.         case 80:    //down
  143.             if (zcount > vnum)
  144.             {
  145.  
  146.                 if (stop == 1)
  147.                 {
  148.                     ibeg = 1;
  149.                     iend = vnum;
  150.                 }
  151.                 else
  152.                 {
  153.                     ibeg++;
  154.                     iend++;
  155.                 }
  156.             }
  157.             if (stop == 1)
  158.                 stop = 0;
  159.             break;
  160.         case 72:    //up
  161.             if (zcount > vnum)
  162.             {
  163.                 if (ibeg == 1)
  164.                 {
  165.                     iend = zcount;
  166.                     ibeg = iend - vnum + 1;
  167.                 }
  168.                 else
  169.                 {
  170.                     iend--;
  171.                     ibeg--;
  172.                 }
  173.  
  174.             }
  175.             if (stop == 1)
  176.                 stop = 0;
  177.             break;
  178.         case 13: case 27: return;   // esc / enter
  179.         }
  180.     }
  181. }
  182.  
  183. worker scan(int k = 0) {
  184.     // ввод полей записи
  185.     worker el;
  186.     el.next = NULL;
  187.     cout << "ФИО: "; cin >> el.d.fio;
  188.     if (el.d.fio[0] == '*') return el;
  189.     while (!cin) {
  190.         input_clear();
  191.         cout << "[ОШИБКА, повторите ввод]" << endl;
  192.         cin.ignore();
  193.         cin >> el.d.fio;
  194.     }
  195.     input_clear();
  196.     if (k == 1) return el;
  197.  
  198.     cout << "Табельный номер: "; cin >> el.d.tab_num;
  199.     while ((!cin) || (el.d.tab_num <= 0) || (el.d.tab_num > 999999)) {
  200.         input_clear();
  201.         cout << "[ОШИБКА, повторите ввод]" << endl;
  202.         cin.ignore();
  203.         cin >> el.d.tab_num;
  204.     }
  205.     input_clear();
  206.  
  207.     cout << "Год рождения: "; cin >> el.d.god_rozhdeniya;
  208.     while ((!cin) || (el.d.god_rozhdeniya < 0) || (el.d.god_rozhdeniya > 2015)) {
  209.         input_clear();
  210.         cout << "[ОШИБКА, повторите ввод]" << endl;
  211.         cin.ignore();
  212.         cin >> el.d.god_rozhdeniya;
  213.     }
  214.     input_clear();
  215.  
  216.     cout << "Пол(1/0): "; cin >> el.d.pol;
  217.     while ((!cin) || (el.d.pol < 0) || (el.d.pol > 1)) {
  218.         input_clear();
  219.         cout << "[ОШИБКА, повторите ввод]" << endl;
  220.         cin.ignore();
  221.         cin >> el.d.pol;
  222.     }
  223.     input_clear();
  224.  
  225.     cout << "Профессия: "; cin >> el.d.professiya;
  226.     while (!cin) {
  227.         input_clear();
  228.         cout << "[ОШИБКА, повторите ввод]" << endl;
  229.         cin.ignore();
  230.         cin >> el.d.professiya;
  231.     }
  232.     input_clear();
  233.  
  234.     cout << "Стаж: "; cin >> el.d.staj_raboty;
  235.     while ((!cin) || (el.d.staj_raboty < 0) || (el.d.staj_raboty > 100)) {
  236.         input_clear();
  237.         cout << "[ОШИБКА, повторите ввод]" << endl;
  238.         cin.ignore();
  239.         cin >> el.d.staj_raboty;
  240.     }
  241.     input_clear();
  242.  
  243.     cout << "Разряд: "; cin >> el.d.razryad;
  244.     while ((!cin) || (el.d.razryad < 0) || (el.d.razryad > 20)) {
  245.         input_clear();
  246.         cout << "[ОШИБКА, повторите ввод]" << endl;
  247.         cin.ignore();
  248.         cin >> el.d.razryad;
  249.     }
  250.     input_clear();
  251.  
  252.     cout << "№ цеха: "; cin >> el.d.nomer_zeha;
  253.     while ((!cin) || (el.d.nomer_zeha < 0) || (el.d.nomer_zeha > 100)) {
  254.         input_clear();
  255.         cout << "[ОШИБКА, повторите ввод]" << endl;
  256.         cin.ignore();
  257.         cin >> el.d.nomer_zeha;
  258.     }
  259.     input_clear();
  260.  
  261.     cout << "№ участка: "; cin >> el.d.nomer_uchastka;
  262.     while ((!cin) || (el.d.nomer_uchastka < 0) || (el.d.nomer_uchastka > 100)) {
  263.         input_clear();
  264.         cout << "[ОШИБКА, повторите ввод]" << endl;
  265.         cin.ignore();
  266.         cin >> el.d.nomer_uchastka;
  267.     }
  268.     input_clear();
  269.  
  270.     cout << "Сумма З.П.: "; cin >> el.d.summa_zp;
  271.     while ((!cin) || (el.d.summa_zp < 0) || (el.d.summa_zp > 1000000)) {
  272.         input_clear();
  273.         cout << "[ОШИБКА, повторите ввод]" << endl;
  274.         cin.ignore();
  275.         cin >> el.d.summa_zp;
  276.     }
  277.     input_clear();
  278.  
  279.     return el;
  280. }
  281.  
  282. void sort(int s = 0) {
  283.     //сортировка списка
  284.     if (s == 0) {
  285.         msg("Сортировка списка (по ФИО)", 1, 200);
  286.         system("TITLE Сортировка списка (по ФИО)");//заголовок консоли
  287.     }
  288.     worker *ptr = st, *tmp = NULL, *prev = NULL;
  289.     bool flag = false;
  290.     if (st)
  291.     {
  292.         do
  293.         {
  294.             flag = false;
  295.             ptr = st;
  296.             while (ptr->next)
  297.             {
  298.                 if (strcmp(ptr->d.fio, ptr->next->d.fio) > 0)
  299.                 {
  300.                     if (ptr == st)
  301.                     {
  302.                         tmp = ptr;
  303.                         ptr = tmp->next;
  304.                         tmp->next = ptr->next;
  305.                         ptr->next = tmp;
  306.                         st = ptr;
  307.                         flag = true;
  308.                     }
  309.                     else
  310.                     {
  311.                         tmp = ptr;
  312.                         ptr = tmp->next;
  313.                         tmp->next = ptr->next;
  314.                         ptr->next = tmp;
  315.                         prev->next = ptr;
  316.                         flag = true;
  317.                     }
  318.                 }
  319.                 prev = ptr;
  320.                 ptr = ptr->next;
  321.                 en = ptr;
  322.             }
  323.         } while (flag);
  324.         if (s == 0) msg("Список отсортирован.", 0, 1000);
  325.     }
  326.     else
  327.         if (s == 0) msg("Список пуст. Сортировать нечего", 1, 1500);
  328.  
  329. }
  330.  
  331. void addnew(worker el, int ns = 0)
  332. //добавление элемента
  333. {
  334.     if (el.d.fio[0] == '*')  return;
  335.     if (!st) {
  336.         st = new worker;
  337.         *st = el;
  338.         st->next = NULL;
  339.         en = st;
  340.     }
  341.     else
  342.     {
  343.         worker *tmp;
  344.         tmp = new worker;
  345.         *tmp = el;
  346.         en->next = tmp;
  347.         en = tmp;
  348.         en->next = NULL;
  349.     }
  350.     if (ns == 0) sort(1);
  351.     zcount++;
  352. }
  353.  
  354. void create() {
  355.     //Организация списка
  356.     system("TITLE Организация списка");//заголовок консоли
  357.     system("cls");
  358.     worker el;
  359.     while (1)
  360.     {
  361.         el = scan();
  362.         if (el.d.fio[0] != '*') addnew(el);
  363.         else break;
  364.     }
  365.     sort(1);
  366.     return;
  367. }
  368.  
  369. int delall() {
  370.     //Очистка списка final
  371.     system("TITLE Очистка списка");//заголовок консоли
  372.     char mark[2];
  373.     for (int f = 0; f <= 1; f++) mark[f] = ' ';
  374.     int choise = 0;
  375.     while (true)
  376.     {
  377.         system("cls");
  378.         mark[choise] = '>';
  379.         cout << "+-----------------------+" << endl;
  380.         cout << "! Удаление всего списка !" << endl;
  381.         cout << "+-----------------------+" << endl;
  382.         cout << "!   Хотите продолжить?  !" << endl;
  383.         cout << "+-----------------------+" << endl;
  384.         cout << mark[0] << " Да" << endl;
  385.         cout << mark[1] << " Нет" << endl;
  386.         cout << "+-----------------------+" << endl;
  387.         int a;
  388.         do a = _getch();
  389.         while (a == 224);
  390.  
  391.         switch ((int)a) {
  392.         case 80: {
  393.             mark[choise] = ' ';
  394.             if (choise < 1) choise++;
  395.             else choise = 0;
  396.             break;
  397.         }
  398.         case 72: {
  399.             mark[choise] = ' ';
  400.             if (choise > 0) choise--;
  401.             else choise = 1;
  402.             break;
  403.         }
  404.         case 13: case 27: {
  405.             switch (choise) {
  406.             case 0:
  407.             {
  408.                 worker *temp;
  409.                 if (st == NULL) return 0;
  410.                 while (1)
  411.                 {
  412.                     temp = st;
  413.                     st = st->next;
  414.                     delete temp;
  415.                     if (st == NULL) break;
  416.                 };
  417.                 en = NULL;
  418.                 zcount = 0;
  419.                 msg("Список очищен", 1, 1000);
  420.                 return 1;
  421.  
  422.             }
  423.             case 1:return 0;
  424.  
  425.             }
  426.             break;
  427.         }
  428.  
  429.         }
  430.     }
  431. }
  432.  
  433. void delzap(int n = 0, int s = 0) {
  434.     //удаление записи final
  435.     // n номер для удаления
  436.     // s флаг тихого режима
  437.     worker *tmp = st, *tmp2;
  438.     int a;
  439.     if (s == 0)
  440.     {
  441.         if (n == 0)
  442.         {
  443.             system("cls");
  444.             system("TITLE Удаление");//заголовок консоли
  445.             cout << "Введите номер удаляемого элемента (0 для отмены)" << endl;
  446.             cin >> n;
  447.             while ((!cin) || (n < 0) || (n > zcount)) {
  448.                 cin.ignore();
  449.                 cin.clear();
  450.                 fflush(stdin);
  451.                 cout << "[ОШИБКА ВВОДА или запись по данному номеру отсутствует]" << endl;
  452.                 cin >> n;
  453.             }
  454.         }
  455.     }
  456.     if (n == 0) return;
  457.     if (n == 1)     //удаление первого
  458.     {
  459.         while (true)
  460.         {
  461.             if (s == 0)
  462.             {
  463.                 cout << "Будет удален элемент" << endl;
  464.                 print(0);
  465.                 print(2, st, n);
  466.                 print(3);
  467.                 cout << "Нажмите Enter для продолжения или ESC для отмены" << endl;
  468.                 a = _getch();
  469.             }
  470.             else a = 13;
  471.             switch ((int)a)
  472.             {
  473.             case 27: return; //esc
  474.             case 13: {
  475.                 st = tmp->next;
  476.                 delete tmp;
  477.                 if (s == 0)
  478.                 {
  479.                     cout << "Элемент удален" << endl;
  480.                     system("pause");
  481.                 }
  482.                 zcount--;
  483.                 return;
  484.             }
  485.             default: cout << "Неправильный ввод" << endl;
  486.             }
  487.  
  488.         }
  489.     }
  490.     else      // удаление не первого
  491.     {
  492.         for (int i = 2; i < n; i++) tmp = tmp->next;
  493.         tmp2 = tmp->next;
  494.         while (true)
  495.         {
  496.             if (s == 0)
  497.             {
  498.                 cout << "Будет удален элемент" << endl;
  499.                 print(0);
  500.                 print(2, tmp2, n);
  501.                 print(3);
  502.                 cout << "Нажмите Enter для продолжения или ESC для отмены" << endl;
  503.                 a = _getch();
  504.             }
  505.             else a = 13;
  506.             switch ((int)a)
  507.             {
  508.             case 27: return; //esc
  509.             case 13: {
  510.                 if (tmp2->next)
  511.                     tmp->next = tmp->next->next;
  512.                 else
  513.                 {
  514.                     tmp->next = NULL;
  515.                     en = tmp;
  516.                 }
  517.                 delete tmp2;
  518.                 if (s == 0)
  519.                 {
  520.                     cout << "Элемент удален" << endl;
  521.                     system("pause");
  522.                 }
  523.                 zcount--;
  524.                 return;
  525.             }
  526.             default: cout << "Неправильный ввод" << endl;
  527.             }
  528.         }
  529.     }
  530. }
  531.  
  532. int read() {        //чтение из бинарного файла
  533.     int i = 0;
  534.     worker el;
  535.     ifstream fin(file, ios::binary | ios::in);
  536.     if (!fin) {
  537.         msg("Не могу откыть файл", 1, 0);
  538.         msg("или файл не существует", 0, 1000);
  539.         return -1;
  540.     }
  541.     else {
  542.         fin.seekg(0, ios::beg);
  543.         while (fin.read((char*)&(el.d), sizeof our_data))
  544.         {
  545.             el.next = NULL;
  546.             addnew(el, 1);
  547.             i++;
  548.         }
  549.     }
  550.     zcount = i;
  551.     fin.close();
  552.     sort(1);
  553.     return i;
  554. }
  555.  
  556. void correct(int i = 0)
  557. //редактирование записи
  558. {
  559.     system("cls");
  560.     system("TITLE Редактирование записи");//заголовок консоли
  561.     if (i == 0) {
  562.         cout << "Введите номер записи (0 для отмены): ";
  563.         cin >> i;
  564.     }
  565.     if (i == 0) return;
  566.     if (i > zcount) {
  567.         msg("Такого элемента нет в списке или список пуст", 1, 1500);
  568.         return;
  569.     }
  570.     worker *tmp = st, *tmp2;
  571.     if (i != 1)
  572.         for (int ii = 1; ii < i; ii++) {
  573.             tmp2 = tmp;
  574.             tmp = tmp->next;
  575.         }
  576.     worker tempzap = *tmp;
  577.     tempzap.next = NULL;
  578.     char mark[12];
  579.     for (int f = 0; f <= 11; f++) mark[f] = ' ';
  580.     int choise = 0;
  581.     while (true)
  582.     {
  583.         system("cls");
  584.         print(0);
  585.         print(2, tmp, i);
  586.         print(3);
  587.         mark[choise] = '>';
  588.         cout << "+-----------------------------------+" << endl;
  589.         cout << "Редактирование записи № " << i << endl;
  590.         cout << "+-----------------------------------+" << endl;
  591.         cout << mark[0] << " Таб. номер: " << tempzap.d.tab_num << endl;
  592.         cout << mark[1] << " ФИО: " << tempzap.d.fio << endl;
  593.         cout << mark[2] << " Год рождения: " << tempzap.d.god_rozhdeniya << endl;
  594.         cout << mark[3] << " Пол:" << tempzap.d.pol << endl;
  595.         cout << mark[4] << " Профессия: " << tempzap.d.professiya << endl;
  596.         cout << mark[5] << " Стаж: " << tempzap.d.staj_raboty << endl;
  597.         cout << mark[6] << " Разряд: " << tempzap.d.razryad << endl;
  598.         cout << mark[7] << " № цеха: " << tempzap.d.nomer_zeha << endl;
  599.         cout << mark[8] << " № участка: " << tempzap.d.nomer_uchastka << endl;
  600.         cout << mark[9] << " Сумма З.П.: " << tempzap.d.summa_zp << endl << endl;
  601.         cout << "+-----------------------------------+" << endl;
  602.         cout << mark[10] << " *Сохранить и выйти* " << endl;
  603.         cout << mark[11] << " *Отмена (Esc)* " << endl;
  604.         cout << "+-----------------------------------+" << endl;
  605.         int a;
  606.         do a = _getch();
  607.         while (a == 224);
  608.         switch ((int)a) {
  609.         case 80: {      //down
  610.             mark[choise] = ' ';
  611.             if (choise < 11) choise++;
  612.             else choise = 0;
  613.             break;
  614.         }
  615.         case 72: {      //up
  616.             mark[choise] = ' ';
  617.             if (choise > 0) choise--;
  618.             else choise = 11;
  619.             break;
  620.         }
  621.         case 13: {      //enter
  622.             cout << "Введите новое значение поля: " << endl;
  623.             switch (choise) {
  624.             case 0:
  625.                 cin >> tempzap.d.tab_num;
  626.                 while ((!cin) || (tempzap.d.tab_num <= 0) || (tempzap.d.tab_num > 999999)) {
  627.                     cin.ignore();
  628.                     input_clear();
  629.                     cout << "[ОШИБКА, повторите ввод]" << endl;
  630.                     cin >> tempzap.d.tab_num;
  631.                 }
  632.                 input_clear();
  633.                 break;
  634.  
  635.             case 1:
  636.                 cin >> tempzap.d.fio;
  637.                 while (!cin) {
  638.                     cin.ignore();
  639.                     input_clear();
  640.                     cout << "[ОШИБКА, повторите ввод]" << endl;
  641.                     cin >> tempzap.d.fio;
  642.                 }
  643.                 input_clear();
  644.                 break;
  645.  
  646.             case 2:
  647.                 cin >> tempzap.d.god_rozhdeniya;
  648.                 while ((!cin) || (tempzap.d.god_rozhdeniya < 0) || (tempzap.d.god_rozhdeniya > 2015)) {
  649.                     cin.ignore();
  650.                     input_clear();
  651.                     cout << "[ОШИБКА, повторите ввод]" << endl;
  652.                     cin >> tempzap.d.god_rozhdeniya;
  653.                 }
  654.                 input_clear();
  655.                 break;
  656.  
  657.             case 3:
  658.                 cin >> tempzap.d.pol;
  659.                 while ((!cin) || (tempzap.d.pol < 0) || (tempzap.d.pol > 1)) {
  660.                     cin.ignore();
  661.                     input_clear();
  662.                     cout << "[ОШИБКА, повторите ввод]" << endl;
  663.                     cin >> tempzap.d.pol;
  664.                 }
  665.                 input_clear();
  666.                 break;
  667.  
  668.             case 4:
  669.                 cin >> tempzap.d.professiya;
  670.                 while (!cin) {
  671.                     cin.ignore();
  672.                     input_clear();
  673.                     cout << "[ОШИБКА, повторите ввод]" << endl;
  674.                     cin >> tempzap.d.professiya;
  675.                 }
  676.                 input_clear();
  677.                 break;
  678.  
  679.             case 5:
  680.                 cin >> tempzap.d.staj_raboty;
  681.                 while ((!cin) || (tempzap.d.staj_raboty < 0) || (tempzap.d.staj_raboty > 100)) {
  682.                     cin.ignore();
  683.                     input_clear();
  684.                     cout << "[ОШИБКА, повторите ввод]" << endl;
  685.                     cin >> tempzap.d.staj_raboty;
  686.                 }
  687.                 input_clear();
  688.                 break;
  689.  
  690.             case 6:
  691.                 cin >> tempzap.d.razryad;
  692.                 while ((!cin) || (tempzap.d.razryad < 0) || (tempzap.d.razryad > 20)) {
  693.                     cin.ignore();
  694.                     input_clear();
  695.                     cout << "[ОШИБКА, повторите ввод]" << endl;
  696.                     cin >> tempzap.d.razryad;
  697.                 }
  698.                 input_clear();
  699.                 break;
  700.  
  701.             case 7:
  702.                 cin >> tempzap.d.nomer_zeha;
  703.                 while ((!cin) || (tempzap.d.nomer_zeha < 0) || (tempzap.d.nomer_zeha > 100)) {
  704.                     cin.ignore();
  705.                     input_clear();
  706.                     cout << "[ОШИБКА, повторите ввод]" << endl;
  707.                     cin >> tempzap.d.nomer_zeha;
  708.                 }
  709.                 input_clear();
  710.                 break;
  711.  
  712.             case 8:
  713.                 cin >> tempzap.d.nomer_uchastka;
  714.                 while ((!cin) || (tempzap.d.nomer_uchastka < 0) || (tempzap.d.nomer_uchastka > 100)) {
  715.                     cin.ignore();
  716.                     input_clear();
  717.                     cout << "[ОШИБКА, повторите ввод]" << endl;
  718.                     cin >> tempzap.d.nomer_uchastka;
  719.                 }
  720.                 input_clear();
  721.                 break;
  722.  
  723.             case 9:
  724.                 cin >> tempzap.d.summa_zp;
  725.                 while ((!cin) || (tempzap.d.summa_zp < 0) || (tempzap.d.summa_zp > 1000000)) {
  726.                     cin.ignore();
  727.                     input_clear();
  728.                     cout << "[ОШИБКА, повторите ввод]" << endl;
  729.                     cin >> tempzap.d.summa_zp;
  730.                 }
  731.                 input_clear();
  732.                 break;
  733.  
  734.             case 10:
  735.                 delzap(i, 1);
  736.                 addnew(tempzap);
  737.                 return;
  738.                 break;
  739.  
  740.             case 11: return;
  741.             default: msg("error", 1, 500);
  742.             }
  743.             break;
  744.         }
  745.         case 27: return; //esc
  746.         }
  747.  
  748.     }
  749. }
  750.  
  751. void save(string file, int s = 0) {
  752.     if (s == 0) {
  753.         msg("Сохранение базы данных...", 1, 0);
  754.         msg(file, 0, 500);
  755.     }
  756.     worker *tmp = st;
  757.     ofstream fout(file, ios::binary | ios::out);
  758.     if (!fout)
  759.     {
  760.         if (s == 0) msg("Не могу открыть файл для записи", -1, 1000);
  761.         return;
  762.     }
  763.     else
  764.     {
  765.         while (tmp)
  766.         {
  767.             fout.write((char*)&tmp->d, sizeof our_data);
  768.             tmp = tmp->next;
  769.         }
  770.         fout.close();
  771.         if (s == 0) msg("Успешное сохранение", 0, 1500);
  772.     }
  773.     return;
  774. }
  775.  
  776. void save_txt(char filetxt[30])
  777. {
  778.     msg("Сохранение базы данных", 1, 0);
  779.     msg("В текстовый файл", 0, 0);
  780.     msg(filetxt, 0, 1000);
  781.  
  782.     if (!st)
  783.     {
  784.         msg("Список пустой, записывать нечего!", 1, 1000);
  785.         _getch();
  786.     }
  787.     else
  788.     {
  789.         FILE *f;
  790.         fopen_s(&f, filetxt, "w");
  791.         rewind(f);
  792.         char buf[30];
  793.         int count = 1;
  794.         worker *tmp = st;
  795.  
  796.         fprintf(f, "+-----------------------------------------------------------------------------------------------------------------+\n");
  797.         fprintf(f, "| № | Таб. № |              ФИО              | Год р.| Пол | Профессия | Стаж | Разряд | цех № | № уч.| Сумма З.П.|\n");
  798.         fprintf(f, "+-----------------------------------------------------------------------------------------------------------------+\n");
  799.         while (1)
  800.         {
  801.             fprintf(f, "|%2d | %-6d | %-29s | %-5d |%4d |%10s |%5d |%7d |%6d |%5d |%10d |\n", count, tmp->d.tab_num, tmp->d.fio, tmp->d.god_rozhdeniya, tmp->d.pol, tmp->d.professiya, tmp->d.staj_raboty, tmp->d.razryad, tmp->d.nomer_zeha, tmp->d.nomer_uchastka, tmp->d.summa_zp);
  802.             if (tmp == en)
  803.             {
  804.                 fprintf(f, "+-----------------------------------------------------------------------------------------------------------------+\n");
  805.                 break;
  806.             }
  807.             count++;
  808.             tmp = tmp->next;
  809.         }
  810.         fclose(f);
  811.     }
  812. }
  813.  
  814. void save_exit(int ss) {
  815.     if (ss == 0)
  816.     {
  817.         msg("Выход", 1, 1000);
  818.         return;
  819.     }
  820.     else if (ss == 1)
  821.     {
  822.         msg("Список был изменен", 1, 500);
  823.         save(file);
  824.         return;
  825.     }
  826.     else if (ss == 2)
  827.     {
  828.         msg("Список был очищен", 1, 500);
  829.         return;
  830.     }
  831. }
  832.  
  833. void process(char filereport[30], int k = 0) {
  834.     system("TITLE Отчет");//заголовок консоли
  835.     system("cls");
  836.     system("color B0");
  837.  
  838.     FILE *f;
  839.     fopen_s(&f, filereport, "w");
  840.     rewind(f);
  841.  
  842.     worker* tmp = st;
  843.     char strtmp[87];
  844.     char buf[30];
  845.     int r1 = 0, r2 = 0, r3 = 0, t = 0, sti = 0, fini = 0;
  846.     float mp = 0, wp = 0;
  847.     cout << "Сохранить отчет в файл? (1/0): ";
  848.     cin >> k;
  849.     while ((!cin) || (k < 0) || (k > 1)) {
  850.         cin.ignore();
  851.         cin.clear();
  852.         fflush(stdin);
  853.         cout << "[ОШИБКА, повторите ввод]" << endl;
  854.         cin >> k;
  855.     }
  856.     system("cls");
  857.     if (k == 1)
  858.     {
  859.         fputs("+---------+--------------------------------+-------+\n", f);
  860.         fputs("|         | Количество рабочих по разрядам |       |\n", f);
  861.         fputs("|  Стаж   |----------+----------+----------| Всего |\n", f);
  862.         fputs("|         |     1    |     2    |     3    |       |\n", f);
  863.         fputs("+---------+----------+----------+----------+-------+\n", f);
  864.     }
  865.     cout << "+---------+--------------------------------+-------+\n";
  866.     cout << "|         | Количество рабочих по разрядам |       |\n";
  867.     cout << "|  Стаж   |----------+----------+----------| Всего |\n";
  868.     cout << "|         |     1    |     2    |     3    |       |\n";
  869.     cout << "+---------+----------+----------+----------+-------+\n";
  870.     for (int s = 0; s <= 25; s += 5)
  871.     {
  872.         sti = s + 1;
  873.         if (s == 0)
  874.             sti = 0;
  875.         fini = s + 6;
  876.         if (s == 25)
  877.             fini = 100;
  878.         tmp = st;
  879.         while (tmp != NULL)
  880.         {
  881.             if ((tmp->d.staj_raboty >= sti) && (tmp->d.staj_raboty <= fini))
  882.             {
  883.                 if (tmp->d.razryad == 1) r1++;
  884.                 if (tmp->d.razryad == 2) r2++;
  885.                 if (tmp->d.razryad == 3) r3++;
  886.             }
  887.             tmp = tmp->next;
  888.         }
  889.         t = r1 + r2 + r3;
  890.         if (t > 0)
  891.         {
  892.             printf("| %2d - %2d | %8d | %8d | %8d | %5d |\n", sti, fini, r1, r2, r3, t);
  893.             cout << "+---------+----------+----------+----------+-------+\n";
  894.             if (k == 1)
  895.             {
  896.                 fprintf(f, "| %2d - %2d | %8d | %8d | %8d | %5d |\n", sti, fini, r1, r2, r3, t);
  897.                 fprintf(f, "+---------+----------+----------+----------+-------+\n");
  898.             }
  899.         }
  900.         r1 = 0; r2 = 0; r3 = 0; t = 0;
  901.     }
  902.     if (k == 1)
  903.         fclose(f);
  904.     system("pause");
  905.     return;
  906. }
  907.  
  908.  
  909. void backup()
  910. {
  911.     save("backup.bin", 1);
  912.     msg("Backup создан", 1, 0);
  913.     msg("Файл: backup.bin", 0, 500);
  914. }
  915.  
  916. int search()
  917. {
  918.     system("TITLE Поиск элементов ");//заголовок консоли
  919.     worker* tmp = st;
  920.     int count = 0;
  921.     int ret = 0;
  922.     cout << "Поиск" << endl;
  923.     worker in = scan(1);
  924.     print(0);
  925.     while (tmp != NULL)
  926.     {
  927.         count++;
  928.         if (strcmp(tmp->d.fio, in.d.fio) == 0)
  929.         {
  930.             ret = count;
  931.             print(2, tmp, count);
  932.         }
  933.         tmp = tmp->next;
  934.     }
  935.     if (ret == 0)
  936.         cout << "| * |                                      ---== элементов не найдено ==---                                     * |" << endl;
  937.     print(4);
  938.     return ret;
  939.     // 0 - было найдено более 1й записи с заданными параметрами
  940. }
  941.  
  942. void changefile()
  943. {
  944.     int key = 0;
  945.     system("cls");
  946.     cout << "+-----------------------------------+" << endl;
  947.     cout << "| 1 - File:       " << file << endl;
  948.     cout << "| 2 - FileTXT:    " << filetxt << endl;
  949.     cout << "| 3 - FileReport: " << filereport << endl;
  950.     cout << "+-----------------------------------+" << endl;
  951.     cout << "Введите номер файла для изменения (0 для отмены):";
  952.     cin >> key;
  953.     switch (key)
  954.     {
  955.     case 1:
  956.         cout << "Введите новое имя File: ";
  957.         cin >> file;
  958.         while (!cin) {
  959.             cin.ignore();
  960.             cin.clear();
  961.             fflush(stdin);
  962.             cout << "[ОШИБКА, повторите ввод]" << endl;
  963.             cin >> file;
  964.             cout << endl;
  965.         }
  966.         key = 0;
  967.         break;
  968.     case 2:
  969.         cout << "Введите новое имя FileTXT: ";
  970.         cin >> filetxt;
  971.         while (!cin) {
  972.             cin.ignore();
  973.             cin.clear();
  974.             fflush(stdin);
  975.             cout << "[ОШИБКА, повторите ввод]" << endl;
  976.             cin >> filetxt;
  977.             cout << endl;
  978.         }
  979.         break;
  980.     case 3:
  981.         cout << "Введите новое имя FileReport: ";
  982.         cin >> filereport;
  983.         while (!cin) {
  984.             cin.ignore();
  985.             cin.clear();
  986.             fflush(stdin);
  987.             cout << "[ОШИБКА, повторите ввод]" << endl;
  988.             cin >> filereport;
  989.             cout << endl;
  990.         }
  991.         break;
  992.     case 0: return;
  993.     }
  994.     if (key == 0)
  995.     {
  996.         system("cls");
  997.         cout << "+------------------------------------------+" << endl;
  998.         cout << "| Очистить список и считать данные заново? |" << endl;
  999.         cout << "| Enter для продолжения или ESC для отмены |" << endl;
  1000.         cout << "+------------------------------------------+" << endl;
  1001.         key = _getch();
  1002.         if (key == 13)
  1003.         {
  1004.             worker *temp;
  1005.             if (st != NULL)
  1006.                 while (1)
  1007.                 {
  1008.                     temp = st;
  1009.                     st = st->next;
  1010.                     delete temp;
  1011.                     if (st == NULL) break;
  1012.                 };
  1013.             en = NULL;
  1014.             cout << "Список очищен." << endl;
  1015.             cout << "+-----------------------------------+" << endl;
  1016.             read();
  1017.             cout << "Файл считан." << endl;
  1018.             cout << "+-----------------------------------+" << endl;
  1019.             Sleep(1000);
  1020.         }
  1021.         else return;
  1022.     }
  1023.     system("pause");
  1024. }
  1025.  
  1026. int main_menu()
  1027. {
  1028.     system("TITLE Главное меню: КП АиП © Лина Соколова 2018");//заголовок консоли
  1029.     system("color F0");
  1030.     int c = 1;
  1031.     string mark[12];
  1032.     for (int f = 0; f <= 11; f++) mark[f] = "  ";
  1033.  
  1034.     while (1) {
  1035.         system("cls");
  1036.         mark[c] = "[>";
  1037.         cout << "+-+-----------------------------------+" << endl;
  1038.         cout << "| |    В списке записей:   " << setw(7) << zcount << "    |" << endl;
  1039.         cout << "+-+-----------------------------------+" << endl;
  1040.         cout << "| |               Меню                |" << endl;
  1041.         cout << "+-+-----------------------------------+" << endl;
  1042.         cout << mark[1] << "|  1-Начаьное создание списка       |" << endl;
  1043.         cout << mark[2] << "|  2-Просмотр записей               |" << endl;
  1044.         cout << mark[3] << "|  3-Добавление записи              |" << endl;
  1045.         cout << mark[4] << "|  4-Удаление записи                |" << endl;
  1046.         cout << mark[5] << "|  5-Редактирование записи          |" << endl;
  1047.         cout << mark[6] << "|  6-Поиск элементов                |" << endl;
  1048.         cout << mark[7] << "|  7-Сохранение                     |" << endl;
  1049.         cout << mark[8] << "|  8-Сохранение в текстовый файл    |" << endl;
  1050.         cout << mark[9] << "|  9-Обработка таблицы (отчет)      |" << endl;
  1051.         cout << mark[10] << "| 10-Очистка списка                 |" << endl;
  1052.         cout << mark[11] << "|  0-Выход (Esc)                    |" << endl;
  1053.         cout << "+-+-----------------------------------+\n";
  1054.         cout << "| Tab - Изменить файлы ввода/вывода   |" << endl;
  1055.         cout << "+-------------------------------------+\n";
  1056.  
  1057.         int a;
  1058.         do a = _getch();
  1059.         while (a == 224);
  1060.         switch ((int)a) {
  1061.         case 80: {
  1062.             mark[c] = "  ";
  1063.             if (c < 11) c++;
  1064.             else c = 1;
  1065.             break;
  1066.         }
  1067.         case 72: {
  1068.             mark[c] = "  ";
  1069.             if (c > 1) c--;
  1070.             else c = 11;
  1071.             break;
  1072.         }
  1073.         case 13: {
  1074.             return c;
  1075.             break;
  1076.         }
  1077.         case 115: return 115;       //s
  1078.         case 9: return 88; break;   //tab
  1079.         case 27: return 99; break;  //esc
  1080.         default: cout << "main got symbol: " << a << endl; Sleep(1000);
  1081.         }
  1082.     }
  1083. }
  1084.  
  1085. int main()
  1086. {
  1087.     system("mode con lines=30 cols=120");
  1088.     system("color F0");
  1089.     setlocale(LC_ALL, "rus");
  1090.     SetConsoleCP(1251);
  1091.     SetConsoleOutputCP(1251);
  1092.  
  1093.     read();
  1094.     backup();
  1095.  
  1096.     int mod = 0;            //флаг изменения списка
  1097.     while (1)
  1098.     {
  1099.         switch (main_menu())
  1100.         {
  1101.         case 0: return 0;
  1102.         case 1: create(); mod = 1; break;
  1103.         case 2: view(); break;
  1104.         case 3: addnew(scan()); mod = 1; break;
  1105.         case 4: delzap(); mod = 1; break;
  1106.         case 5: correct(); mod = 1; break;
  1107.         case 6: search(); break;
  1108.         case 7: save(file); mod = 0; break;
  1109.         case 8: save_txt(filetxt); break;
  1110.         case 9: process(filereport); break;
  1111.         case 10: if (delall() == 1) mod = 2; break;
  1112.         case 11: save_exit(mod);  return 0; break;
  1113.         case 115: sort(); mod = 1; break;
  1114.         case 88: changefile(); break;
  1115.         case 99: save_exit(mod); return 0;
  1116.         default: {cout << "main получил неизвестный символ " << endl; Sleep(1000); }
  1117.         }
  1118.     }
  1119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement