Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <array>
- #include <iomanip>
- #include <iostream>
- #include <sstream>
- #include <string>
- using namespace std;
- struct ZNAK {
- enum class Zodiac {
- Овен = 1,
- Телец,
- Близнецы,
- Рак,
- Лев,
- Дева,
- Весы,
- Скорпион,
- Стрелец,
- Козерог,
- Водолей,
- Рыбы
- };
- ZNAK() : sign(Zodiac::Овен), date_of_birth{ 0, 0, 0 } {}
- string name;
- Zodiac sign;
- int date_of_birth[3];
- bool in_month(const int month) const {
- return date_of_birth[1] == month;
- }
- private:
- template<typename T>
- T input(istream& inp, const string& prompt) {
- cout << prompt;
- T value{};
- inp >> value;
- inp.ignore(0x1000, '\n');
- return value;
- }
- template<>
- string input(istream& inp, const string& prompt) {
- cout << prompt;
- string line;
- getline(inp, line);
- return line;
- }
- inline static const char* signs[]{
- "Овен",
- "Телец",
- "Близнецы",
- "Рак",
- "Лев",
- "Дева",
- "Весы",
- "Скорпион",
- "Стрелец",
- "Козерог",
- "Водолей",
- "Рыбы"
- };
- string show() const {
- stringstream ss;
- auto n = 0;
- for (const auto& item : signs) {
- ss << setw(2) << ++n << ". " << item << '\n';
- }
- return ss.str();
- }
- string date_string() const {
- string date;
- if (date_of_birth[0] < 10) date = "0";
- date += to_string(date_of_birth[0]) + ".";
- if (date_of_birth[1] < 10) date += "0";
- date += to_string(date_of_birth[1]) + "." + to_string(date_of_birth[2]);
- return date;
- }
- friend istream& operator>>(istream& inp, Zodiac& zodiac) {
- int sign;
- inp >> sign;
- switch (sign) {
- case 1: zodiac = Zodiac::Овен; break;
- case 2: zodiac = Zodiac::Телец; break;
- case 3: zodiac = Zodiac::Близнецы; break;
- case 4: zodiac = Zodiac::Рак; break;
- case 5: zodiac = Zodiac::Лев; break;
- case 6: zodiac = Zodiac::Дева; break;
- case 7: zodiac = Zodiac::Весы; break;
- case 8: zodiac = Zodiac::Скорпион; break;
- case 9: zodiac = Zodiac::Стрелец; break;
- case 10: zodiac = Zodiac::Козерог; break;
- case 11: zodiac = Zodiac::Водолей; break;
- case 12: zodiac = Zodiac::Рыбы; break;
- }
- return inp;
- }
- friend istream& operator>>(istream& inp, ZNAK& znak) {
- znak.name = znak.input<string>(inp, "Фамилия, имя: ");
- znak.sign = znak.input<Zodiac>(inp, znak.show() + ">>> ");
- cout << "Введите дату рождения\n";
- znak.date_of_birth[0] = znak.input<int>(inp, " - день: ");
- znak.date_of_birth[1] = znak.input<int>(inp, " - месяц: ");
- znak.date_of_birth[2] = znak.input<int>(inp, " - год: ");
- return inp;
- }
- friend ostream& operator<<(ostream& out, const ZNAK& znak) {
- out << znak.name << ", "
- << znak.date_string() << ", "
- << znak.signs[size_t(znak.sign) - 1];
- return out;
- }
- friend bool operator<(const ZNAK& a, const ZNAK& b) {
- if (a.sign < b.sign) return true;
- else if (a.sign == b.sign) {
- return a.date_of_birth[1] < b.date_of_birth[1];
- if (a.date_of_birth[1] == b.date_of_birth[1]) {
- return a.date_of_birth[0] < b.date_of_birth[0];
- if (a.date_of_birth[0] == b.date_of_birth[0]) {
- return a.date_of_birth[2] < b.date_of_birth[2];
- }
- return a.name < b.name;
- }
- }
- return false;
- }
- };
- int main() {
- array<ZNAK, 3> table;
- for (auto& record : table) cin >> record;
- sort(table.begin(), table.end());
- for (const auto& record : table) cout << record << '\n';
- cout << "Введите месяц: ";
- int month;
- cin >> month;
- size_t n = 0;
- for (const auto& record : table) {
- if (record.in_month(month)) {
- cout << setw(2) << ++n << ". " << record << '\n';
- }
- }
- if (!n) puts("Соответствия не обнаружены!");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement