Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string>
- #include <iostream>
- #include <map>
- #include <set>
- #include <sstream>
- #include <iomanip>
- #include <exception>
- #include <stdexcept>
- // Реализуйте функции и методы классов и при необходимости добавьте свои
- using namespace std;
- class Date {
- public:
- Date() {
- year = 0;
- month = 0;
- day = 0;
- }
- Date(int newYear, int newMonth, int newDay) {
- if (newMonth < 0 || newMonth > 12) {
- throw invalid_argument("Month value is invalid: " +
- to_string(newMonth));
- }
- if (newDay < 1 || newDay > 31) {
- throw invalid_argument("Day value is invalid: " +
- to_string(newDay));
- }
- year = newYear;
- month = newMonth;
- day = newDay;
- }
- 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()) {
- if (lhs.GetMonth() == rhs.GetMonth()) {
- return lhs.GetDay() < rhs.GetDay();
- } else {
- return lhs.GetMonth() < rhs.GetMonth();
- }
- } else {
- return lhs.GetYear() < rhs.GetYear();
- }
- }
- ostream& operator<<(ostream& stream, const Date& date) {
- stream << setfill('0') << setw(4) << date.GetYear() << "-"
- << setfill('0') << setw(2) << date.GetMonth() << "-"
- << setfill('0') << setw(2) << date.GetDay();
- return stream;
- }
- istringstream& operator>>(istringstream& stream, Date& date) {
- int year, month, day;
- string errorMsg = "Wrong date format: " + stream.str();
- if (!(stream >> year)) {
- throw invalid_argument(errorMsg);
- }
- if (stream.peek() != '-') {
- throw invalid_argument(errorMsg);
- }
- stream.ignore(1);
- if (!(stream >> month)) {
- throw invalid_argument(errorMsg);
- }
- if (stream.peek() != '-') {
- throw invalid_argument(errorMsg);
- }
- stream.ignore(1);
- if (!(stream >> day)) {
- throw invalid_argument(errorMsg);
- }
- if (stream.peek() != EOF) {
- throw invalid_argument(errorMsg);
- }
- date = { year, month, day };
- return stream;
- }
- class Database {
- public:
- void AddEvent(const Date& date, const string& event) {
- data[date].insert(event);
- }
- bool DeleteEvent(const Date& date, const string& event) {
- if (data.count(date) > 0) {
- if (data[date].count(event) > 0) {
- data[date].erase(event);
- return true;
- }
- return false;
- }
- return false;
- }
- int DeleteDate(const Date& date) {
- int deletedEvents = 0;
- if (data.count(date) > 0) {
- deletedEvents = data[date].size();
- data.erase(date);
- }
- return deletedEvents;
- }
- void Find(const Date& date) const {
- if (data.count(date) > 0) {
- for (const auto& item : data.at(date)) {
- cout << item << endl;
- }
- }
- }
- void Print() const {
- for (const auto& record : data) {
- for (const auto& event : record.second) {
- cout << record.first << " " << event << endl;
- }
- }
- }
- private:
- map<Date, set<string>> data;
- };
- int main() {
- Database db;
- string line;
- while (getline(cin, line)) {
- // Считайте команды с потока ввода и обработайте каждую
- istringstream ss(line);
- string command;
- ss >> command;
- if (command == "Add") {
- Date date;
- string dateString;
- ss >> dateString;
- istringstream dateStream(dateString);
- string event;
- try {
- dateStream >> date;
- } catch(const invalid_argument& ex) {
- cout << ex.what() << endl;
- return 0;
- }
- ss >> event;
- db.AddEvent(date, event);
- } else if (command == "Del") {
- Date date;
- string dateString;
- ss >> dateString;
- istringstream dateStream(dateString);
- string event;
- try {
- dateStream >> date;
- } catch(const invalid_argument& ex) {
- cout << ex.what() << endl;
- return 0;
- }
- if (!ss.eof()) {
- ss >> event;
- if (db.DeleteEvent(date, event)) {
- cout << "Deleted successfully" << endl;
- } else {
- cout << "Event not found" << endl;
- }
- } else {
- int deletedCount = db.DeleteDate(date);
- cout << "Deleted " << deletedCount << " events" << endl;
- }
- } else if (command == "Find") {
- Date date;
- string dateString;
- ss >> dateString;
- istringstream dateStream(dateString);
- try {
- dateStream >> date;
- } catch(const invalid_argument& ex) {
- cout << ex.what() << endl;
- return 0;
- }
- db.Find(date);
- } else if (command == "Print") {
- db.Print();
- } else if (command != "") {
- cout << "Unknown command: " << command << endl;
- return 0;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement