Advertisement
Guest User

Untitled

a guest
Jan 29th, 2020
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.62 KB | None | 0 0
  1. #include <string>
  2. #include <iostream>
  3. #include <map>
  4. #include <set>
  5. #include <sstream>
  6. #include <iomanip>
  7. #include <exception>
  8. #include <stdexcept>
  9.  
  10. // Реализуйте функции и методы классов и при необходимости добавьте свои
  11.  
  12. using namespace std;
  13.  
  14. class Date {
  15. public:
  16.     Date() {
  17.         year = 0;
  18.         month = 0;
  19.         day = 0;
  20.     }
  21.  
  22.     Date(int newYear, int newMonth, int newDay) {
  23.         if (newMonth < 0 || newMonth > 12) {
  24.             throw invalid_argument("Month value is invalid: " +
  25.                 to_string(newMonth));
  26.         }
  27.  
  28.         if (newDay < 1 || newDay > 31) {
  29.             throw invalid_argument("Day value is invalid: " +
  30.                 to_string(newDay));
  31.         }
  32.  
  33.         year = newYear;
  34.         month = newMonth;
  35.         day = newDay;
  36.     }
  37.  
  38.     int GetYear() const {
  39.         return year;
  40.     }
  41.  
  42.     int GetMonth() const {
  43.         return month;
  44.     }
  45.  
  46.     int GetDay() const {
  47.         return day;
  48.     }
  49. private:
  50.     int year, month, day;
  51. };
  52.  
  53. bool operator<(const Date& lhs, const Date& rhs) {
  54.     if (lhs.GetYear() == rhs.GetYear()) {
  55.         if (lhs.GetMonth() == rhs.GetMonth()) {
  56.             return lhs.GetDay() < rhs.GetDay();
  57.         } else {
  58.             return lhs.GetMonth() < rhs.GetMonth();
  59.         }
  60.     } else {
  61.         return lhs.GetYear() < rhs.GetYear();
  62.     }
  63. }
  64.  
  65. ostream& operator<<(ostream& stream, const Date& date) {
  66.     stream << setfill('0') << setw(4) << date.GetYear() << "-"
  67.            << setfill('0') << setw(2) << date.GetMonth() << "-"
  68.            << setfill('0') << setw(2) << date.GetDay();
  69.     return stream;     
  70. }
  71.  
  72. istringstream& operator>>(istringstream& stream, Date& date) {
  73.     int year, month, day;
  74.     string errorMsg = "Wrong date format: " + stream.str();
  75.  
  76.     if (!(stream >> year)) {
  77.         throw invalid_argument(errorMsg);
  78.     }
  79.     if (stream.peek() != '-') {
  80.         throw invalid_argument(errorMsg);  
  81.     }
  82.     stream.ignore(1);
  83.    
  84.     if (!(stream >> month)) {
  85.         throw invalid_argument(errorMsg);  
  86.     }
  87.     if (stream.peek() != '-') {
  88.         throw invalid_argument(errorMsg);  
  89.     }
  90.     stream.ignore(1);
  91.    
  92.     if (!(stream >> day)) {
  93.         throw invalid_argument(errorMsg);  
  94.     }
  95.     if (stream.peek() != EOF) {
  96.         throw invalid_argument(errorMsg);  
  97.     }
  98.  
  99.     date = { year, month, day };
  100.    
  101.     return stream;
  102. }
  103.  
  104.  
  105. class Database {
  106. public:
  107.     void AddEvent(const Date& date, const string& event) {
  108.         data[date].insert(event);
  109.     }
  110.    
  111.     bool DeleteEvent(const Date& date, const string& event) {
  112.         if (data.count(date) > 0) {
  113.             if (data[date].count(event) > 0) {
  114.                 data[date].erase(event);
  115.                 return true;
  116.             }
  117.             return false;
  118.         }
  119.  
  120.         return false;
  121.     }
  122.    
  123.     int DeleteDate(const Date& date) {
  124.         int deletedEvents = 0;
  125.        
  126.         if (data.count(date) > 0) {
  127.             deletedEvents = data[date].size();
  128.             data.erase(date);  
  129.         }
  130.  
  131.         return deletedEvents;
  132.     }
  133.  
  134.     void Find(const Date& date) const {
  135.         if (data.count(date) > 0) {
  136.             for (const auto& item : data.at(date)) {
  137.                 cout << item << endl;
  138.             }
  139.         }
  140.     }
  141.  
  142.     void Print() const {
  143.         for (const auto& record : data) {
  144.             for (const auto& event : record.second) {
  145.                 cout << record.first << " " << event << endl;
  146.             }
  147.         }
  148.     }
  149. private:
  150.     map<Date, set<string>> data;
  151. };
  152.  
  153. int main() {
  154.     Database db;
  155.  
  156.     string line;
  157.     while (getline(cin, line)) {
  158.     // Считайте команды с потока ввода и обработайте каждую
  159.         istringstream ss(line);
  160.         string command;
  161.         ss >> command;
  162.  
  163.         if (command == "Add") {
  164.             Date date;
  165.             string dateString;
  166.             ss >> dateString;
  167.             istringstream dateStream(dateString);
  168.            
  169.             string event;
  170.             try {
  171.                 dateStream >> date;
  172.             } catch(const invalid_argument& ex) {
  173.                 cout << ex.what() << endl;
  174.                 return 0;
  175.             }
  176.  
  177.             ss >> event;
  178.             db.AddEvent(date, event);
  179.         } else if (command == "Del") {
  180.             Date date;
  181.             string dateString;
  182.             ss >> dateString;
  183.             istringstream dateStream(dateString);
  184.  
  185.             string event;
  186.             try {
  187.                 dateStream >> date;
  188.             } catch(const invalid_argument& ex) {
  189.                 cout << ex.what() << endl;
  190.                 return 0;
  191.             }
  192.  
  193.             if (!ss.eof()) {
  194.                 ss >> event;
  195.                 if (db.DeleteEvent(date, event)) {
  196.                     cout << "Deleted successfully" << endl;
  197.                 } else {
  198.                     cout << "Event not found" << endl;
  199.                 }
  200.             } else {
  201.                 int deletedCount = db.DeleteDate(date);
  202.                 cout << "Deleted " << deletedCount << " events" << endl;
  203.             }
  204.         } else if (command == "Find") {
  205.             Date date;
  206.             string dateString;
  207.             ss >> dateString;
  208.             istringstream dateStream(dateString);
  209.  
  210.             try {
  211.                 dateStream >> date;
  212.             } catch(const invalid_argument& ex) {
  213.                 cout << ex.what() << endl;
  214.                 return 0;
  215.             }
  216.  
  217.             db.Find(date);
  218.         } else if (command == "Print") {
  219.             db.Print();
  220.         } else if (command != "") {
  221.             cout << "Unknown command: " << command << endl;
  222.             return 0;
  223.         }
  224.     }
  225.  
  226.     return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement