Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <set>
  4. #include <map>
  5. #include <iomanip>
  6. #include <sstream>
  7. #include <vector>
  8. #include <algorithm>
  9. #include <exception>
  10.  
  11. using namespace std;
  12.  
  13. class Date {
  14. public:
  15.     Date(){
  16.         m_year = 0;
  17.         m_month = 1;
  18.         m_day = 1;
  19.     }
  20.     Date(int year, int month, int day) {
  21.         if (month > 12 || month < 1) {
  22.             string error = "Month value is invalid: " + to_string(month);
  23.             throw invalid_argument(error);
  24.         }
  25.         if (day > 31 || day < 1) {
  26.             string error = "Day value is invalid: " + to_string(day);
  27.             throw invalid_argument(error);     
  28.         }
  29.         m_year = year;
  30.         m_month = month;
  31.         m_day = day;
  32.     }
  33.     int GetYear() const{
  34.         return m_year;
  35.     };
  36.     int GetMonth() const{
  37.         return m_month;
  38.     };
  39.     int GetDay() const{
  40.         return m_day;
  41.     };
  42.     int get_total() const{
  43.     //  int tmp = total();
  44.         return total();
  45.     }
  46.  
  47. private:
  48.     int m_year;
  49.     int m_month;
  50.     int m_day;
  51.     int total() const {
  52.         return m_day + m_month * 31 + m_year * 365;
  53.     };
  54. };
  55.  
  56. istream& operator >> (istream& is, Date& d) {
  57.     int year, month, day;
  58.     // if (is >> year && is.ignore(1) && is >> month && is.ignore(1) && is >> day) {
  59.     //  d = Date(year, month, day);
  60.     // }
  61.    
  62.     string error, q;
  63.     is >> error;
  64.     stringstream tmp(error);
  65.     tmp >> year;
  66.     if (tmp.peek() != '-') {
  67.         throw invalid_argument("Wrong date format: " + error);
  68.     }
  69.     tmp.ignore(1);
  70.     tmp >> month;
  71.     if (tmp.peek() != '-') {
  72.         throw invalid_argument("Wrong date format: " + error);
  73.     }
  74.     tmp.ignore(1);
  75.     if (tmp >> day) {
  76.         d = Date(year, month, day);
  77.     } else {
  78.         throw invalid_argument("Wrong date format: " + error);
  79.     }
  80.     if (tmp >> q) {
  81.         throw invalid_argument("Wrong date format: " + error);
  82.     }
  83.     return is;
  84. }
  85.  
  86. ostream& operator << (ostream& os, const Date& d) {
  87.     os << setw(4);
  88.     os << setfill('0');
  89.     return os << d.GetYear() << '-' << setw(2) << d.GetMonth()
  90.                 << '-' << setw(2) << d.GetDay();
  91. }
  92.  
  93. bool operator < (const Date& lhs, const Date& rhs) {
  94.     return lhs.get_total() < rhs.get_total();
  95. };
  96.  
  97. bool operator == (const Date& lhs, const Date& rhs) {
  98.     if (lhs.GetYear() == rhs.GetYear() && lhs.GetMonth() == rhs.GetMonth()
  99.         && lhs.GetDay() == rhs.GetDay()) {
  100.         return true;
  101.     } else {
  102.         return false;
  103.     }
  104. }
  105.  
  106. class Database {
  107. public:
  108.     void check_null(const Date& date) {
  109.         if (date_to_event[date].size() == 0) {
  110.             map<Date, set<string>> :: iterator is_null;
  111.             is_null = date_to_event.find(date);
  112.             date_to_event.erase(is_null);
  113.         }
  114.     };
  115.  
  116.     void AddEvent(const Date& date, const string& event){
  117.         date_to_event[date].insert(event);
  118.         check_null(date);
  119.     };
  120.     bool DeleteEvent(const Date& date, const string& event){
  121.         if (date_to_event[date].count(event)){
  122.             date_to_event[date].erase(event);
  123.             check_null(date);
  124.             cout << "Deleted successfully" << endl;
  125.             return true;
  126.         } else {
  127.             cout << "Event not found" << endl;
  128.             return false;
  129.         }
  130.     };
  131.     int DeleteDate(const Date& date){
  132.         int n = date_to_event[date].size();
  133.         date_to_event[date].clear();
  134.         check_null(date);
  135.         //cout << "Deleted " << n << " events" << endl;
  136.         return n;
  137.     };
  138.  
  139.     vector<string> Find(const Date& date) const{
  140.         if (date_to_event.count(date) > 0) {
  141.             vector<string> events;
  142.             for (const auto& i : date_to_event.at(date)) {
  143.                 events.push_back(i);
  144.             }
  145.             sort(begin(events), end(events));
  146.             return events;
  147.         } else {
  148.             return {};
  149.         }
  150.     };
  151.     void Print() const{
  152.         for (const auto& i : date_to_event) {
  153.             for (const auto& j : i.second) {
  154.                 if (i.first.GetYear() >= 0) {
  155.                     cout << i.first << " " << j << endl;
  156.                 }
  157.             }
  158.         }
  159.         //for (const auto& i : date_to_event) {
  160.         //  string tmp_event;
  161.         //  if (i.first.GetYear() >= 0) {
  162.         //      for (const auto& j : i.second) {
  163.         //              tmp_event += j + " ";
  164.         //      }
  165.         //  int length = tmp_event.length();
  166.         //  tmp_event.resize(length - 1);
  167.         //  cout << i.first << " " << tmp_event << endl;
  168.         //  }  
  169.         //}
  170.     };
  171. private:
  172.     map<Date, set<string>> date_to_event;
  173. };
  174.  
  175. int main() {
  176.     Database db;
  177.     string command;
  178.         try { while (getline(cin, command)) {
  179.                     Date d;
  180.                     string tmp_event, op;
  181.                     stringstream tmp_stream(command);
  182.                     tmp_stream >> op;
  183.                     if (op == "Add") {
  184.                         try {
  185.                             if (tmp_stream >> d >> tmp_event){
  186.                                 db.AddEvent(d, tmp_event);
  187.                             }
  188.                         } catch(invalid_argument& ex) {
  189.                             cout << ex.what() << endl;
  190.                             return -1;
  191.                         }
  192.                        
  193.                     }
  194.                     if (op == "Del") {
  195.                         if (tmp_stream >> d >> tmp_event) {
  196.                             if (db.DeleteEvent(d, tmp_event)) {
  197.                             }
  198.                         } else {
  199.                             int n = db.DeleteDate(d);
  200.                             cout << "Deleted " << n << " events\n";
  201.                         }
  202.                     }
  203.                     if (op == "Find") {
  204.                         tmp_stream >> d;
  205.                         vector<string> v = db.Find(d);
  206.                         for (auto& i : v) {
  207.                             cout << i << endl;
  208.                         }
  209.                        
  210.                     }
  211.                     if (op == "Print") {
  212.                         db.Print();
  213.                     }
  214.                     if (op != "Add" && op != "Del" && op != "Find" && op != "Print" && op != "") {
  215.                         cout << "Unknown command: " << op << endl;
  216.                     }
  217.                 }
  218.         } catch(invalid_argument& ex) {
  219.             cout << ex.what() << endl;
  220.             return -1;
  221.         }
  222.     return 0;
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement