Advertisement
NickAndNick

Астрология на селе

Jul 6th, 2024
859
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.51 KB | Software | 0 0
  1. #include <algorithm>
  2. #include <array>
  3. #include <iomanip>
  4. #include <iostream>
  5. #include <sstream>
  6. #include <string>
  7.  
  8. using namespace std;
  9.  
  10. struct ZNAK {
  11.     enum class Zodiac {
  12.         Овен = 1,
  13.         Телец,
  14.         Близнецы,
  15.         Рак,
  16.         Лев,
  17.         Дева,
  18.         Весы,
  19.         Скорпион,
  20.         Стрелец,
  21.         Козерог,
  22.         Водолей,
  23.         Рыбы
  24.     };
  25.  
  26.     ZNAK() : sign(Zodiac::Овен), date_of_birth{ 0, 0, 0 } {}
  27.  
  28.     string name;
  29.     Zodiac sign;
  30.     int date_of_birth[3];
  31.  
  32.     bool in_month(const int month) const {
  33.         return date_of_birth[1] == month;
  34.     }
  35. private:
  36.     template<typename T>
  37.     T input(istream& inp, const string& prompt) {
  38.         cout << prompt;
  39.         T value{};
  40.         inp >> value;
  41.         inp.ignore(0x1000, '\n');
  42.         return value;
  43.     }
  44.  
  45.     template<>
  46.     string input(istream& inp, const string& prompt) {
  47.         cout << prompt;
  48.         string line;
  49.         getline(inp, line);
  50.         return line;
  51.     }
  52.  
  53.     inline static const char* signs[]{
  54.         "Овен",
  55.         "Телец",
  56.         "Близнецы",
  57.         "Рак",
  58.         "Лев",
  59.         "Дева",
  60.         "Весы",
  61.         "Скорпион",
  62.         "Стрелец",
  63.         "Козерог",
  64.         "Водолей",
  65.         "Рыбы"
  66.     };
  67.  
  68.     string show() const {
  69.         stringstream ss;
  70.         auto n = 0;
  71.         for (const auto& item : signs) {
  72.             ss << setw(2) << ++n << ". " << item << '\n';
  73.         }
  74.         return ss.str();
  75.     }
  76.  
  77.     string date_string() const {
  78.         string date;
  79.         if (date_of_birth[0] < 10) date = "0";
  80.         date += to_string(date_of_birth[0]) + ".";
  81.         if (date_of_birth[1] < 10) date += "0";
  82.         date += to_string(date_of_birth[1]) + "." + to_string(date_of_birth[2]);
  83.         return date;
  84.     }
  85.  
  86.     friend istream& operator>>(istream& inp, Zodiac& zodiac) {
  87.         int sign;
  88.         inp >> sign;
  89.         switch (sign) {
  90.         case 1: zodiac = Zodiac::Овен; break;
  91.         case 2: zodiac = Zodiac::Телец; break;
  92.         case 3: zodiac = Zodiac::Близнецы; break;
  93.         case 4: zodiac = Zodiac::Рак; break;
  94.         case 5: zodiac = Zodiac::Лев; break;
  95.         case 6: zodiac = Zodiac::Дева; break;
  96.         case 7: zodiac = Zodiac::Весы; break;
  97.         case 8: zodiac = Zodiac::Скорпион; break;
  98.         case 9: zodiac = Zodiac::Стрелец; break;
  99.         case 10: zodiac = Zodiac::Козерог; break;
  100.         case 11: zodiac = Zodiac::Водолей; break;
  101.         case 12: zodiac = Zodiac::Рыбы; break;
  102.         }
  103.         return inp;
  104.     }
  105.  
  106.     friend istream& operator>>(istream& inp, ZNAK& znak) {
  107.         znak.name = znak.input<string>(inp, "Фамилия, имя: ");
  108.         znak.sign = znak.input<Zodiac>(inp, znak.show() + ">>> ");
  109.         cout << "Введите дату рождения\n";
  110.         znak.date_of_birth[0] = znak.input<int>(inp, " - день: ");
  111.         znak.date_of_birth[1] = znak.input<int>(inp, " - месяц: ");
  112.         znak.date_of_birth[2] = znak.input<int>(inp, " - год: ");
  113.         return inp;
  114.     }
  115.  
  116.     friend ostream& operator<<(ostream& out, const ZNAK& znak) {
  117.         out << znak.name << ", "
  118.             << znak.date_string() << ", "
  119.             << znak.signs[size_t(znak.sign) - 1];
  120.         return out;
  121.     }
  122.  
  123.     friend bool operator<(const ZNAK& a, const ZNAK& b) {
  124.         if (a.sign < b.sign) return true;
  125.         else if (a.sign == b.sign) {
  126.             return a.date_of_birth[1] < b.date_of_birth[1];
  127.             if (a.date_of_birth[1] == b.date_of_birth[1]) {
  128.                 return a.date_of_birth[0] < b.date_of_birth[0];
  129.                 if (a.date_of_birth[0] == b.date_of_birth[0]) {
  130.                     return a.date_of_birth[2] < b.date_of_birth[2];
  131.                 }
  132.                 return a.name < b.name;
  133.             }
  134.         }
  135.         return false;
  136.     }
  137. };
  138.  
  139. int main() {
  140.     array<ZNAK, 3> table;
  141.     for (auto& record : table) cin >> record;
  142.     sort(table.begin(), table.end());
  143.     for (const auto& record : table) cout << record << '\n';
  144.     cout << "Введите месяц: ";
  145.     int month;
  146.     cin >> month;
  147.     size_t n = 0;
  148.     for (const auto& record : table) {
  149.         if (record.in_month(month)) {
  150.             cout << setw(2) << ++n << ". " << record << '\n';
  151.         }
  152.     }
  153.     if (!n) puts("Соответствия не обнаружены!");
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement