Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <iterator>
- #include <string>
- #include <fstream>
- #define SIZE 2
- using namespace std;
- //Enumeration ответственный за месяцы
- enum month {
- jan = 1, feb, mar, apr, may, june, jul, aug, sep, oct, nov, dec
- };
- //Структуры для фио студента
- typedef struct _fio {
- char name[30];
- char surname[30];
- }fio;
- //Структура для даты рождения студента
- typedef struct _date {
- int day;
- month mon;
- int year;
- }date;
- struct Student {
- fio fi;
- char major[30];
- date born;
- int group;
- Student() {}
- Student(char name[30], char surname[30], char major[30], int grp, int day, month mon, int year)
- {
- memcpy(this->fi.name, name, sizeof(name));
- memcpy(this->fi.surname, surname, sizeof(surname));
- memcpy(this->major, major, sizeof(major));
- this->born.mon = mon;
- this->born.day = day;
- this->born.year = year;
- this->group = grp;
- }
- };
- //Функция для нахождения только по профилю
- void findMajor(Student* st, char major[30])
- {
- for (int i = 0; i < SIZE; i++)
- {
- if (!strcmp(major, st[i].major))//Если профиль студента совпадает с указаным, то выводим инфу о студенте
- {
- cout << "Name: " << st[i].fi.name << endl;
- cout << "Surname: " << st[i].fi.surname << endl;
- cout << "Major: " << st[i].major << endl;
- cout << "Group number: " << st[i].group << endl;
- cout << "Born date: " << st[i].born.day << " " << st[i].born.mon << " " << st[i].born.year << endl;
- cout << "___________________" << endl;
- }
- }
- }
- //Функция для нахождения студентов по группе
- void findGroup(Student* st, char major[30], int group)
- {
- vector<string> names;//Создаем массив в который будем класть имена студентов из искомой группы
- for (int i = 0; i < SIZE; i++)
- {
- //strcmp сравнивает 2 строки указываем профиль который ищем и профиль у каждого студента
- //и проверяем что б совпадал номер группы
- if (!strcmp(major, st[i].major) && group == st[i].group)
- {
- names.push_back(st[i].fi.name);// Кладем имя в наш массив
- }
- }
- //Вызываем функцию для сортировки массива
- sort(names.begin(), names.end());
- //Выводим отсортированный массив
- for (int i = 0; i < names.size(); i++)
- {
- cout << names[i] << endl;
- }
- }
- //Функция для сохранения данных о студентах в файл "data.txt"
- void save(Student* st)
- {
- //Создаем поток записи в файл и открываем сам файл
- ofstream file;
- file.open("data.txt");
- //По очереди заносим данные каждого студента через пробел, данные разных студентов начинаются с новых строк
- for (int i = 0; i < SIZE; i++)
- {
- file << st[i].fi.name << " " << st[i].fi.surname << " " << st[i].major
- << " " << st[i].group << " " << st[i].born.day << " " << st[i].born.mon << " " << st[i].born.year << endl;
- }
- //Закрываем файл
- file.close();
- }
- //Функция для инициализации массива студентов
- void init_students(Student* st)
- {
- for (int i = 0; i < SIZE; i++)
- {
- //Создаем массивы в которые будем класть значение введенные пользователем
- char name[30];
- char surname[30];
- char major[30];
- int mon;
- int day, year;
- fio fi;
- int group;
- cout << "Enter name, surname, major, group , day, month and year of new student" << endl;
- //Вводим значения
- cin >> name >> surname >> major >> group >> day >> mon >> year;
- //используем функцию memory copy(копирование памяти) для того что б положить значения в структуру нашего массива студентов
- memcpy(st[i].fi.name, name, sizeof(name));
- memcpy(st[i].fi.surname, surname, sizeof(surname));
- memcpy(st[i].major, major, sizeof(major));
- //В предыдущих использовали memcpy так как там были строки. Здесь просто присваивание
- st[i].born.mon = (month)mon;
- st[i].group = group;
- st[i].born.day = day;
- st[i].born.year = year;
- }
- save(st);
- }
- //Функция для загрузки данных о студентах из файла "data.txt"
- void load(Student* st)
- {
- //Создаем массивы в которые будем класть значения из файла
- char name[30];
- char surname[30];
- char major[30];
- int mon;
- int group, day, year;
- //Открываем поток чтения из файла и открываем его
- ifstream file("data.txt");
- //проверяем если файл открыт то считываем данные каждого студента в наш массив
- if (file.is_open())
- {
- for (int i = 0; i < SIZE; i++)
- {
- //Считываем данные в переменные и затем заносим в наш массив со студентами
- file >> name >> surname >> major >> group >> day >> mon >> year;
- memcpy(st[i].fi.name, name, sizeof(name));
- memcpy(st[i].fi.surname, surname, sizeof(surname));
- memcpy(st[i].major, major, sizeof(major));
- st[i].born.mon = (month)mon;
- st[i].group = group;
- st[i].born.day = day;
- st[i].born.year = year;
- }
- file.close();
- }
- else
- cout << "Unable to open file" << endl; //Если файл не открыт значит произошла ошибка, выводим сообщение
- }
- //Отрисовать всех студентов на экран
- void printStudents(Student* st)
- {
- //просто выводим данные каждого студента в таком виде
- for (int i = 0; i < SIZE; i++)
- {
- cout << "Name: " << st[i].fi.name << endl;
- cout << "Surname: " << st[i].fi.surname << endl;
- cout << "Major: " << st[i].major << endl;
- cout << "Group number: " << st[i].group << endl;
- cout << "Date of birth: " << st[i].born.day << " /" << st[i].born.mon << "/ " << st[i].born.year << endl;
- cout << "___________________" << endl;
- }
- }
- //Находим самого младшего студента
- void findYoungest(Student* st)
- {
- //Создаем студента и предпологаем что самый младший это первый студент
- Student y;
- y.born.day = st[0].born.day;
- y.born.mon = st[0].born.mon;
- y.born.year = st[0].born.year;
- for (int i = 0; i < SIZE; i++)
- {
- //Проверяем если какой то студент родился позже значит он самый младший, обновляем студента y, которого создали
- if (st[i].born.year > y.born.year)
- {
- y = st[i];
- cout << y.fi.name << endl;
- }
- else if (st[i].born.year == y.born.year)
- {
- if (st[i].born.mon > y.born.mon)
- {
- y = st[i];
- }
- else if (st[i].born.mon == y.born.mon)
- {
- if (st[i].born.day > y.born.day)
- {
- y = st[i];
- }
- }
- }
- }
- //Выводим на экран самого младшего студента
- cout << "Name: " << y.fi.name << endl;
- cout << "Surname: " << y.fi.surname << endl;
- cout << "Major: " << y.major << endl;
- cout << "Group number: " << y.group << endl;
- cout << "Date of birth: " << y.born.day << " /" << y.born.mon << "/ " << y.born.year << endl;
- cout << "___________________" << endl;
- }
- //Находим самого старшего студента
- void findOldest(Student* st)
- {
- //Логика точно такая же как и с младшим студентом
- //Только теперь нам нужен старший
- Student y;
- y.born.day = st[0].born.day;
- y.born.mon = st[0].born.mon;
- y.born.year = st[0].born.year;
- for (int i = 0; i < SIZE; i++)
- {
- //Проверяем если какой то студент родился позже значит он самый старший, обновляем студента y, которого создали
- if (st[i].born.year > y.born.year)
- {
- y = st[i];
- cout << y.fi.name << endl;
- }
- else if (st[i].born.year == y.born.year)
- {
- if (st[i].born.mon > y.born.mon)
- {
- y = st[i];
- }
- else if (st[i].born.mon == y.born.mon)
- {
- if (st[i].born.day > y.born.day)
- {
- y = st[i];
- }
- }
- }
- }
- cout << "Name: " << y.fi.name << endl;
- cout << "Surname: " << y.fi.surname << endl;
- cout << "Major: " << y.major << endl;
- cout << "Group number: " << y.group << endl;
- cout << "Date of birth: " << y.born.day << " /" << y.born.mon << "/ " << y.born.year << endl;
- cout << "___________________" << endl;
- }
- int main()
- {
- Student* st = new Student[SIZE]; //Создаем массив нашей структуры с размером SIZE
- while (true)
- {
- load(st);
- cout << "_______________________________________" << endl;
- cout << "Enter all data about students ------ 1" << endl;
- cout << "Print all students ------------------ 2" << endl;
- cout << "Find by group and major ------------- 3" << endl;
- cout << "Find youngest student --------------- 4" << endl;
- cout << "Exit -------------------------------- 5" << endl;
- cout << "_______________________________________" << endl;
- char major[30];
- int group;
- int input;
- cin >> input;
- switch (input)
- {
- case 1:
- init_students(st);
- break;
- case 2:
- printStudents(st);
- break;
- case 3:
- cout << "Enter major and group" << endl;
- cin >> major >> group;
- findGroup(st, major, group);
- break;
- case 4:
- findYoungest(st);
- break;
- case 5:
- return 0;
- default:
- cout << "Enter one of the numbers" << endl;
- break;
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment