Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <fstream>
- #include <string>
- #include <windows.h>
- #include <conio.h>
- #include <stdio.h>
- #include <cwchar>
- #include <winuser.h>
- #include <tchar.h>
- using namespace std;
- /*---КОНСТАНТЫ---*/
- const int N_item = 9; // элементы в меню
- const int fitem = 3; // элементы в файловом подменю
- const int titem = 3; // элементы в меню обработки
- const int dat = 10; // поля
- const int ydelta = 2;
- const int xdelta = 15;
- const int tk = 5; // записи на странице
- const char* MENU[N_item] = { "Просмотр таблицы","Создание таблицы","Добавление новой записи",
- "Удаление записи","Корректировка записи","Сортировка таблицы","Сохранение таблицы в текстовом файле","Обраюотка таблицы","Выход" };
- const char* FMENU[fitem] = { "Считываеие с консоли","Считывание с бинарного файла",
- "Считывание с текстового файла" };
- const char* DATAI[dat] = { "№ Зачётной книжки студента.","ФИО.","шифр группы","Пол.","Форма обучения.","Оценки за последнюю сессию.","Даты сдачи экзаменов." };
- const char* TMENU[titem] = { "Формирование выходной таблицы", "Просмотр выходной таблицы","Запись выходной таблицы в файл" };
- /*---------------------------------------СТРУКТУРЫ И ПЕРЕМЕННЫЕ----------------------------------*/
- struct record { //информация
- int num, mark[4];
- char fio[30], sex, gr[6], forma[20];
- int d, m, y;
- };
- struct info { // информация выходного списка
- int num;
- int n_male, n_fem;
- float s_male, s_female;
- char forma[20];
- };
- struct table { // Структура выходного списка
- info inf;
- table* next, * pre;
- };
- struct stud { // структура входного списка
- record info;
- stud* next, * pre;
- };
- /*---указатели на начало и конец списка---*/
- table* b = 0, * e = 0;
- stud* beg = 0;
- stud* last = 0;
- stud* temp = 0; // промежуточные данные
- char filename[25], srch[50]; // имя файла и искомая запись
- int active = 7, uactive = 1, font = 8; // цвета фона и шрифта
- int pre = 0, now = 0, key, ix = 0; // вспомогательыне переменные
- HANDLE hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); //потоковая переменная
- COORD Pos; // координаты курсора
- /*--------------------------------------------ПРОТОТИПЫ ФУНКЦИЙ-------------------------------------*/
- void write_txt(stud* beg, stud* last, char filename[]); // запись в текстовый файл
- void write_bin(stud* beg, stud* last, char filename[]); // запись в бинарный файл
- record table_data(); // ввод данных с консоли
- void add_elem(stud*& beg, stud*& last, const record* temp); // добавление элемента
- void console_add(stud*& beg, stud*& last); // цикл ввода данных с консоли
- void print(stud* beg, stud* last); // // вывод исходного списка
- stud* pagep(stud* temp); // вывод страницы исходного списка
- void read_txt(stud*& beg, stud*& last, char filename[]); // считывание с текстового файла
- void read_bin(stud*& beg, stud*& last, char filename[]); // считывание с бинарного файла
- stud* search(stud* beg, char jkl[50]); // поиск элемента
- int del_el(stud*& beg, stud*& last, stud*& del); // удаление элемента
- void sort(stud*& beg, stud*& last); // сортировка
- void f_memory(stud*& beg, stud*& last); // освобождение памяти от исходного списка
- void correct(stud* wrong); // корректирование записи
- void filet(); // Функция вывода подменю выбора заполнения списка
- void choisemenu(); // Функция выбора действия из основного меню.
- void tablemenu(); // Функция вывода подменю выбора действий с выходным списком.
- void drawitem(int item, char* array, int white); // вывод элемента меню
- void initmenu(int val, char* array[]); // инициализация меню
- void filltable(table*& beg, table*& last, stud* b); // Функция вывода выходного списка на экран
- void out_print(table* beg, table* last); // Функция вывода одной страницы выходного списка.
- table* out_pagep(table* temp); // вывод выходной таблицы
- void outpfile(table* beg, char filename[]); // печать выходной таблицы в файл
- void ouf_memory(table*& beg, table*& last); // освобождение памяти от выходного списка
- int confirm(char* message); // Функция подтверждения выбора
- enum ConsoleColor {
- Black = 0,
- Blue = 1,
- Green = 2,
- Cyan = 3,
- Red = 4,
- Magenta = 5,
- Brown = 6,
- LightGray = 7,
- DarkGray = 8,
- LightBlue = 9,
- LightGreen = 10,
- LightCyan = 11,
- LightRed = 12,
- LightMagenta = 13,
- Yellow = 14,
- White = 15
- };
- /*----------------------------------ОСНОВНАЯ ПРОГРАММА---------------------------------*/
- int main()
- {
- system("color 0B");
- initmenu(N_item, (char**)MENU); // инициализация меню
- while (!ix) { // основное меню программы, пока не нужно завершить работу
- key = getch();
- if (key == 0)
- key = cin.get();
- switch (key) {
- case 13:
- choisemenu();
- break;
- case 73:
- case 72:
- pre = now;
- if (now == 0)
- now = N_item - 1;
- else
- now--;
- break;
- // вверх в меню
- case 81:
- case 80:
- pre = now;
- if (now == N_item - 1)
- now = 0;
- else
- now++;
- break;
- // вниз в меню
- }
- system("color 0B");
- drawitem(pre + 1, (char*)MENU[pre], uactive); //вывод элемента
- drawitem(now + 1, (char*)MENU[now], active); //вывод элемента
- } // конец вывода основного меню программы
- return 0;
- }
- /*---------------------------------------ПОДПРОГРАММЫ----------------------------------*/
- void write_txt(stud* beg, stud* last, char filename[])
- { // запись исходной таблицы в текстовый файл
- FILE* FI = fopen(filename, "w");
- stud* temp = beg;
- int i;
- if (!FI) {
- cout << "Проблема с открытием файла." << endl;
- return;
- }
- while (temp != last) {
- fprintf(FI, "%d\n%s\n%d\n%s\n%c\n%d\n%d\n", temp->info.num,
- temp->info.fio, temp->info.gr, temp->info.forma, temp->info.sex, temp->info.mark, temp->info.d, temp->info.m, temp->info.y);
- temp = temp->next;
- }
- if (temp) {
- fprintf(FI, "%d\n%s\n%d\n%s\n%c\n%d\n%d\n", temp->info.num,
- temp->info.fio, temp->info.gr, temp->info.forma, temp->info.sex, temp->info.mark, temp->info.d, temp->info.m, temp->info.y);
- i = temp->info.num;
- temp->info.num = 999;
- fprintf(FI, "%d\n%s\n%d\n%s\n%c\n%d\n%d\n", temp->info.num,
- temp->info.fio, temp->info.gr, temp->info.forma, temp->info.sex, temp->info.mark, temp->info.d, temp->info.m, temp->info.y);
- }
- fclose(FI);
- }
- void write_bin(stud* beg, stud* last, char filename[])
- {// запись исходной таблицы в бинарный файл
- FILE* FB = fopen(filename, "w+b");
- stud* temp = beg;
- int i;
- while (temp != last) {
- fwrite(&temp->info, sizeof(record), 1, FB);
- cout << temp->info.num;
- temp = temp->next;
- }
- if (temp) {
- fwrite(&temp->info, sizeof(record), 1, FB);
- i = temp->info.num;
- temp->info.num = 999;
- fwrite(&temp->info, sizeof(record), 1, FB);
- temp->info.num = i;
- }
- fclose(FB);
- }
- record table_data() { // Запись данных с консоли
- record temp;
- cin.ignore();
- cin.clear();
- cout << "Введите номер зачётной книжки." << endl;
- cin >> temp.num;
- cout << temp.num;
- cout << "Введите ФИО." << endl;
- cin.get();
- cin.getline(temp.fio, 30);
- cout << temp.fio;
- cout << "Введите шифр группы." << endl;
- cin.getline(temp.gr, 6);
- cout << "Введите форму обучения." << endl;
- cin.get();
- cin >> temp.forma;
- cout << "Введите пол: 0 - мужской 1 - женский." << endl;
- cin >> temp.sex;
- cout << "Введите оценки за полследнюю сессию." << endl;
- for (int i = 0; i < 5; i++) {
- cin >> temp.mark[i];
- }
- cout << "Введите даты сдачи экзаменов." << endl;
- cin >> temp.d >> temp.m >> temp.y;
- return temp;
- }
- void add_elem(stud*& beg, stud*& last, const record* temp)
- { // Добавление одного элемента
- if (beg)
- if (beg == last) {
- beg->next = new stud;
- last = beg->next;
- last->info = *temp;
- last->pre = beg;
- last->next = 0;
- }
- else {
- last->next = new stud;
- last->next->pre = last;
- last->next->next = 0;
- last = last->next;
- last->info = *temp;
- }
- else {
- beg = new stud;
- last = beg;
- beg->next = beg->pre = 0;
- beg->info = *temp;
- }
- };
- void console_add(stud*& beg, stud*& last)
- { // добавление данных с консоли
- int num_el;
- record t;
- cout << "Введите количество записей, которые вы хотите добавить.";
- cin >> num_el;
- num_el = fabs(num_el);
- while (num_el) {
- t = table_data();
- add_elem(beg, last, &t);
- system("cls");
- num_el--;
- }
- };
- void print(stud* beg, stud* last)
- { // вывод данных(Просмотр)
- stud* k = beg, * pn;
- int i;
- while (k) {
- pagep(k);
- k = k->next;
- }
- /*while (!ix) {
- pn = k;
- k = pagep(k);
- key = getch();
- if (key == 0)
- key = cin.get();
- switch (key) {
- case 13:
- return;
- break;
- case 73:
- case 72:
- k = pn;
- for (i=tk; i != 0 && (k); i--)
- k = k->pre;
- if (!k)
- k = beg;
- break; // вверх в меню
- case 81:
- case 80:
- if (!k)
- k = pn;
- break; // вниз в меню
- default:
- k = pn;
- break;
- }
- }*/
- };
- stud* pagep(stud* temp)
- { // вывод страницы
- system("cls");
- int i = tk;
- cout << setw(80) << "______________________________________________________________________________________________________________________________ \n";
- cout << setw(4) << "|№ Зачётной книжки |" <<
- setw(30) << " Фамилия Имя Отчество|" <<
- setw(11) << "Шифр группы|" <<
- setw(5) << "Форма обучения|" <<
- setw(7) << "Пол|" <<
- setw(5) << "Оценки за последнюю сессию |" <<
- setw(9) << "Даты экзаменов |\n" <<
- setw(80) << "|______________________________________________________________________________________________________________________________|\n";
- while (temp && i) {
- cout << setw(4) << "|" << setw(2) << temp->info.num << setw(1) << "|";
- cout << setw(29) << temp->info.fio << setw(1) << "|";
- cout << setw(10) << temp->info.gr << setw(1) << "|";
- cout << setw(4) << temp->info.forma << setw(1) << "|";
- cout << setw(6) << temp->info.sex << setw(1) << "|";
- cout << setw(4) << temp->info.mark << setw(1) << "|";
- cout << setw(8) << temp->info.d << temp->info.m << temp->info.y << setw(1) << "|";
- cout << setw(80) << "|_______________________________________________________________________________________________________________________________|";
- temp = temp->next;
- i--;
- }
- cout << "Для выхода нажмите Enter" << endl;
- cout << "Для перемещения по списку используйте кнопки вверх и вниз" << endl;
- return temp;
- }
- void read_txt(stud*& beg, stud*& last, char filename[])
- { // считывание таблицы с исходного файла
- FILE* txt;
- record temp;
- txt = fopen(filename, "r");
- if (!txt) {
- cout << "Проблема с открытием файла." << endl;
- return;
- }
- while (1) {
- fscanf(txt, "%d\n ", &temp.num);
- if (temp.num != 999) {
- fscanf(txt, "%s\n ", temp.fio);
- fscanf(txt, "%d\n ", &temp.gr);
- fscanf(txt, "%s\n ", temp.forma);
- fscanf(txt, "%c\n ", &temp.sex);
- fscanf(txt, "%d\n ", &temp.mark);
- fscanf(txt, "%d\n ", &temp.d);
- fscanf(txt, "%d\n ", &temp.m);
- fscanf(txt, "%d\n ", &temp.y);
- add_elem(beg, last, &temp);
- }
- else
- break;
- }
- fclose(txt);
- cout << "Данные считаны" << endl;
- Sleep(500);
- };
- void read_bin(stud*& beg, stud*& last, char filename[])
- { // считывание таблицы с бинарного файла
- record temp;
- FILE* bin;
- bin = fopen(filename, "r+b");
- if (!bin) {
- cout << "Проблема с открытием файла." << endl;
- Sleep(500);
- return;
- }
- while (1) {
- fread(&temp, sizeof(record), 1, bin);
- if (temp.num != 999) {
- add_elem(beg, last, &
- temp);
- }
- else
- break;
- }
- fclose(bin);
- cout << "Данные считаны" << endl;
- Sleep(500);
- }
- stud* search(stud* beg, char jkl[50])
- { // поиск элемента
- stud* temp = beg;
- while (temp) {
- if (strcmp(temp->info.fio, jkl) == 0)
- return temp;
- else
- temp = temp->next;
- }
- return 0;
- };
- int del_el(stud*& beg, stud*& last, stud*& del)
- { // Удаление элемента
- if (del) {
- if (del == beg) {
- if (del == last) {
- delete del;
- last = beg = 0;
- return 1;
- }
- else {
- beg = beg->next;
- beg->pre = 0;
- delete del;
- return 1;
- }
- }
- else {
- if (del == last) {
- last = last->pre;
- last->next = 0;
- delete del;
- return 1;
- }
- else {
- del->next->pre = del->pre;
- del->pre->next = del->next;
- delete del;
- return 1;
- }
- }
- }
- return 0;
- };
- void sort(stud*& beg, stud*& last)
- {// Сортировка методом пузырька
- stud* temp = beg, * tempr = beg, * back = last->pre;
- record d_data;
- while ((temp != last) && temp) {
- tempr = beg;
- while (tempr != back->next) {
- if (tempr->info.num > tempr->next->info.num) {
- d_data = tempr->info;
- tempr->info = tempr->next->info;
- tempr->next->info = d_data;
- }
- tempr = tempr->next;
- }
- back = back->pre;
- temp = temp->next;
- }
- };
- void f_memory(stud*& beg, stud*& last)
- {// освобождение памяти
- stud* temp = beg, * temp2;
- while (temp) {
- temp2 = temp->next;
- delete temp;
- temp = temp2;
- }
- };
- void correct(stud* wrong)
- { // корректировка полей элемента
- int pre = 0, now = 0, key = 0;
- Pos.X = 20;
- Pos.Y = 1;
- system("cls");
- system("color 0B");
- SetConsoleCursorPosition(hConsoleHandle, Pos);
- if (!wrong) {
- cout << "Нет искомого элемента";
- Sleep(500);
- return;
- }
- cout << "Выберите поле:";
- initmenu(dat, (char**)DATAI);
- Pos.Y = ydelta * 11;
- Pos.X = 0;
- SetConsoleCursorPosition(hConsoleHandle, Pos);
- cout << "№ Зачётной книжки: " << wrong->info.num;
- cout << " ФИО: " << (char*)wrong->info.fio;
- cout << " Шифр группы: " << wrong->info.gr << endl;
- cout << "Форма обучения: " << wrong->info.forma;
- cout << "Пол: ";
- if (!wrong->info.sex)
- cout << "муж" << endl;
- else
- cout << "жен" << endl;
- cout << "Оценки за последнюю сессию: " << wrong->info.mark << endl;
- cout << "Даты экзаменов: " << wrong->info.d << wrong->info.m << wrong->info.y;
- while (1) {
- key = getch();
- if (key == 0)
- key = cin.get();
- switch (key) {
- case 13:
- system("cls");
- switch (now) {
- case 0:
- cout << "№ Зачётной книжки." << endl;
- cin >> wrong->info.num;
- return;
- case 1:
- cout << "Введите ФИО." << endl;
- cin.getline(wrong->info.fio, 30);
- return;
- case 2:
- cout << "Введите шифр группы." << endl;
- cin >> wrong->info.gr;
- return;
- case 3:
- cout << "Введите форму обучения." << endl;
- cin.getline(wrong->info.forma, 20);
- return;
- case 4:
- cout << "Выберите пол: 0 - мужской 1 - женский." << endl;
- cin >> wrong->info.sex;
- return;
- case 5:
- cout << "Введите оценки за последнюю сессию." << endl;
- cin >> wrong->info.mark[5];
- return;
- case 6:
- cout << "Введите даты экзаменов." << endl;
- cin >> wrong->info.d >> wrong->info.m >> wrong->info.y;
- return;
- }
- break;
- case 73:
- case 72:
- pre = now;
- if (now == 0)
- now = dat - 1;
- else
- now--;
- break;
- // вверх в меню
- case 81:
- case 80:
- pre = now;
- if (now == dat - 1)
- now = 0;
- else
- now++;
- break;
- // вниз в меню
- }
- system("color 0B");
- drawitem(pre + 1, (char*)DATAI[pre], uactive);
- drawitem(now + 1, (char*)DATAI[now], active);
- }
- return;
- }
- void filet()
- {//вывод подменю выбора заполнения списка
- while (1) { // вывод подменю
- key = getch();
- if (key == 0)
- key = cin.get();
- switch (key) {
- case 13: // выбор пункта меню
- system("color 0B");
- switch (now) {
- case 0:
- system("cls");
- console_add(beg, last);
- return;
- case 1:
- system("cls");
- cout << "Введите имя файла (с расширением)";
- cin >> filename;
- read_bin(beg, last, filename);
- return;
- case 2:
- system("cls");
- cout << "Введите имя файла (с расширением)";
- cin >> filename;
- read_txt(beg, last, filename);
- return;
- }
- break;
- case 73:
- case 72:
- pre = now;
- if (now == 0)
- now = fitem - 1;
- else
- now--;
- break;
- // вверх в меню
- case 81:
- case 80:
- pre = now;
- if (now == fitem - 1)
- now = 0;
- else
- now++;
- break;
- // вниз в меню
- }
- drawitem(pre + 1, (char*)FMENU[pre], uactive);
- drawitem(now + 1, (char*)FMENU[now], active);
- }
- }
- void choisemenu()
- {//выбор действия из основного меню
- switch (now) {
- case 0: // печать таблицы
- system("cls");
- system("color 0B");
- print(beg, last);
- cin.get();
- break;
- case 1: // запись в файл
- system("cls");
- if (confirm((char*)"Вы хотите очистить список, перед его новым заполнением? Enter - да, Esc - нет."))
- f_memory(beg, last);
- system("cls");
- pre = 0;
- now = 0;
- system("color 0B");
- initmenu(fitem, (char**)FMENU);
- filet();
- system("cls");
- pre = 0;
- now = 0;
- break;
- case 2:
- system("cls");
- system("color 0B");
- console_add(beg, last);
- break;
- case 3:
- system("cls");
- if (!confirm((char*)"Вы уверены, что хотите удалить элемент. Enter - да, Esc - нет."))
- break;
- system("cls");
- system("color 0B");
- cout << "Введите искомое ФИО.";
- cin.getline(srch, 50);
- temp = search(beg, srch);
- if (del_el(beg, last, temp))
- cout << "Удаление выполнено успешно." << endl;
- else
- cout << "Элемент не был удален.";
- cout << "Для продолжения нажмите Enter" << endl;
- cin.get();
- break;
- case 4:
- system("cls");
- system("color 0B");
- cout << "Введите искомое ФИО.";
- cin.getline(srch, 50);
- cout << srch;
- correct(search(beg, srch));
- cin.get();
- break;
- case 5:
- system("cls");
- system("color 0B");
- if (!beg) {
- cout << "Список пуст.";
- cout << "Для продолжения нажмите Enter " << endl;
- cin.get();
- break;
- }
- cout << "Производится сортировка по номеру зачётной книжки.";
- sort(beg, last);
- print(beg, last);
- cout << "Сортировка завершена.";
- cout << "Для продолжения нажмите Enter" << endl;
- cin.get();
- break;
- case 6:
- system("cls");
- system("color 0B");
- cout << "Введите имя файла расширением)";
- cin >> filename;
- write_txt(beg, last, filename);
- cin.get();
- break;
- case 7:
- system("cls");
- system("color 0B");
- initmenu(titem, (char**)TMENU);
- tablemenu();
- system("cls");
- pre = 0;
- now = 0;
- break;
- case 8:
- system("cls");
- system("color 0B");
- cout << "Введите имя бинарного файла(с расширением).";
- cin >> filename;
- write_bin(beg, last, filename); // запись исходной таблицы в бинарный файл происходит автоматически, после закрытия программы
- f_memory(beg, last);
- ouf_memory(b, e);
- ix = 1;
- }
- system("cls");
- pre = 0;
- now = 0;
- if (!ix)
- initmenu(N_item, (char**)MENU);
- return;
- }
- void tablemenu()
- {//вывод подменю выбора действий с выходным списком
- int pre = 0, now = 0;
- while (1) {
- key = getch();
- if (key == 0)
- key = cin.get();
- switch (key) {
- case 13:
- switch (now) {
- case 0:
- ouf_memory(b, e);
- filltable(b, e, beg);
- cout << "Для выхода нажмите Enter" << endl;
- cin.get();
- return;
- case 1:
- out_print(b, e);
- return;
- case 2:
- cout << "Введите имя файла (с расширением)";
- cin >> filename;
- outpfile(b, filename);
- return;
- }
- return;
- case 73:
- case 72:
- pre = now;
- if (now == 0)
- now = titem - 1;
- else
- now--;
- break;
- // вверх в меню
- case 81:
- case 80:
- pre = now;
- if (now == titem - 1)
- now = 0;
- else
- now++;
- break;
- // вниз в меню
- }
- drawitem(pre + 1, (char*)TMENU[pre], uactive);
- drawitem(now + 1, (char*)TMENU[now], active);
- }
- }
- void initmenu(int val, char* array[])
- { // инициализация меню
- int i;
- drawitem(1, (char*)array[0], active);
- Sleep(150);
- for (i = 1; i < val; i++) {
- drawitem(i + 1, (char*)array[i], uactive);
- Sleep(150);
- }
- }
- void drawitem(int item, char* array, int DarkGray)
- { // вывод элемента меню
- Pos.Y = ydelta * item;
- Pos.X = xdelta;
- SetConsoleCursorPosition(hConsoleHandle, Pos);
- SetConsoleTextAttribute(hConsoleHandle, (WORD)((DarkGray << 4) | White));
- cout << array << endl;
- }
- void filltable(table*& beg, table*& last, stud* b)
- { // заполнение таблицы
- //int* num_male = new int[6]{0};
- // int num_male[6]{0,0,0,0,0,0};
- int num_male[6] = { 0 };
- int num_female[6] = { 0 };
- stud* temp = b;
- while (temp) {
- //Расчёт среднего балла
- int sum = 0;
- for (int i = 0; i < 5; i++) {
- sum += temp->info.mark[i];
- }
- float sred = sum / 5;
- if (sred < 60 && temp->info.sex == '0')
- {
- num_male[0]++;
- }
- if (sred >= 60 && sred < 63 && temp->info.sex == '0')
- {
- num_male[1]++;
- }
- if (sred >= 64 && sred < 73 && temp->info.sex == '0')
- {
- num_male[2]++;
- }
- if (sred >= 74 && sred < 81 && temp->info.sex == '0')
- {
- num_male[3]++;
- }
- if (sred >= 81 && sred < 89 && temp->info.sex == '0')
- {
- num_male[4]++;
- }
- if (sred >= 90 && sred < 100 && temp->info.sex == '0')
- {
- num_male[5]++;
- }
- if (sred < 60 && temp->info.sex == '1')
- {
- num_female[0]++;
- }
- if (sred >= 60 && sred < 63 && temp->info.sex == '1')
- {
- num_female[1]++;
- }
- if (sred >= 64 && sred < 73 && temp->info.sex == '1')
- {
- num_female[2]++;
- }
- if (sred >= 74 && sred < 81 && temp->info.sex == '1')
- {
- num_female[3]++;
- }
- if (sred >= 81 && sred < 89 && temp->info.sex == '1')
- {
- num_female[4]++;
- }
- if (sred >= 90 && sred < 100 && temp->info.sex == '1')
- {
- num_female[5]++;
- }
- temp = temp->next;
- }
- }
- void filltable(table*& beg, table*& last, stud* b)
- { // заполнение таблицы
- int num_male[6]{0};
- int num_female[6]{0};
- stud* temp = b;
- table *hn, *m = beg;
- while (temp) { // цикл формирования выходного списка
- m = beg;
- if (m) { // если выходной список не пуст
- hn = m;
- while (hn) { // поиск группы
- if (temp->info.gr == hn->inf.num) { // если уже есть группа
- if (temp->info.sex == '0') { // если мужчина
- hn->inf.n_male += 1;
- hn->inf.s_male += temp->info.mark;
- } // если мужчина
- else { // если женщина
- hn->inf.n_fem += 1;
- hn->inf.s_female += temp->info.mark;
- } // если женщина
- break;
- } // если уже есть группа
- hn = hn->next;
- } // поиск группы
- if (!hn) { // если нет группы
- last->next = new table;
- last->next->next = 0;
- last->next->pre = last;
- last = last->next;
- last->inf.num = temp->info.gr;
- if (temp->info.sex == '0') { // если мужчина
- last->inf.n_male = 1;
- last->inf.s_male = temp->info.mark;
- last->inf.n_fem = 0;
- last->inf.s_female = 0;
- } // если мужчина
- else { // если женщина
- last->inf.n_male = 0;
- last->inf.s_male = 0;
- last->inf.n_fem = 1;
- last->inf.s_female = temp->info.mark;
- } // если женщина
- } // если нет цеха
- } // если выходной список не пуст
- else { // если выходной список пуст
- m = beg = last = new table;
- m->next = m->pre = 0;
- m->inf.num = temp->info.gr;
- if (temp->info.sex == '0') { // если мужчина
- m->inf.n_male = 1;
- m->inf.s_male = temp->info.mark;
- m->inf.n_fem = 0;
- m->inf.s_female = 0;
- } // если мужчина
- else { // если женщина
- m->inf.n_male = 0;
- m->inf.s_male = 0;
- m->inf.n_fem = 1;
- m->inf.s_female = temp->info.mark;
- } // если женщина
- } // если выходной список пуст
- temp = temp->next;
- } // цикл формирования выходного списка
- return;
- }
- void out_print(table* beg, table* last)
- { // вывод данных
- table* k = beg, * pn;
- int i;
- while (1) {
- pn = k;
- k = out_pagep(k);
- key = getch();
- if (key == 0)
- key = cin.get();
- switch (key) {
- case 13:
- return;
- break;
- case 73:
- case 72:
- k = pn;
- for (i = tk; (i != 0) && (k); i--)
- k = k->pre;
- if (!k)
- k = beg;
- break; // вверх в меню
- case 81:
- case 80:
- if (!k)
- k = pn;
- break; // вниз в меню
- default:
- k = pn;
- break;
- }
- }
- };
- table* out_pagep(table* temp)
- {// вывод выходной таблицы
- system("cls");
- system("color 0B");
- int i = tk;
- cout.precision(5);
- cout << setw(80) << "________________________________________________________________________________ ";
- cout << setw(16) << "|Сред.балл |" <<
- setw(16) << "Кол-во студентов |" <<
- setw(16) << "Всего|" <<
- setw(16) << "| |" <<
- setw(8) << "Муж |" <<
- setw(8) << "Жен |" <<
- setw(80) << "|______________________________________________________________________________| ";
- while (temp && i)
- {
- cout << "|" << 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) << "|";
- if (temp->inf.n_male)
- cout << setw(7) << (temp->inf.s_male / temp->inf.n_male) << setw(1) << "|";
- else
- cout << setw(8) << "0|";
- if (temp->inf.s_female)
- cout << setw(7) << (temp->inf.s_female / temp->inf.n_fem) << setw(1) << "|";
- else
- cout << setw(8) << "0|";
- if (temp->inf.n_male || temp->inf.n_fem)
- cout << setw(15) << ((temp->inf.s_male + temp->inf.s_female) / (temp->inf.n_male + temp->inf.n_fem)) << setw(1) << "|";
- else
- cout << setw(16) << "0|";
- cout << setw(80) << "|______________________________________________________________________________| ";
- temp = temp->next;
- i--;
- }
- cout << "Для выхода нажмите Enter" << endl;
- cout << "Для перемещения по списку используйте кнопки вверх и вниз" << endl;
- return temp;
- }
- void outpfile(table* beg, char filename[])
- {// печать выходной таблицы в файл
- ofstream fout(filename, ios::out);
- table* temp = beg;
- cout.precision(5);
- fout << "________________________________________________________________________________ " << endl << setw(16)
- << "| Сред.балл |" << setw(16) << "Кол-во студентов |" << setw(16) << "Всего |" << endl
- << setw(16) << "| |" << setw(8) << "Муж |" << setw(16) << "Жен |" << setw(16) << " |" << endl
- << setw(80) << "|______________________________________________________________________________| " << endl;
- while (temp) {
- /*?*/ 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) << "|";
- if (temp->inf.n_male)
- fout << setw(7) << (temp->inf.s_male / temp->inf.n_male) << setw(1) << "|";
- else
- fout << setw(8) << "0|";
- if (temp->inf.s_female)
- fout << setw(7) << (temp->inf.s_female / temp->inf.n_fem) << setw(1) << "|";
- else
- fout << setw(8) << "0|";
- if (temp->inf.n_male || temp->inf.n_fem)
- fout << setw(15) << ((temp->inf.s_male + temp->inf.s_female) / (temp->inf.n_male + temp->inf.n_fem)) << setw(1) << "|" << endl;
- else
- fout << setw(16) << "0|" << endl;
- fout << setw(80) << "|______________________________________________________________________________| " << endl;
- temp = temp->next;
- }
- fout.close();
- return;
- }
- void ouf_memory(table*& beg, table*& last)
- { // функция освобождения динамической памяти от выходного списка
- table* temp = beg, * temp2;
- while (temp) {
- temp2 = temp->next;
- delete temp;
- temp = temp2;
- }
- return;
- }
- int confirm(char* message)
- { // функция подтверждения выбора
- system("color B0");
- cout << message << endl;
- while (1) { // пока не сделан выбор
- key = getch();
- if (key == 0)
- key = cin.get();
- switch (key) {
- case 13:
- return 1;
- case 27:
- return 0;
- default:
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement