Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <iostream>
- #include <map>
- #include <string>
- #include <vector>
- using namespace std;
- struct student
- {
- string last_name;
- string middle_name;
- string first_name;
- string group;
- map<string, unsigned short> marks;
- };
- void save(vector<student> x)
- {
- ofstream fout("exam.txt", ios::binary);
- for (auto& q : x)
- {
- 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();
- fout.write(reinterpret_cast<char*>(&familysz), sizeof(familysz));
- fout.write(q.last_name.data(), familysz);
- fout.write(reinterpret_cast<char*>(&namesz), sizeof(namesz));
- fout.write(q.first_name.data(), namesz);
- fout.write(reinterpret_cast<char*>(&midsz), sizeof(midsz));
- fout.write(q.middle_name.data(), midsz);
- fout.write(reinterpret_cast<char*>(&teamsz), sizeof(teamsz));
- fout.write(q.group.data(), teamsz);
- fout.write(reinterpret_cast<char*>(&mksize), sizeof(mksize));
- for (auto& mark : q.marks)
- {
- unsigned short fsz = mark.first.size();
- fout.write(reinterpret_cast<char*>(&fsz), sizeof(fsz));
- fout.write(mark.first.data(), fsz);
- fout.write(reinterpret_cast<char*>(&mark.second), sizeof(mark.second));
- }
- }
- fout.close();
- }
- int main()
- {
- vector<student> list;
- setlocale(LC_ALL, "Russian");
- ifstream fin("exam.txt", ios::binary);
- if(!fin.good())
- {
- ofstream create("exam.txt");
- create.close();
- fin.close();
- }
- else {
- while (!fin.eof())
- {
- student guy;
- string str1, str2, str3, str4, str5;
- unsigned short marks = 0;
- unsigned short sz1 = 0, sz2 = 0, sz3 = 0, sz4 = 0, sz5 = 0;
- /*фамилия*/
- fin.read(reinterpret_cast<char*>(&sz1), sizeof(sz1));
- str1.resize(sz1);
- fin.read(&str1[0], sz1);
- guy.last_name = str1;
- /*имя*/
- fin.read(reinterpret_cast<char*>(&sz2), sizeof(sz2));
- str2.resize(sz2);
- fin.read(&str2[0], sz2);
- guy.first_name = str2;
- /*отчество*/
- fin.read(reinterpret_cast<char*>(&sz3), sizeof(sz3));
- str3.resize(sz3);
- fin.read(&str3[0], sz3);
- guy.middle_name = str3;
- /*группа*/
- fin.read(reinterpret_cast<char*>(&sz4), sizeof(sz4));
- str4.resize(sz4);
- fin.read(&str4[0], sz4);
- guy.group = str4;
- map<string, unsigned short> subject;
- fin.read(reinterpret_cast<char*>(&sz5), sizeof(sz5)); /*кол-во оценок*/
- unsigned short siz = 0, siz2 = 0;
- for (unsigned short sub = 0; sub < sz5; sub++)
- {
- fin.read(reinterpret_cast<char*>(&siz), sizeof(siz));
- str5.resize(siz);
- fin.read(&str5[0], siz);
- fin.read(reinterpret_cast<char*>(&siz2), sizeof(siz2));
- guy.marks[str5] = siz2;
- }
- if (!guy.first_name.empty())/*проверка на пустоту файла*/
- list.push_back(guy);
- }
- fin.close(); /*считали*/
- }
- unsigned short choise = 0; /*главный выбор*/
- while (choise != 7)
- {
- puts("1. Список студентов\n");
- puts("2. Добавить студента\n");
- puts("3. Редактировать студента\n");
- puts("4. Удалить студента\n");
- puts("5. Показать отличников\n");
- puts("6. Показать неуспевающих\n");
- puts("7. Выход\n");
- puts("Введите цифру действия:");
- student guy;
- string str;
- string yes, news, subject;
- bool csearch = false;
- bool fsearch = false;
- bool search = false;
- bool seek = false;
- bool seek2 = false;
- unsigned short ch_ch = 0; /*выбор изменений*/
- unsigned short stud_ch = 0; /*выбор ученика*/
- scanf("%hu", &choise);
- switch (choise)
- {
- case 1:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- puts("Список студентов:");
- if (list.empty())
- puts("Учеников пока что нет в базе данных.\n");
- for (unsigned short q = 0; q < list.size(); q++)
- {
- printf("\n===%hu===\n", q + 1);
- cout << "Фамилия: " << list[q].last_name << endl;
- cout << "Имя: " << list[q].first_name << endl;
- cout << "Отчество: " << list[q].middle_name << endl;
- cout << "Группа: " << list[q].group << endl;
- puts("Оценки:\n");
- for (auto& mark : list[q].marks)
- cout << mark.first << ": " << mark.second << endl;
- }
- break;
- case 2:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- puts("Добавление нового ученика:\n");
- puts("Введите фамилию: ");
- cin >> str;
- puts("\nВы уверены, что это именно та фамилия? Для подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- guy.last_name = str;
- puts("\nВведите имя: ");
- cin >> str;
- puts("\nВы уверены, что это именно то имя? Для подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- guy.first_name = str;
- puts("\nВведите отчество: ");
- cin >> str;
- puts("\nВы уверены, что это именно то отчество? Для подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- guy.middle_name = str;
- puts("\nВведите группу: ");
- cin >> str;
- puts("\nВы уверены, что это именно та группа? Для подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- guy.group = str;
- puts("Что бы подтвердить все действия введите YES, иначе что-то другое");
- cin >> str;
- if (str == "YES")
- list.push_back(guy);
- save(list);
- break;
- case 3:
- puts("\nВы уверены, что хотите изменять данные о студенте? Для подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- puts("Редактирование студентов:\n");
- if (list.empty())
- {
- puts("Студентов нет в базе данных.");
- break;
- }
- for (unsigned short q = 0; q < list.size(); q++)
- cout << q + 1 << ". " << list[q].last_name << " " << list[q].first_name << " " << list[q].middle_name <<" (" << list[q].group << ")" << endl;
- do
- {
- puts("Введите номер студента: ");
- scanf("%hu", &stud_ch);
- if (stud_ch > list.size() || stud_ch < 1)
- puts("Такого студента нет.\n");
- }
- while (stud_ch > list.size() || stud_ch < 1);
- while (ch_ch != 8)
- {
- puts("Что вы хотите изменить?\n");
- puts("1. Изменить фамилию\n");
- puts("2. Изменить имя\n");
- puts("3. Изменить отчество\n");
- puts("4. Изменить группу\n");
- puts("5. Добавить оценку\n");
- puts("6. Изменить оценку\n");
- puts("7. Удалить оценку\n");
- puts("8. Назад\n");
- puts("Введите номер: ");
- scanf("%hu", &ch_ch);
- switch (ch_ch)
- {
- case 1:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- puts("\nНа какую фамилию вы хотите заменить:\n");
- cin >> news;
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes == "YES")
- {
- list[stud_ch - 1].last_name = news;
- puts("\nУспешно заменено!\n");
- }
- save(list);
- break;
- case 2:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- puts("\nНа какое имя вы хотите заменить:\n");
- cin >> news;
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes == "YES")
- {
- list[stud_ch - 1].first_name = news;
- puts("\nУспешно заменено!\n");
- }
- save(list);
- break;
- case 3:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- puts("\nНа какое отчество вы хотите заменить:\n");
- cin >> news;
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes == "YES")
- {
- list[stud_ch - 1].middle_name = news;
- puts("\nУспешно заменено!\n");
- }
- save(list);
- break;
- case 4:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- puts("\nНа какую группу вы хотите заменить:\n");
- cin >> news;
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes == "YES")
- {
- list[stud_ch - 1].group = news;
- puts("\nУспешно заменено!\n");
- }
- save(list);
- break;
- case 5:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- do
- {
- fsearch = false;
- puts("Для добавления оценки выберите предмет, которого нет у ученика: ");
- cin >> subject;
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- else
- {
- for (auto& mark : list[stud_ch - 1].marks)
- if (mark.first == subject)
- {
- fsearch = true;
- break;
- }
- if (fsearch)
- puts("\nТакой предмет ученик сдавал.\n");
- else
- {
- puts("Введите оценку: ");
- unsigned short newmark = 0;
- do
- {
- scanf("%hu", &newmark);
- if (newmark < 2 || newmark > 5)
- puts("Такой оценки нет. Введите другую оценку: ");
- }
- while (newmark < 2 || newmark > 5);
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- else
- {
- list[stud_ch - 1].marks[subject] = newmark;
- puts("\nУспешно добавлено!\n");
- break;
- }
- }
- }
- }
- while (fsearch);
- save(list);
- break;
- case 6:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- do
- {
- csearch = false;
- puts("Для изменения оценки выберите предмет, который ученик уже сдал: ");
- cin >> subject;
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- else
- {
- for (auto& mark : list[stud_ch - 1].marks)
- if (mark.first == subject)
- {
- csearch = true;
- break;
- }
- if (!csearch)
- puts("\nТакой предмет ученик не сдавал.\n");
- else
- {
- puts("Введите оценку: ");
- unsigned short tnewmark = 0;
- do
- {
- scanf("%hu", &tnewmark);
- if (tnewmark < 2 || tnewmark > 5)
- puts("Такой оценки нет. Введите другую оценку: ");
- }
- while (tnewmark < 2 || tnewmark > 5);
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- else
- {
- bool test = false;
- for (auto it = list[stud_ch - 1].marks.begin(); it != list[stud_ch - 1].marks.end();++it)
- if (it->first == subject)
- {
- list[stud_ch - 1].marks[subject] = tnewmark;
- puts("\nУспешно заменено!\n");
- test = true;
- break;
- }
- }
- }
- }
- }
- while (!csearch);
- save(list);
- break;
- case 7:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- do
- {
- search = false;
- puts("Выберите предмет, оценку в котором хотите удалить: ");
- cin >> subject;
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- else
- {
- for (auto& mark : list[stud_ch - 1].marks)
- if (mark.first == subject)
- {
- search = true;
- break;
- }
- if (!search)
- puts("\nТакой предмет ученик не сдавал.\n");
- else
- {
- bool test = false;
- for (auto it = list[stud_ch - 1].marks.begin(); it != list[stud_ch - 1].marks.end(); ++it)
- if (it->first == subject)
- {
- list[stud_ch - 1].marks.erase(it->first);
- puts("\nУспешно удалено!\n");
- test = true;
- break;
- }
- }
- }
- }
- while (!search);
- save(list);
- break;
- case 8:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- break;
- default:
- puts("Такой команды нет.\n");
- break;
- }
- }
- break;
- case 4:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- puts("Удаление студентов\n");
- for (unsigned short q = 0; q < list.size(); q++)
- cout << q + 1 << ". " << list[q].last_name << " " << list[q].first_name << " " << list[q].middle_name <<" (" << list[q].group << ")" << endl;
- do
- {
- puts("Введите номер студента: ");
- scanf("%hu", &stud_ch);
- if (stud_ch > list.size() || stud_ch < 1)
- puts("Такого студента нет.\n");
- }
- while (stud_ch > list.size() || stud_ch < 1);
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- list.erase(list.begin() + stud_ch - 1);
- puts("\nСтудент удалён.\n");
- save(list);
- break;
- case 5:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- puts("Отличниики:");
- for (unsigned short q = 0; q < list.size(); q++)
- {
- bool zadrot = true;
- if (list[q].marks.empty())
- zadrot = false;
- for (auto& mark : list[q].marks)
- if (mark.second != 5)
- {
- zadrot = false;
- break;
- }
- if (zadrot)
- {
- seek = true;
- printf("\n===%hu===\n", q + 1);
- cout << "Фамилия: " << list[q].last_name << endl;
- cout << "Имя: " << list[q].first_name << endl;
- cout << "Отчество: " << list[q].middle_name << endl;
- cout << "Группа: " << list[q].group << endl;
- puts("Оценки:\n");
- for (auto& mark : list[q].marks)
- cout << mark.first << ": " << mark.second << endl;
- }
- }
- if (!seek)
- puts("\nК сожалению, отличников нет.\n");
- seek = false;
- break;
- case 6:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- puts("Неуспевающие:");
- for (unsigned short q = 0; q < list.size(); q++)
- {
- bool krasava = false;
- for (auto& mark : list[q].marks)
- if (mark.second == 2)
- {
- krasava = true;
- break;
- }
- if (krasava)
- {
- seek2 = true;
- printf("\n===%hu===\n", q + 1);
- cout << "Фамилия: " << list[q].last_name << endl;
- cout << "Имя: " << list[q].first_name << endl;
- cout << "Отчество: " << list[q].middle_name << endl;
- cout << "Группа: " << list[q].group << endl;
- puts("Оценки:\n");
- for (auto& mark : list[q].marks)
- cout << mark.first << ": " << mark.second << endl;
- }
- }
- if (!seek2)
- puts("\nК счастью, неуспевающих нет.\n");
- seek2 = false;
- break;
- case 7:
- puts("\nДля подтверждения введите YES, иначе что-то другое: ");
- cin >> yes;
- if (yes != "YES")
- break;
- break;
- default:
- puts("Такой команды нет.");
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment