Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- #include <algorithm>
- #include <math.h>
- #include <map>
- #include <fstream>
- #include <ostream>
- #include <iomanip>
- #include <set>
- #include <sstream>
- using namespace std;
- class Date {
- public:
- Date() {}
- Date(int yearArg, int monthArg, int dayArg) {
- year = yearArg;
- month = monthArg;
- day = dayArg;
- }
- int GetYear() const {
- return year;
- }
- int GetMonth() const {
- return month;
- }
- int GetDay() const {
- return day;
- }
- private:
- int year, month, day;
- };
- bool operator<(const Date &lhs, const Date &rhs) {
- if (lhs.GetYear() != rhs.GetYear()) {
- return lhs.GetYear() < rhs.GetYear();
- }
- if (lhs.GetMonth() != rhs.GetMonth()) {
- return lhs.GetMonth() < rhs.GetMonth();
- }
- return lhs.GetDay() < rhs.GetDay();
- }
- ostream &operator<<(ostream &stream, const Date &date) {
- stream << setfill('0');
- stream << setw(4) << date.GetYear() << "-"
- << setw(2) << date.GetMonth() << "-"
- << setw(2) << date.GetDay();
- return stream;
- }
- istream& operator>>(istream& stream, Date& date) {
- int year, month, day;
- char def1, def2;
- string datName;
- string error;
- stream >> datName;
- stringstream dateStream;
- dateStream.str(datName);
- if (dateStream >> year >> def1 >> month >> def2 >> day) {
- if (def1 != '-' || def2 != '-') {
- error = "Wrong date format: " + datName;
- throw runtime_error(error);
- }
- else if (dateStream.peek() != EOF) {
- error = "Wrong date format: " + datName;
- throw runtime_error(error);
- }
- else if (month < 1 || month > 12) {
- error = "Month value is invalid: " + to_string(month);
- throw runtime_error(error);
- }
- else if (day < 1 || day > 31) {
- error = "Day value is invalid: " + to_string(day);
- throw runtime_error(error);
- }
- }
- else {
- error = "Wrong date format: " + datName;
- throw runtime_error(error);
- }
- date = Date(year, month, day);
- return stream;
- }
- class Database {
- public:
- void AddEvent(const Date &date, const string &event) {
- db[date].insert(event);
- }
- bool DeleteEvent(const Date &date, const string &event) {
- if (db.count(date) == 0) {
- return false;
- }
- if (db[date].count(event) > 0) {
- db[date].erase(event);
- return true;
- }
- return false;
- }
- int DeleteDate(const Date &date) {
- if (db.count(date) == 0) {
- return 0;
- }
- int count = db[date].size();
- db.erase(date);
- return count;
- }
- vector<string> Find(const Date &date) const {
- if (db.count(date) == 0) {
- return {};
- }
- set<string> events = db.at(date);
- vector<string> result(events.begin(), events.end());
- sort(begin(result), end(result));
- return result;
- }
- void Print() const {
- vector<Date> dates;
- for (const auto& [key, value] : db) {
- dates.push_back(key);
- }
- sort(begin(dates), end(dates));
- for (const auto& date: dates) {
- set<string> events = db.at(date);
- vector<string> result(events.begin(), events.end());
- sort(begin(result), end(result));
- for (const auto& res: result) {
- cout << date << " " << res << endl;
- }
- }
- }
- private:
- map<Date, set<string>> db;
- };
- int main() {
- Database db;
- string line;
- string command;
- while (getline(cin, line)) {
- stringstream stream(line);
- if (line.empty()) {
- continue;
- }
- stream >> command;
- if (command == "Add") {
- string event;
- Date currentDate;
- try {
- stream >> currentDate;
- } catch (runtime_error& error) {
- cout << error.what() << endl;
- return 0;
- }
- stream >> event;
- db.AddEvent(currentDate, event);
- } else if (command == "Del") {
- string event;
- Date currentDate;
- try {
- stream >> currentDate;
- } catch (runtime_error& error) {
- cout << error.what() << endl;
- return 0;
- }
- stream >> event;
- if (!event.empty()) {
- bool isRemove = db.DeleteEvent(currentDate, event);
- cout << (isRemove ? "Deleted successfully" : "Event not found") << endl;
- } else {
- int count = db.DeleteDate(currentDate);
- cout << "Deleted " + to_string(count) + " events" << endl;
- }
- } else if (command == "Find") {
- Date currentDate;
- try {
- stream >> currentDate;
- } catch (runtime_error& error) {
- cout << error.what() << endl;
- return 0;
- }
- vector<string> events = db.Find(currentDate);
- for (int i = 0; i < events.size(); i++) {
- if (i == 0) {
- cout << events[i];
- continue;
- }
- cout << " " << events[i];
- }
- if (!events.empty()) {
- cout << endl;
- }
- } else if (command == "Print") {
- db.Print();
- } else {
- cout << "Unknown command: " + command;
- return 0;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement