Advertisement
MARSHAL327

Untitled

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