Advertisement
MARSHAL327

Untitled

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