Advertisement
LittleMax

Untitled

May 15th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <iterator>
  5. #include <string>
  6. #include <fstream>
  7. #define SIZE 2
  8. using namespace std;
  9.  
  10. //Enumeration ответственный за месяцы
  11. enum month {
  12.     jan = 1, feb, mar, apr, may, june, jul, aug, sep, oct, nov, dec
  13. };
  14.  
  15. //Структуры для фио студента
  16. typedef struct _fio {
  17.     char name[30];
  18.     char surname[30];
  19. }fio;
  20.  
  21. //Структура для даты рождения студента
  22. typedef struct _date {
  23.     int day;
  24.     month mon;
  25.     int year;
  26. }date;
  27.  
  28. struct Student {
  29.     fio fi;
  30.     char major[30];
  31.     date born;
  32.     int group;
  33.  
  34.     Student() {}
  35.  
  36.     Student(char name[30], char surname[30], char major[30], int grp, int day, month mon, int year)
  37.     {
  38.         memcpy(this->fi.name, name, sizeof(name));
  39.         memcpy(this->fi.surname, surname, sizeof(surname));
  40.         memcpy(this->major, major, sizeof(major));
  41.         this->born.mon = mon;
  42.         this->born.day = day;
  43.         this->born.year = year;
  44.         this->group = grp;
  45.     }
  46.  
  47. };
  48.  
  49. //Функция для нахождения только по профилю
  50. void findMajor(Student* st, char major[30])
  51. {
  52.     for (int i = 0; i < SIZE; i++)
  53.     {
  54.         if (!strcmp(major, st[i].major))//Если профиль студента совпадает с указаным, то выводим инфу о студенте
  55.         {
  56.             cout << "Name: " << st[i].fi.name << endl;
  57.             cout << "Surname: " << st[i].fi.surname << endl;
  58.             cout << "Major: " << st[i].major << endl;
  59.             cout << "Group number: " << st[i].group << endl;
  60.             cout << "Born date: " << st[i].born.day << "  " << st[i].born.mon << "  " << st[i].born.year << endl;
  61.             cout << "___________________" << endl;
  62.         }
  63.     }
  64. }
  65.  
  66. //Функция для нахождения студентов по группе
  67. void findGroup(Student* st, char major[30], int group)
  68. {
  69.     vector<string> names;//Создаем массив в который будем класть имена студентов из искомой группы
  70.     for (int i = 0; i < SIZE; i++)
  71.     {
  72.         //strcmp сравнивает 2 строки указываем профиль который ищем и профиль у каждого студента
  73.         //и проверяем что б совпадал номер группы
  74.         if (!strcmp(major, st[i].major) && group == st[i].group)
  75.         {
  76.             names.push_back(st[i].fi.name);// Кладем имя в наш массив
  77.         }
  78.     }
  79.  
  80.     //Вызываем функцию для сортировки массива
  81.     sort(names.begin(), names.end());
  82.  
  83.     //Выводим отсортированный массив
  84.     for (int i = 0; i < names.size(); i++)
  85.     {
  86.         cout << names[i] << endl;
  87.     }
  88.  
  89.  
  90. }
  91.  
  92. //Функция для сохранения данных о студентах в файл "data.txt"
  93. void save(Student* st)
  94. {
  95.     //Создаем поток записи в файл и открываем сам файл
  96.     ofstream file;
  97.     file.open("data.txt");
  98.  
  99.     //По очереди заносим данные каждого студента через пробел, данные разных студентов начинаются с новых строк
  100.     for (int i = 0; i < SIZE; i++)
  101.     {
  102.         file << st[i].fi.name << " " << st[i].fi.surname << " " << st[i].major
  103.             << " " << st[i].group << " " << st[i].born.day << " " << st[i].born.mon << " " << st[i].born.year << endl;
  104.     }
  105.     //Закрываем файл
  106.     file.close();
  107. }
  108.  
  109. //Функция для инициализации массива студентов
  110. void init_students(Student* st)
  111. {
  112.     for (int i = 0; i < SIZE; i++)
  113.     {
  114.         //Создаем массивы в которые будем класть значение введенные пользователем
  115.         char name[30];
  116.         char surname[30];
  117.         char major[30];
  118.         int mon;
  119.         int day, year;
  120.         fio fi;
  121.         int group;
  122.  
  123.         cout << "Enter name, surname, major, group , day, month and year of new student" << endl;
  124.         //Вводим значения
  125.         cin >> name >> surname >> major >> group >> day >> mon >> year;
  126.  
  127.         //используем функцию memory copy(копирование памяти) для того что б положить значения в структуру нашего массива студентов
  128.         memcpy(st[i].fi.name, name, sizeof(name));
  129.         memcpy(st[i].fi.surname, surname, sizeof(surname));
  130.         memcpy(st[i].major, major, sizeof(major));
  131.  
  132.         //В предыдущих использовали memcpy так как там были строки. Здесь просто присваивание
  133.        
  134.         st[i].born.mon = (month)mon;
  135.         st[i].group = group;
  136.         st[i].born.day = day;
  137.         st[i].born.year = year;
  138.     }
  139.  
  140.     save(st);
  141. }
  142.  
  143.  
  144. //Функция для загрузки данных о студентах из файла "data.txt"
  145. void load(Student* st)
  146. {
  147.     //Создаем массивы в которые будем класть значения из файла
  148.     char name[30];
  149.     char surname[30];
  150.     char major[30];
  151.     int mon;
  152.     int group, day, year;
  153.     //Открываем поток чтения из файла и открываем его
  154.     ifstream file("data.txt");
  155.    
  156.     //проверяем если файл открыт то считываем данные каждого студента в наш массив
  157.     if (file.is_open())
  158.     {
  159.         for (int i = 0; i < SIZE; i++)
  160.         {
  161.             //Считываем данные в переменные и затем заносим в наш массив со студентами
  162.             file >> name >> surname >> major >> group >> day >> mon >> year;
  163.            
  164.             memcpy(st[i].fi.name, name, sizeof(name));
  165.             memcpy(st[i].fi.surname, surname, sizeof(surname));
  166.             memcpy(st[i].major, major, sizeof(major));
  167.  
  168.             st[i].born.mon = (month)mon;
  169.             st[i].group = group;
  170.             st[i].born.day = day;
  171.             st[i].born.year = year;
  172.         }
  173.         file.close();
  174.     }
  175.     else
  176.         cout << "Unable to open file" << endl; //Если файл не открыт значит произошла ошибка, выводим сообщение
  177. }
  178.  
  179. //Отрисовать всех студентов на экран
  180. void printStudents(Student* st)
  181. {
  182.     //просто выводим данные каждого студента в таком виде
  183.     for (int i = 0; i < SIZE; i++)
  184.     {
  185.         cout << "Name: " << st[i].fi.name << endl;
  186.         cout << "Surname: " << st[i].fi.surname << endl;
  187.         cout << "Major: " << st[i].major << endl;
  188.         cout << "Group number: " << st[i].group << endl;
  189.         cout << "Date of birth: " << st[i].born.day << " /" << st[i].born.mon << "/ " << st[i].born.year << endl;
  190.         cout << "___________________" << endl;
  191.     }
  192. }
  193.  
  194. //Находим самого младшего студента
  195. void findYoungest(Student* st)
  196. {
  197.     //Создаем студента и предпологаем что самый младший это первый студент
  198.     Student y;
  199.     y.born.day = st[0].born.day;
  200.     y.born.mon = st[0].born.mon;
  201.     y.born.year = st[0].born.year;
  202.  
  203.     for (int i = 0; i < SIZE; i++)
  204.     {
  205.         //Проверяем если какой то студент родился позже значит он самый младший, обновляем студента y, которого создали
  206.         if (st[i].born.year > y.born.year)
  207.         {
  208.             y = st[i];
  209.             cout << y.fi.name << endl;
  210.         }
  211.         else if (st[i].born.year == y.born.year)
  212.         {
  213.             if (st[i].born.mon > y.born.mon)
  214.             {
  215.                 y = st[i];
  216.             }
  217.             else if (st[i].born.mon == y.born.mon)
  218.             {
  219.                 if (st[i].born.day > y.born.day)
  220.                 {
  221.                     y = st[i];
  222.                 }
  223.             }
  224.         }
  225.  
  226.     }
  227.  
  228.     //Выводим на экран самого младшего студента
  229.     cout << "Name: " << y.fi.name << endl;
  230.     cout << "Surname: " << y.fi.surname << endl;
  231.     cout << "Major: " << y.major << endl;
  232.     cout << "Group number: " << y.group << endl;
  233.     cout << "Date of birth: " << y.born.day << " /" << y.born.mon << "/ " << y.born.year << endl;
  234.     cout << "___________________" << endl;
  235. }
  236.  
  237. //Находим самого старшего студента
  238. void findOldest(Student* st)
  239. {
  240.     //Логика точно такая же как и с младшим студентом
  241.     //Только теперь нам нужен старший
  242.     Student y;
  243.     y.born.day = st[0].born.day;
  244.     y.born.mon = st[0].born.mon;
  245.     y.born.year = st[0].born.year;
  246.  
  247.     for (int i = 0; i < SIZE; i++)
  248.     {
  249.         //Проверяем если какой то студент родился позже значит он самый старший, обновляем студента y, которого создали
  250.         if (st[i].born.year > y.born.year)
  251.         {
  252.             y = st[i];
  253.             cout << y.fi.name << endl;
  254.         }
  255.         else if (st[i].born.year == y.born.year)
  256.         {
  257.             if (st[i].born.mon > y.born.mon)
  258.             {
  259.                 y = st[i];
  260.             }
  261.             else if (st[i].born.mon == y.born.mon)
  262.             {
  263.                 if (st[i].born.day > y.born.day)
  264.                 {
  265.                     y = st[i];
  266.                 }
  267.             }
  268.         }
  269.  
  270.     }
  271.  
  272.     cout << "Name: " << y.fi.name << endl;
  273.     cout << "Surname: " << y.fi.surname << endl;
  274.     cout << "Major: " << y.major << endl;
  275.     cout << "Group number: " << y.group << endl;
  276.     cout << "Date of birth: " << y.born.day << " /" << y.born.mon << "/ " << y.born.year << endl;
  277.     cout << "___________________" << endl;
  278. }
  279.  
  280. int main()
  281. {
  282.     Student* st = new Student[SIZE];  //Создаем массив нашей структуры с размером SIZE
  283.     while (true)
  284.     {
  285.         load(st);
  286.         cout << "_______________________________________" << endl;
  287.         cout << "Enter all data about students  ------ 1" << endl;
  288.         cout << "Print all students ------------------ 2" << endl;
  289.         cout << "Find by group and major ------------- 3" << endl;
  290.         cout << "Find youngest student --------------- 4" << endl;
  291.         cout << "Exit -------------------------------- 5" << endl;
  292.         cout << "_______________________________________" << endl;
  293.  
  294.         char major[30];
  295.         int group;
  296.         int input;
  297.         cin >> input;
  298.  
  299.         switch (input)
  300.         {
  301.         case 1:
  302.             init_students(st);
  303.             break;
  304.         case 2:
  305.             printStudents(st);
  306.             break;
  307.         case 3:
  308.             cout << "Enter major and group" << endl;
  309.             cin >> major >> group;
  310.             findGroup(st, major, group);
  311.             break;
  312.         case 4:
  313.             findYoungest(st);
  314.             break;
  315.         case 5:
  316.             return 0;
  317.         default:
  318.             cout << "Enter one of the numbers" << endl;
  319.             break;
  320.         }
  321.     }
  322.  
  323.     return 0;
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement