Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <windows.h>
- #define DATE_FIELDS 3
- #define MAX_PEOPLE 10
- #define MIN_PEOPLE 3
- #define DAY_INDEX 0
- #define MONTH_INDEX 1
- #define YEAR_INDEX 2
- #define MIN_YEAR 1890
- #define MAX_YEAR 2023
- #define MIN_MONTH 1
- #define MAX_MONTH 12
- #define MIN_DAY 1
- #define MAX_DEF_DAY 31
- #define MAX_SHORTER_DAY 30
- #define MAX_FEB_DAY 29
- #define DEF_FEB_DAY 28
- #define YEAR_CHECK 4
- #define FEBRUARY 2
- #define APRIL 4
- #define JUNE 6
- #define SEPTEMBER 9
- #define NOVEMBER 11
- #define FEB_MARK 2
- #define SHORTER_MARK 1
- #define DEFAULT_MARK 0
- using namespace std;
- class Person {
- private:
- string name;
- int birthDate[DATE_FIELDS];
- string address;
- public:
- //задаём значения полям класса
- void setInfo(string name, string address, int birthDate[DATE_FIELDS]) {
- this->name = name;
- this->address = address;
- for (int i = 0; i < DATE_FIELDS; i++)
- this->birthDate[i] = birthDate[i];
- }
- //выводим значения полей класса
- void printInfo(void) {
- cout << "Ф.И.О. - " << this->name << "\nДень рождения - ";
- for (int i = 0; i < DATE_FIELDS; i++) {
- if (i > 0)
- cout << ".";
- cout << this->birthDate[i];
- }
- cout << "\nАдрес - " << this->address << endl;
- }
- };
- int getInt(int, int);//прототип функции
- //выдаём маркер для определённых месяцев, т.к. число дней отличается в каждом
- int checkMonth(int month) {
- switch (month) {
- case FEBRUARY:
- return FEB_MARK;
- case APRIL:
- return SHORTER_MARK;
- case JUNE:
- return SHORTER_MARK;
- case SEPTEMBER:
- return SHORTER_MARK;
- case NOVEMBER:
- return SHORTER_MARK;
- default:
- return DEFAULT_MARK;
- }
- }
- int* getBirthDate(void) {
- int birthDate[DATE_FIELDS] = {0};
- cout << "Введите год рождения: ";
- birthDate[YEAR_INDEX] = getInt(MIN_YEAR, MAX_YEAR);
- cout << "Введите месяц рождения: ";
- birthDate[MONTH_INDEX] = getInt(MIN_MONTH, MAX_MONTH);
- cout << "Введите день рождения: ";
- switch (checkMonth(birthDate[MONTH_INDEX])) {
- case DEFAULT_MARK:
- birthDate[DAY_INDEX] = getInt(MIN_DAY, MAX_DEF_DAY);//по стандарту 31 день
- break;
- case SHORTER_MARK:
- birthDate[DAY_INDEX] = getInt(MIN_DAY, MAX_SHORTER_DAY);//если 4 6 9 11 месяцы - 30 дней
- break;
- case FEB_MARK:
- birthDate[DAY_INDEX] = getInt(MIN_DAY, birthDate[YEAR_INDEX] % YEAR_CHECK ? DEF_FEB_DAY : MAX_FEB_DAY);//если високосный, можно 29 дней, иначе - 28
- break;
- }
- return birthDate;
- }
- // то же самое, что и в предыдущей
- int getInt(int min, int max) {
- int value;
- bool isCorrect;
- do {
- isCorrect = true;
- cin >> value;
- if (cin.fail()) {
- cout << "Введено некорректное значение. Введите число ещё раз.\n";
- isCorrect = false;
- cin.clear();
- while (cin.get() != '\n');
- }
- if (value > max || value < min) {
- cout << "Число выходит за границы [" << min << ";" << max << "]. Введите число ещё раз.\n";
- isCorrect = false;
- }
- } while (!isCorrect);
- return value;
- }
- int main() {
- SetConsoleOutputCP(1251);
- SetConsoleCP(1251);
- cout << "Введите число человек: ";
- int peopleCount = getInt(MIN_PEOPLE, MAX_PEOPLE);
- Person* people = new Person[peopleCount];
- string name, address;
- int* birth;
- for (int i = 0; i < peopleCount; i++) {
- while (cin.get() != '\n');
- cout << "Введите имя человека - ";
- getline(cin, name);
- cout << "Введите адрес человека - ";
- getline(cin, address);
- birth = getBirthDate();
- people[i].setInfo(name, address, birth);
- }
- for (int i = 0; i < peopleCount; i++) {
- cout << endl;
- people[i].printInfo();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement