Advertisement
Cinder1986

lab17 c++

Feb 2nd, 2023
687
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <windows.h>
  4.  
  5. #define DATE_FIELDS 3
  6. #define MAX_PEOPLE 10
  7. #define MIN_PEOPLE 3
  8. #define DAY_INDEX 0
  9. #define MONTH_INDEX 1
  10. #define YEAR_INDEX 2
  11. #define MIN_YEAR 1890
  12. #define MAX_YEAR 2023
  13. #define MIN_MONTH 1
  14. #define MAX_MONTH 12
  15. #define MIN_DAY 1
  16. #define MAX_DEF_DAY 31
  17. #define MAX_SHORTER_DAY 30
  18. #define MAX_FEB_DAY 29
  19. #define DEF_FEB_DAY 28
  20. #define YEAR_CHECK 4
  21.  
  22. #define FEBRUARY 2
  23. #define APRIL 4
  24. #define JUNE 6
  25. #define SEPTEMBER 9
  26. #define NOVEMBER 11
  27.  
  28. #define FEB_MARK 2
  29. #define SHORTER_MARK 1
  30. #define DEFAULT_MARK 0
  31.  
  32. using namespace std;
  33.  
  34. class Person {
  35. private:
  36.     string name;
  37.     int birthDate[DATE_FIELDS];
  38.     string address;
  39. public:
  40.     //задаём значения полям класса
  41.     void setInfo(string name, string address, int birthDate[DATE_FIELDS]) {
  42.         this->name = name;
  43.         this->address = address;
  44.         for (int i = 0; i < DATE_FIELDS; i++)
  45.             this->birthDate[i] = birthDate[i];
  46.     }
  47.     //выводим значения полей класса
  48.     void printInfo(void) {
  49.         cout << "Ф.И.О. - " << this->name << "\nДень рождения - ";
  50.         for (int i = 0; i < DATE_FIELDS; i++) {
  51.             if (i > 0)
  52.                 cout << ".";
  53.             cout << this->birthDate[i];
  54.         }
  55.         cout << "\nАдрес - " << this->address << endl;
  56.     }
  57. };
  58.  
  59. int getInt(int, int);//прототип функции
  60. //выдаём маркер для определённых месяцев, т.к. число дней отличается в каждом
  61. int checkMonth(int month) {
  62.     switch (month) {
  63.     case FEBRUARY:
  64.         return FEB_MARK;
  65.     case APRIL:
  66.         return SHORTER_MARK;
  67.     case JUNE:
  68.         return SHORTER_MARK;
  69.     case SEPTEMBER:
  70.         return SHORTER_MARK;
  71.     case NOVEMBER:
  72.         return SHORTER_MARK;
  73.     default:
  74.         return DEFAULT_MARK;
  75.     }
  76. }
  77.  
  78. int* getBirthDate(void) {
  79.     int birthDate[DATE_FIELDS] = {0};
  80.     cout << "Введите год рождения: ";
  81.     birthDate[YEAR_INDEX] = getInt(MIN_YEAR, MAX_YEAR);
  82.     cout << "Введите месяц рождения: ";
  83.     birthDate[MONTH_INDEX] = getInt(MIN_MONTH, MAX_MONTH);
  84.     cout << "Введите день рождения: ";
  85.     switch (checkMonth(birthDate[MONTH_INDEX])) {
  86.     case DEFAULT_MARK:
  87.         birthDate[DAY_INDEX] = getInt(MIN_DAY, MAX_DEF_DAY);//по стандарту 31 день
  88.         break;
  89.     case SHORTER_MARK:
  90.         birthDate[DAY_INDEX] = getInt(MIN_DAY, MAX_SHORTER_DAY);//если 4 6 9 11 месяцы - 30 дней
  91.         break;
  92.     case FEB_MARK:
  93.         birthDate[DAY_INDEX] = getInt(MIN_DAY, birthDate[YEAR_INDEX] % YEAR_CHECK ? DEF_FEB_DAY : MAX_FEB_DAY);//если високосный, можно 29 дней, иначе - 28
  94.         break;
  95.     }
  96.     return birthDate;
  97. }
  98. // то же самое, что и в предыдущей
  99. int getInt(int min, int max) {
  100.     int value;
  101.     bool isCorrect;
  102.     do {
  103.         isCorrect = true;
  104.         cin >> value;
  105.         if (cin.fail()) {
  106.             cout << "Введено некорректное значение. Введите число ещё раз.\n";
  107.             isCorrect = false;
  108.             cin.clear();
  109.             while (cin.get() != '\n');
  110.         }
  111.         if (value > max || value < min) {
  112.             cout << "Число выходит за границы [" << min << ";" << max << "]. Введите число ещё раз.\n";
  113.             isCorrect = false;
  114.         }
  115.     } while (!isCorrect);
  116.     return value;
  117. }
  118.  
  119. int main() {
  120.     SetConsoleOutputCP(1251);
  121.     SetConsoleCP(1251);
  122.     cout << "Введите число человек: ";
  123.     int peopleCount = getInt(MIN_PEOPLE, MAX_PEOPLE);
  124.     Person* people = new Person[peopleCount];
  125.     string name, address;
  126.     int* birth;
  127.     for (int i = 0; i < peopleCount; i++) {
  128.         while (cin.get() != '\n');
  129.         cout << "Введите имя человека - ";
  130.         getline(cin, name);
  131.         cout << "Введите адрес человека - ";
  132.         getline(cin, address);
  133.         birth = getBirthDate();
  134.         people[i].setInfo(name, address, birth);
  135.     }
  136.     for (int i = 0; i < peopleCount; i++) {
  137.         cout << endl;
  138.         people[i].printInfo();
  139.     }
  140.     return 0;
  141. }
  142.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement