paranid5

Задача со студентами

Apr 26th, 2020
500
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 17.77 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <map>
  4. #include <string>
  5. #include <vector>
  6. using namespace std;
  7. struct student
  8. {
  9.     string last_name;
  10.     string middle_name;
  11.     string first_name;
  12.     string group;
  13.     map<string, unsigned short> marks;
  14. };
  15. void save(vector<student> x)
  16. {
  17.     ofstream fout("exam.txt", ios::binary);
  18.     for (auto& q : x)
  19.     {
  20.         unsigned short namesz = q.first_name.size(), familysz = q.last_name.size(), midsz = q.middle_name.size(), teamsz = q.group.size(), mksize = q.marks.size();
  21.         fout.write(reinterpret_cast<char*>(&familysz), sizeof(familysz));
  22.         fout.write(q.last_name.data(), familysz);
  23.         fout.write(reinterpret_cast<char*>(&namesz), sizeof(namesz));
  24.         fout.write(q.first_name.data(), namesz);
  25.         fout.write(reinterpret_cast<char*>(&midsz), sizeof(midsz));
  26.         fout.write(q.middle_name.data(), midsz);
  27.         fout.write(reinterpret_cast<char*>(&teamsz), sizeof(teamsz));
  28.         fout.write(q.group.data(), teamsz);
  29.         fout.write(reinterpret_cast<char*>(&mksize), sizeof(mksize));
  30.         for (auto& mark : q.marks)
  31.         {
  32.             unsigned short fsz = mark.first.size();
  33.             fout.write(reinterpret_cast<char*>(&fsz), sizeof(fsz));
  34.             fout.write(mark.first.data(), fsz);
  35.             fout.write(reinterpret_cast<char*>(&mark.second), sizeof(mark.second));
  36.         }
  37.     }
  38.     fout.close();
  39. }
  40. int main()
  41. {
  42.     vector<student> list;
  43.     setlocale(LC_ALL, "Russian");
  44.    
  45.     ifstream fin("exam.txt", ios::binary);
  46.     if(!fin.good())
  47.     {
  48.         ofstream create("exam.txt");
  49.         create.close();
  50.         fin.close();
  51.     }
  52.     else {
  53.         while (!fin.eof())
  54.         {
  55.             student guy;
  56.             string str1, str2, str3, str4, str5;
  57.             unsigned short marks = 0;
  58.             unsigned short sz1 = 0, sz2 = 0, sz3 = 0, sz4 = 0, sz5 = 0;
  59.             /*фамилия*/
  60.             fin.read(reinterpret_cast<char*>(&sz1), sizeof(sz1));
  61.             str1.resize(sz1);
  62.             fin.read(&str1[0], sz1);
  63.             guy.last_name = str1;
  64.             /*имя*/
  65.             fin.read(reinterpret_cast<char*>(&sz2), sizeof(sz2));
  66.             str2.resize(sz2);
  67.             fin.read(&str2[0], sz2);
  68.             guy.first_name = str2;
  69.             /*отчество*/
  70.             fin.read(reinterpret_cast<char*>(&sz3), sizeof(sz3));
  71.             str3.resize(sz3);
  72.             fin.read(&str3[0], sz3);
  73.             guy.middle_name = str3;
  74.             /*группа*/
  75.             fin.read(reinterpret_cast<char*>(&sz4), sizeof(sz4));
  76.             str4.resize(sz4);
  77.             fin.read(&str4[0], sz4);
  78.             guy.group = str4;
  79.             map<string, unsigned short> subject;
  80.             fin.read(reinterpret_cast<char*>(&sz5), sizeof(sz5)); /*кол-во оценок*/
  81.             unsigned short siz = 0, siz2 = 0;
  82.             for (unsigned short sub = 0; sub < sz5; sub++)
  83.             {
  84.                 fin.read(reinterpret_cast<char*>(&siz), sizeof(siz));
  85.                 str5.resize(siz);
  86.                 fin.read(&str5[0], siz);
  87.                 fin.read(reinterpret_cast<char*>(&siz2), sizeof(siz2));
  88.                 guy.marks[str5] = siz2;
  89.             }
  90.             if (!guy.first_name.empty())/*проверка на пустоту файла*/
  91.                 list.push_back(guy);
  92.         }
  93.         fin.close(); /*считали*/
  94.     }
  95.     unsigned short choise = 0; /*главный выбор*/
  96.     while (choise != 7)
  97.     {
  98.         puts("1. Список студентов\n");
  99.         puts("2. Добавить студента\n");
  100.         puts("3. Редактировать студента\n");
  101.         puts("4. Удалить студента\n");
  102.         puts("5. Показать отличников\n");
  103.         puts("6. Показать неуспевающих\n");
  104.         puts("7. Выход\n");
  105.         puts("Введите цифру действия:");
  106.         student guy;
  107.         string str;
  108.         string yes, news, subject;
  109.         bool csearch = false;
  110.         bool fsearch = false;
  111.         bool search = false;
  112.         bool seek = false;
  113.         bool seek2 = false;
  114.         unsigned short ch_ch = 0; /*выбор изменений*/
  115.         unsigned short stud_ch = 0; /*выбор ученика*/
  116.         scanf("%hu", &choise);
  117.         switch (choise)
  118.         {
  119.         case 1:
  120.             puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  121.             cin >> yes;
  122.             if (yes != "YES")
  123.                 break;
  124.             puts("Список студентов:");
  125.             if (list.empty())
  126.                 puts("Учеников пока что нет в базе данных.\n");
  127.             for (unsigned short q = 0; q < list.size(); q++)
  128.             {
  129.                 printf("\n===%hu===\n", q + 1);
  130.                 cout << "Фамилия: " << list[q].last_name << endl;
  131.                 cout << "Имя: " << list[q].first_name << endl;
  132.                 cout << "Отчество: " << list[q].middle_name << endl;
  133.                 cout << "Группа: " << list[q].group << endl;
  134.                 puts("Оценки:\n");
  135.                 for (auto& mark : list[q].marks)
  136.                     cout << mark.first << ": " << mark.second << endl;
  137.             }
  138.             break;
  139.         case 2:
  140.             puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  141.             cin >> yes;
  142.             if (yes != "YES")
  143.                 break;
  144.             puts("Добавление нового ученика:\n");
  145.             puts("Введите фамилию: ");
  146.             cin >> str;
  147.             puts("\nВы уверены, что это именно та фамилия? Для подтверждения введите YES, иначе что-то другое: ");
  148.             cin >> yes;
  149.             if (yes != "YES")
  150.                 break;
  151.             guy.last_name = str;
  152.             puts("\nВведите имя: ");
  153.             cin >> str;
  154.             puts("\nВы уверены, что это именно то имя? Для подтверждения введите YES, иначе что-то другое: ");
  155.             cin >> yes;
  156.             if (yes != "YES")
  157.                 break;
  158.             guy.first_name = str;
  159.             puts("\nВведите отчество: ");
  160.             cin >> str;
  161.             puts("\nВы уверены, что это именно то отчество? Для подтверждения введите YES, иначе что-то другое: ");
  162.             cin >> yes;
  163.             if (yes != "YES")
  164.                 break;
  165.             guy.middle_name = str;
  166.             puts("\nВведите группу: ");
  167.             cin >> str;
  168.             puts("\nВы уверены, что это именно та группа? Для подтверждения введите YES, иначе что-то другое: ");
  169.             cin >> yes;
  170.             if (yes != "YES")
  171.                 break;
  172.             guy.group = str;
  173.             puts("Что бы подтвердить все действия введите YES, иначе что-то другое");
  174.             cin >> str;
  175.             if (str == "YES")
  176.                 list.push_back(guy);
  177.             save(list);
  178.             break;
  179.         case 3:
  180.             puts("\nВы уверены, что хотите изменять данные о студенте? Для подтверждения введите YES, иначе что-то другое: ");
  181.             cin >> yes;
  182.             if (yes != "YES")
  183.                 break;
  184.             puts("Редактирование студентов:\n");
  185.             if (list.empty())
  186.             {
  187.                 puts("Студентов нет в базе данных.");
  188.                 break;
  189.             }
  190.             for (unsigned short q = 0; q < list.size(); q++)
  191.                 cout << q + 1 << ". " << list[q].last_name << " " << list[q].first_name << " " << list[q].middle_name <<" (" << list[q].group << ")" << endl;
  192.             do
  193.             {
  194.                 puts("Введите номер студента: ");
  195.                 scanf("%hu", &stud_ch);
  196.                 if (stud_ch > list.size() || stud_ch < 1)
  197.                     puts("Такого студента нет.\n");
  198.             }
  199.             while (stud_ch > list.size() || stud_ch < 1);
  200.             while (ch_ch != 8)
  201.             {
  202.                 puts("Что вы хотите изменить?\n");
  203.                 puts("1. Изменить фамилию\n");
  204.                 puts("2. Изменить имя\n");
  205.                 puts("3. Изменить отчество\n");
  206.                 puts("4. Изменить группу\n");
  207.                 puts("5. Добавить оценку\n");
  208.                 puts("6. Изменить оценку\n");
  209.                 puts("7. Удалить оценку\n");
  210.                 puts("8. Назад\n");
  211.                 puts("Введите номер: ");
  212.                 scanf("%hu", &ch_ch);
  213.                 switch (ch_ch)
  214.                 {
  215.                 case 1:
  216.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  217.                     cin >> yes;
  218.                     if (yes != "YES")
  219.                         break;
  220.                     puts("\nНа какую фамилию вы хотите заменить:\n");
  221.                     cin >> news;
  222.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  223.                     cin >> yes;
  224.                     if (yes == "YES")
  225.                     {
  226.                         list[stud_ch - 1].last_name = news;
  227.                         puts("\nУспешно заменено!\n");
  228.                     }
  229.                     save(list);
  230.                     break;
  231.                 case 2:
  232.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  233.                     cin >> yes;
  234.                     if (yes != "YES")
  235.                         break;
  236.                     puts("\nНа какое имя вы хотите заменить:\n");
  237.                     cin >> news;
  238.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  239.                     cin >> yes;
  240.                     if (yes == "YES")
  241.                     {
  242.                         list[stud_ch - 1].first_name = news;
  243.                         puts("\nУспешно заменено!\n");
  244.                     }
  245.                     save(list);
  246.                     break;
  247.                 case 3:
  248.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  249.                     cin >> yes;
  250.                     if (yes != "YES")
  251.                         break;
  252.                     puts("\nНа какое отчество вы хотите заменить:\n");
  253.                     cin >> news;
  254.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  255.                     cin >> yes;
  256.                     if (yes == "YES")
  257.                     {
  258.                         list[stud_ch - 1].middle_name = news;
  259.                         puts("\nУспешно заменено!\n");
  260.                     }
  261.                     save(list);
  262.                     break;
  263.                 case 4:
  264.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  265.                     cin >> yes;
  266.                     if (yes != "YES")
  267.                         break;
  268.                     puts("\nНа какую группу вы хотите заменить:\n");
  269.                     cin >> news;
  270.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  271.                     cin >> yes;
  272.                     if (yes == "YES")
  273.                     {
  274.                         list[stud_ch - 1].group = news;
  275.                         puts("\nУспешно заменено!\n");
  276.                     }
  277.                     save(list);
  278.                     break;
  279.                 case 5:
  280.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  281.                     cin >> yes;
  282.                     if (yes != "YES")
  283.                         break;
  284.                     do
  285.                     {
  286.                         fsearch = false;
  287.                         puts("Для добавления оценки выберите предмет, которого нет у ученика: ");
  288.                         cin >> subject;
  289.                         puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  290.                         cin >> yes;
  291.                         if (yes != "YES")
  292.                             break;
  293.                         else
  294.                         {
  295.                             for (auto& mark : list[stud_ch - 1].marks)
  296.                                 if (mark.first == subject)
  297.                                 {
  298.                                     fsearch = true;
  299.                                     break;
  300.                                 }
  301.                             if (fsearch)
  302.                                 puts("\nТакой предмет ученик сдавал.\n");
  303.                             else
  304.                             {
  305.                                 puts("Введите оценку: ");
  306.                                 unsigned short newmark = 0;
  307.                                 do
  308.                                 {
  309.                                     scanf("%hu", &newmark);
  310.                                     if (newmark < 2 || newmark > 5)
  311.                                         puts("Такой оценки нет. Введите другую оценку: ");
  312.                                 }
  313.                                 while (newmark < 2 || newmark > 5);
  314.                                 puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  315.                                 cin >> yes;
  316.                                 if (yes != "YES")
  317.                                     break;
  318.                                 else
  319.                                 {
  320.                                     list[stud_ch - 1].marks[subject] = newmark;
  321.                                     puts("\nУспешно добавлено!\n");
  322.                                     break;
  323.                                 }
  324.                             }
  325.                         }
  326.                     }
  327.                     while (fsearch);
  328.                     save(list);
  329.                     break;
  330.                 case 6:
  331.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  332.                     cin >> yes;
  333.                     if (yes != "YES")
  334.                         break;
  335.                     do
  336.                     {
  337.                         csearch = false;
  338.                         puts("Для изменения оценки выберите предмет, который ученик уже сдал: ");
  339.                         cin >> subject;
  340.                         puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  341.                         cin >> yes;
  342.                         if (yes != "YES")
  343.                             break;
  344.                         else
  345.                         {
  346.                             for (auto& mark : list[stud_ch - 1].marks)
  347.                                 if (mark.first == subject)
  348.                                 {
  349.                                     csearch = true;
  350.                                     break;
  351.                                 }
  352.                             if (!csearch)
  353.                                 puts("\nТакой предмет ученик не сдавал.\n");
  354.                             else
  355.                             {
  356.                                 puts("Введите оценку: ");
  357.                                 unsigned short tnewmark = 0;
  358.                                 do
  359.                                 {
  360.                                     scanf("%hu", &tnewmark);
  361.                                     if (tnewmark < 2 || tnewmark > 5)
  362.                                         puts("Такой оценки нет. Введите другую оценку: ");
  363.                                 }
  364.                                 while (tnewmark < 2 || tnewmark > 5);
  365.                                 puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  366.                                 cin >> yes;
  367.                                 if (yes != "YES")
  368.                                     break;
  369.                                 else
  370.                                 {
  371.                                     bool test = false;
  372.                                     for (auto it = list[stud_ch - 1].marks.begin(); it != list[stud_ch - 1].marks.end();++it)
  373.                                         if (it->first == subject)
  374.                                         {
  375.                                             list[stud_ch - 1].marks[subject] = tnewmark;
  376.                                             puts("\nУспешно заменено!\n");
  377.                                             test = true;
  378.                                             break;
  379.                                         }
  380.                                 }
  381.                             }
  382.                         }
  383.                     }
  384.                     while (!csearch);
  385.                     save(list);
  386.                     break;
  387.                 case 7:
  388.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  389.                     cin >> yes;
  390.                     if (yes != "YES")
  391.                         break;
  392.                     do
  393.                     {
  394.                         search = false;
  395.                         puts("Выберите предмет, оценку в котором хотите удалить: ");
  396.                         cin >> subject;
  397.                         puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  398.                         cin >> yes;
  399.                         if (yes != "YES")
  400.                             break;
  401.                         else
  402.                         {
  403.                             for (auto& mark : list[stud_ch - 1].marks)
  404.                                 if (mark.first == subject)
  405.                                 {
  406.                                     search = true;
  407.                                     break;
  408.                                 }
  409.                             if (!search)
  410.                                 puts("\nТакой предмет ученик не сдавал.\n");
  411.                             else
  412.                             {
  413.                                
  414.                                     bool test = false;
  415.                                     for (auto it = list[stud_ch - 1].marks.begin(); it != list[stud_ch - 1].marks.end(); ++it)
  416.                                         if (it->first == subject)
  417.                                         {
  418.                                             list[stud_ch - 1].marks.erase(it->first);
  419.                                             puts("\nУспешно удалено!\n");
  420.                                             test = true;
  421.                                             break;
  422.                                         }
  423.                             }
  424.                         }
  425.                     }
  426.                     while (!search);
  427.                     save(list);
  428.                     break;
  429.                 case 8:
  430.                     puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  431.                     cin >> yes;
  432.                     if (yes != "YES")
  433.                         break;
  434.                     break;
  435.                 default:
  436.                     puts("Такой команды нет.\n");
  437.                     break;
  438.                 }
  439.             }
  440.             break;
  441.         case 4:
  442.             puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  443.             cin >> yes;
  444.             if (yes != "YES")
  445.                 break;
  446.             puts("Удаление студентов\n");
  447.             for (unsigned short q = 0; q < list.size(); q++)
  448.                 cout << q + 1 << ". " << list[q].last_name << " " << list[q].first_name << " " << list[q].middle_name <<" (" << list[q].group << ")" << endl;
  449.             do
  450.             {
  451.                 puts("Введите номер студента: ");
  452.                 scanf("%hu", &stud_ch);
  453.                 if (stud_ch > list.size() || stud_ch < 1)
  454.                     puts("Такого студента нет.\n");
  455.             }
  456.             while (stud_ch > list.size() || stud_ch < 1);
  457.             puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  458.             cin >> yes;
  459.             if (yes != "YES")
  460.                 break;
  461.             list.erase(list.begin() + stud_ch - 1);
  462.             puts("\nСтудент удалён.\n");
  463.             save(list);
  464.             break;
  465.         case 5:
  466.             puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  467.             cin >> yes;
  468.             if (yes != "YES")
  469.                 break;
  470.             puts("Отличниики:");
  471.             for (unsigned short q = 0; q < list.size(); q++)
  472.             {
  473.                 bool zadrot = true;
  474.                 if (list[q].marks.empty())
  475.                     zadrot = false;
  476.                 for (auto& mark : list[q].marks)
  477.                     if (mark.second != 5)
  478.                     {
  479.                         zadrot = false;
  480.                         break;
  481.                     }
  482.                 if (zadrot)
  483.                 {
  484.                     seek = true;
  485.                     printf("\n===%hu===\n", q + 1);
  486.                     cout << "Фамилия: " << list[q].last_name << endl;
  487.                     cout << "Имя: " << list[q].first_name << endl;
  488.                     cout << "Отчество: " << list[q].middle_name << endl;
  489.                     cout << "Группа: " << list[q].group << endl;
  490.                     puts("Оценки:\n");
  491.                     for (auto& mark : list[q].marks)
  492.                         cout << mark.first << ": " << mark.second << endl;
  493.                 }
  494.             }
  495.             if (!seek)
  496.                 puts("\nК сожалению, отличников нет.\n");
  497.             seek = false;
  498.             break;
  499.         case 6:
  500.             puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  501.             cin >> yes;
  502.             if (yes != "YES")
  503.                 break;
  504.             puts("Неуспевающие:");
  505.             for (unsigned short q = 0; q < list.size(); q++)
  506.             {
  507.                 bool krasava = false;
  508.                 for (auto& mark : list[q].marks)
  509.                     if (mark.second == 2)
  510.                     {
  511.                         krasava = true;
  512.                         break;
  513.                     }
  514.                 if (krasava)
  515.                 {
  516.                     seek2 = true;
  517.                     printf("\n===%hu===\n", q + 1);
  518.                     cout << "Фамилия: " << list[q].last_name << endl;
  519.                     cout << "Имя: " << list[q].first_name << endl;
  520.                     cout << "Отчество: " << list[q].middle_name << endl;
  521.                     cout << "Группа: " << list[q].group << endl;
  522.                     puts("Оценки:\n");
  523.                     for (auto& mark : list[q].marks)
  524.                         cout << mark.first << ": " << mark.second << endl;
  525.                 }
  526.             }
  527.             if (!seek2)
  528.                 puts("\nК счастью, неуспевающих нет.\n");
  529.             seek2 = false;
  530.             break;
  531.         case 7:
  532.             puts("\nДля подтверждения введите YES, иначе что-то другое: ");
  533.             cin >> yes;
  534.             if (yes != "YES")
  535.                 break;
  536.             break;
  537.         default:
  538.             puts("Такой команды нет.");
  539.         }
  540.     }
  541.     return 0;
  542. }
Advertisement
Add Comment
Please, Sign In to add comment