#include <iostream>
#include <fstream>
#include <windows.h>
#include <cstdlib>
#include <iomanip>
#include <conio.h>
using namespace std;
const char* file = "jurnal";
char* r(char* buf);
char a[256];
char* r(char* b)
{
    CharToOem(b, a);
    return a;
}
inline void eatline()
{
    while (cin.get() != '\n')
        continue;
}
struct Stud {
    int number;
    char prizv[15];
    char name[15];
    char batk[15];
    double istor_ukr;
    double informatic;
    double fizika;
    double matem;
    double ukr_mov;
    double ukr_lit;
    double in_mov;
    double fizra;
    double biologia;
    double geografiy;
    double seredniy_bal;
    char clas[15];
};
class Base {
    int a, num, j, b, g, c, d;

public:
    Stud ob;
    void menu()
    {
        system("cls");
        cout << "**********************************************************************************************************************************************" << endl;
        cout << "\n\t\t\t\t\t\tКонтроль успішності учнів ліцею №11\t\t\t\t\t\t" << endl << endl;
        cout << "**********************************************************************************************************************************************" << endl;
        cout << "\n\t\t\t\t\t\t\t 1. Перегляд" << endl;
        cout << "\t\t\t\t\t\t\t 2. Ввід" << endl;
        cout << "\t\t\t\t\t\t\t 3. Редагування" << endl;
        cout << "\t\t\t\t\t\t\t 4. Пошук" << endl;
        cout << "\t\t\t\t\t\t\t 5. Сортування" << endl;
        cout << "\t\t\t\t\t\t\t 6. Видалення" << endl;
        cout << "\t\t\t\t\t\t\t 7. Вихід" << endl;

        a = _getch();
        switch (a) {
        case '1':
            view();
            //look();
            next();
            break;
        case '2':
            enter();
            next();
            break;
        case '3':
            redac();
            next();
            break;
        case '4':
            poshyk();
            next();
            break;
        case '5':
            sort();
            next();
            break;
        case '6':
            delet();
            next();
            break;
        case '7':
            exit(1);
            break;
        default:
            cout << "Помилка, повторіть ввід!";
        }
    }
    void next()
    {
        cout << "Для виходу в головне меню натисніть (1)" << endl;
        a = _getch();
        switch (b) {
        case '1':
            menu();
            break;
        case '2':
            exit(1);
        }
    }

    void que()
    {
        cout << "Для виходу в головне меню натисніть (1), в перегляд (2)" << endl;
        d = _getch();
        switch (d) {
        case '1':
            menu();
            break;
        case '2':
            view();
            break;
        }
    }

    void provirka()
    {
        fstream fil;
        fil.open(file, ios::out | ios::in | ios::binary);
        if (!file) {
            cout << " Файл не знайдений !!!" << endl;
            system("pause");
        }
        fil.close();
    }

    void look()
    {
        system("cls");
        Stud ob;
        ifstream in;
        in.open(file, ios::in | ios::binary);
        if (!in) {
            cout << "Помилка" << endl;
        }
        cout << "**********************************************************************************************************************************************";
        cout << "\n\t\t\t\t\t\t\t\tВсі учні школи" << endl;
        cout << "**********************************************************************************************************************************************" << endl;
        cout << "|Номер|Клас| Прізвище |  Ім'я  | По батькові |Укр.мова|Матем.|Укр.літ|Інформ.|Ін.мова|Укр.історія|Географія|Фізика|Біологія|Фіз-ра|Середн.бал|" << endl;
        while (in.read((char*)&ob, sizeof ob))
            cout << "|" << setw(4) <<  ob.number << " |" << setw(4) << ob.clas << "|" << setw(10) << ob.prizv << "|" << setw(8) << ob.name << "|"
                 << setw(13) << ob.batk << "|   " << setw(2) << ob.ukr_mov << "   |  " << setw(2) << ob.matem << "  |  "
                 << setw(2) << ob.in_mov << "   |  " << setw(2) << ob.fizra << "   |  " << setw(2) << ob.ukr_lit << "   |     "
                 << setw(2) << ob.istor_ukr << "    |    " << setw(2) << ob.geografiy << "   |  " << setw(2) << ob.fizika << "  |   "
                 << setw(2) << ob.biologia << "   |  " << setw(2) << ob.informatic << "  |  " << setw(4)
                 << setprecision(2) << ob.seredniy_bal << "    |" << endl;
        cout << "**********************************************************************************************************************************************"  << endl;
        in.close();
    }
    void enter()
    {
        Stud ob;
        ofstream out;
        out.open(file, ios::out | ios::app | ios::binary);
        if (!out) {
            cout << "Помилка";
        }
        system("cls");
        detail();
        cout << "Клас: ";
        cin >> ob.clas;
        cout << "Особистий номер: ";
        cin >> ob.number;
        eatline();
        cout << "Прізвище: ";
        cin.getline(ob.prizv, 15);
        cout << "Ім'я: ";
        cin.getline(ob.name, 15);
        cout << "По батькові: ";
        cin.getline(ob.batk, 15);
        if (ob.number < 499) {
        cout << "Українська мова: ";
        cin >> ob.ukr_mov;
        cout << "Математика: ";
        cin >> ob.matem;
        cout << "Іноземна мова: ";
        cin >> ob.in_mov;
        cout << "Фіз-ра: ";
        cin >> ob.fizra;
        ob.ukr_lit = '\0';
        ob.informatic = '\0';
        ob.fizika = '\0';
        ob.istor_ukr = '\0';
        ob.geografiy = '\0';
        ob.biologia = '\0';
        ob.seredniy_bal = (ob.matem + ob.ukr_mov + ob.in_mov + ob.fizra) / 4;
            } else {
        cout << "Українська мова: ";
        cin >> ob.ukr_mov;
        cout << "Математика: ";
        cin >> ob.matem;
        cout << "Українська література: ";
        cin >> ob.ukr_lit;
        cout << "Іноземна мова: ";
        cin >> ob.in_mov;
        cout << "Інформатика: ";
        cin >> ob.informatic;
        cout << "Фізика: ";
        cin >> ob.fizika;
        cout << "Історія України: ";
        cin >> ob.istor_ukr;
        cout << "Географія: ";
        cin >> ob.geografiy;
        cout << "Біологія: ";
        cin >> ob.biologia;
        cout << "Фіз-ра: ";
        cin >> ob.fizra;

        ob.seredniy_bal = (ob.matem + ob.ukr_mov + ob.informatic + ob.ukr_lit + ob.in_mov + ob.biologia + ob.istor_ukr + ob.fizika + ob.fizra + ob.geografiy) / 10;
        }
        eatline();
        out.write((char*)&ob, sizeof ob);
        out.close();
        system("pause");
    }
    void poshyk()
    {
        system("cls");
        int temp;
        Stud ob;
        fstream poshyk(file, ios::in | ios::binary);
        look();
        detail();
        cout << "Пошук по особистому номером:" << endl;
        cin >> temp;
        eatline();
        while (true) {
            poshyk.read((char*)&ob, sizeof(Stud));
            if (poshyk.eof()) {
                cout << "Немає " << temp << endl;
                return;
            }
            if (temp == ob.number) {
                    if (ob.number < 499) {
            cout << "**************************************************************************************" << endl;
            cout << "| № |Клас| Прізвище |  Ім'я  | По батькові |Укр.мова|Матем.|Ін.мова|Фіз-ра|Середн.бал|" << endl;
                cout << "|" << setw(3) <<  ob.number << "|" << setw(4) << ob.clas << "|" << setw(10) << ob.prizv << "|" << setw(8) << ob.name << "|"
                 << setw(13) << ob.batk << "|   " << setw(2) << ob.ukr_mov << "   |  " << setw(2) << ob.matem << "  |  "
                 << setw(2) <<  ob.in_mov << "   |  " << setw(2) << ob.fizra << "  |   "
                 << setprecision(10) << ob.seredniy_bal << "  |" << endl;
            cout << "**************************************************************************************" << endl;
                return;
                } else {
        cout << "**********************************************************************************************************************************************" << endl;
        cout << "|Номер|Клас| Прізвище |  Ім'я  | По батькові |Укр.мова|Матем.|Укр.літ|Інформ.|Ін.мова|Укр.історія|Географія|Фізика|Біологія|Фіз-ра|Середн.бал|" << endl;
            cout << "|" << setw(4) <<  ob.number << " |" << setw(4) << ob.clas << "|" << setw(10) << ob.prizv << "|" << setw(8) << ob.name << "|"
                 << setw(13) << ob.batk << "|   " << setw(2) << ob.ukr_mov << "   |  " << setw(2) << ob.matem << "  |  "
                 << setw(2) << ob.in_mov << "   |  " << setw(2) << ob.fizra << "   |  " << setw(2) << ob.ukr_lit << "   |     "
                 << setw(2) << ob.istor_ukr << "    |    " << setw(2) << ob.geografiy << "   |  " << setw(2) << ob.fizika << "  |   "
                 << setw(2) << ob.biologia << "   |  " << setw(2) << ob.informatic << "  |  " << setw(4)
                 << setprecision(2) << ob.seredniy_bal << "    |" << endl;
        cout << "**********************************************************************************************************************************************" << endl;
                return;
                }
            }
        }
    }
    void sort()
    {
        system("cls");
        fstream sort;
        sort.open(file, ios::in | ios::binary);
        Stud ob[1000];
        Stud tem;
        int count = 0;

        while (!sort.eof()) {
            sort.read((char*)&ob[count], sizeof(Stud));
            count++;
        }
        count--;
        cout << "Сортування по:\n1 - Особистому номеру\n2 - По прізвищу\nЗ - Середньому балу\n4 - Класу" << endl;
        int a;
        cin >> a;
        eatline();
        if (a == 1) {
            for (int i = 0; i < count; i++)
                for (int j = 0; j < count; j++) {
                    if (ob[i].number < ob[j].number) {
                        tem = ob[i];
                        ob[i] = ob[j];
                        ob[j] = tem;
                    }
                }
            if (a == 2)
                for (int i = 0; i < count; i++)
                    for (int j = 0; j < count; j++)

                        if (ob[i].prizv[0] < ob[j].prizv[0]) {
                            tem = ob[i];
                            ob[i] = ob[j];
                            ob[j] = tem;
                        }
        }

            if (a == 3)
                for (int i = 0; i < count; i++)
                    for (int j = 0; j < count; j++)

                        if (ob[i].seredniy_bal < ob[j].seredniy_bal) {
                            tem = ob[i];
                            ob[i] = ob[j];
                            ob[j] = tem;
                        }

        if (a == 4)
            for (int i = 0; i < count; i++)
                for (int j = 0; j < count; j++)
                    if (ob[i].clas[0] < ob[j].clas[0]) {
                        tem = ob[i];
                        ob[i] = ob[j];
                        ob[j] = tem;
                    }

        sort.close();
        sort.clear();
        sort.open(file, ios::out | ios::binary);
        for (a = 0; a < count; a++)
            sort.write((char*)&ob[a], sizeof(Stud));
            cout << "Успішно!" << endl;
        sort.close();

    }
    //////////////////////////////////////////////////
    void redac()

    {
        system("cls");
        Stud ob[1000];
        fstream del;
        del.open(file, ios::in | ios::out | ios::binary);
        if (!del.is_open()) {
            cout << "Помилка!" << endl;
            exit(1);
        }
        int count = 0;
        while (!del.eof()) {
            del.read((char*)&ob[count], sizeof(Stud));
            count++;
        }
        look();
        count--;
        cout << "Введіть особистий номер учня для редагування: ";
        double number;
        cin >> number;
        del.close();
        del.clear();
        del.open(file, ios::out | ios::binary);
        for (int x = 0; x < count; x++)
            if (ob[x].number != number)
                del.write((char*)&ob[x], sizeof(Stud));
        enter();
        cout << "Успішно!" << endl;
        del.close();
    }

    void delet()
    {
        system("cls");
        Stud ob[1000];
        fstream del;
        del.open(file, ios::in | ios::out | ios::binary);
        if (!del.is_open()) {
            cout << "Помилка!" << endl;
            exit(1);
        }
        int count = 0;
        while (!del.eof()) {
            del.read((char*)&ob[count], sizeof(Stud));
            count++;
        }
        look();
        count--;
        cout << "Введіть особистий номер учня каторого треба видалити: ";
        double number;
        cin >> number;
        del.close();
        del.clear();
        del.open(file, ios::out | ios::binary);
        for (int x = 0; x < count; x++)
            if (ob[x].number != number)
                del.write((char*)&ob[x], sizeof(Stud));
        cout << "Успішно!" << endl;
        del.close();
    }
    void detail()
    {
        cout << "**************************************" << endl;
        cout << "|        Для особистого номеру       |"<< endl;
        cout << "|____________________________________|"<< endl;
        cout << "| Клас |    А    |    Б    |    В    |" << endl;
        cout << "|   1  | 101-130 | 131-160 | 161-190 |" << endl;
        cout << "|   2  | 201-230 | 231-260 | 261-290 |" << endl;
        cout << "|   3  | 301-330 | 331-360 | 361-390 |" << endl;
        cout << "|   4  | 401-430 | 431-460 | 461-490 |" << endl;
        cout << "|   5  | 501-530 | 531-560 | 561-590 |" << endl;
        cout << "|   6  | 601-630 | 631-660 | 661-690 |" << endl;
        cout << "|   7  | 701-730 | 731-760 | 761-790 |" << endl;
        cout << "|   8  | 801-830 | 831-860 | 861-890 |" << endl;
        cout << "|   9  | 901-830 | 931-960 | 961-990 |" << endl;
        cout << "|  10  |1001-1030|1031-1060|1061-1090|" << endl;
        cout << "|  11  |1101-1130|1131-1160|1161-1190|" << endl;
        cout << "**************************************" << endl;

    }

    void view()
    {
        system("cls");
        cout << "Перегляд:\n1 - 1-4 класи\n2 - 5-11 класи\nЗ - Всіх" << endl;
        c = _getch();
        switch (c) {
        case '1':
            look_l();
            que();
            break;
        case '2':
            look_b();
            que();
            break;
        case '3':
            look();
            que();
            break;

        }
    }

    void look_l()
    {
        system("cls");
        Stud ob;
        ifstream in;
        in.open(file, ios::in | ios::binary);
        if (!in) {
            cout << "Помилка" << endl;
        }

            cout << "**************************************************************************************";
            cout << "\n\t\t\t\t\tПочаткові класи" << endl;
            cout << "**************************************************************************************" << endl;
            cout << "| № |Клас| Прізвище |  Ім'я  | По батькові |Укр.мова|Матем.|Ін.мова|Фіз-ра|Середн.бал|" << endl;
            while (in.read((char*)&ob, sizeof ob))
            if (ob.number < 499){
                cout << "|" << setw(3) <<  ob.number << "|" << setw(4) << ob.clas << "|" << setw(10) << ob.prizv << "|" << setw(8) << ob.name << "|"
                 << setw(13) << ob.batk << "|   " << setw(2) << ob.ukr_mov << "   |  " << setw(2) << ob.matem << "  |   "
                 << setw(2) <<  ob.in_mov << "   |  " << setw(2) << ob.fizra << "  |   "
                 << setw(2) << ob.seredniy_bal << "    |" << endl;

             }

        cout << "**************************************************************************************" << endl;

        in.close();
    }

    void look_b()
    {
        system("cls");
        Stud ob;
        ifstream in;
        in.open(file, ios::in | ios::binary);
        if (!in) {
            cout << "Помилка" << endl;
        }

            cout << "**********************************************************************************************************************************************";
            cout << "\n\t\t\t\t\t\t\t\tСтарші класи" << endl;
            cout << "**********************************************************************************************************************************************" << endl;
            cout << "|Номер|Клас| Прізвище |  Ім'я  | По батькові |Укр.мова|Матем.|Укр.літ|Інформ.|Ін.мова|Укр.історія|Географія|Фізика|Біологія|Фіз-ра|Середн.бал|" << endl;
            while (in.read((char*)&ob, sizeof ob))
        if (ob.number > 500){
            cout << "|" << setw(3) <<  ob.number << "  |" << setw(4) << ob.clas << "|" << setw(10) << ob.prizv << "|" << setw(8) << ob.name << "|"
                 << setw(13) << ob.batk << "|   " << setw(2) << ob.ukr_mov << "   |  " << setw(2) << ob.matem << "  |  "
                 << setw(2) << ob.ukr_lit << "   |  " << setw(2) << ob.informatic << "   |  " << setw(2) << ob.in_mov << "   |     "
                 << ob.istor_ukr << "     |    " << setw(2) << ob.geografiy << "   |  " << setw(2) << ob.fizika << "  |    " << setw(2)
                 << ob.biologia << "   |  " << setw(2) << ob.fizra << "  |   " << setw(4)
                 << setw(2) << ob.seredniy_bal << "   |" << endl;

                }
        cout << "**********************************************************************************************************************************************" << endl;
        in.close();
    }
};


int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Base ob;
    ob.provirka();
    while (1) {
        ob.menu();
    }
    return 0;
}

