Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "iostream"
- #include "string"
- #include "map"
- #include "set"
- #include "algorithm"
- #include "sstream"
- #include "iomanip"
- using namespace std;
- // Реализуйте функции и методы классов и при необходимости добавьте свои
- class Date {
- public:
- Date() { year = 0; month = 0; day = 0; }
- Date(int new_year, int new_month, int new_day) {
- if (new_month > 12 || new_month < 1) {
- string error = "Month value is invalid: " + to_string(new_month);
- throw runtime_error(error);
- }
- else if (new_day < 1 || new_day > 31) {
- string error = "Day value is invalid: " + to_string(new_day);
- throw runtime_error(error);
- }
- else {
- year = new_year;
- month = new_month;
- day = new_day;
- }
- }
- int GetYear() const { return year; };
- int GetMonth() const { return month; };
- int GetDay() const { return day; };
- private:
- int year;
- int month;
- int day;
- };
- bool operator<(const Date& lhs, const Date& rhs) {
- if (lhs.GetYear() != rhs.GetYear()) {
- return lhs.GetYear() < rhs.GetYear();
- }
- else if (lhs.GetMonth() != rhs.GetMonth()) {
- return lhs.GetMonth() < rhs.GetMonth();
- }
- else {
- return lhs.GetDay() < rhs.GetDay();
- }
- };
- ostream& operator<<(ostream& stream, const Date& date) {
- stream << setfill('0') << setw(4)
- << to_string(date.GetYear()) << "-";
- stream << setfill('0') << setw(2)
- << to_string(date.GetMonth()) << "-";
- stream << setfill('0') << setw(2)
- << to_string(date.GetDay());
- 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) {
- if (count(begin(db[date]), end(db[date]), event) > 0) { // ищем количество событий в дате и если событий больше одного
- db[date].erase(event); // удаляем текущее событие из даты
- return true;
- }
- else return false;
- }
- };
- int DeleteDate(const Date& date) {
- if (db.count(date) == 0) {
- return 0;
- }
- else {
- int N = db[date].size();
- db[date].clear();
- return N;
- }
- };
- set<string>Find(const Date& date) const {
- if (db.count(date) > 0) { // если дата есть в базе
- return db.at(date); // вернем значение
- }
- };
- void Print() const {
- for (auto& item : db) {
- for (auto i : item.second) {
- cout << item.first << " " << i << endl;
- }
- }
- };
- private:
- map<Date, set<string>> db;
- };
- void EnsureNextSymbolAndSkip(stringstream& stream, const string& date_string) {
- if (stream.peek() != '-' ) { //
- string errorDateFormat = "Wrong date formate: " + date_string; //
- throw runtime_error(errorDateFormat);
- }
- stream.ignore(1);
- }
- Date ParseDate(const string& date_string) {
- stringstream stream(date_string);
- int year, month, day;
- stream >> year;
- EnsureNextSymbolAndSkip(stream, date_string);
- //проверяем не явл. ли символ после"-" концом строки, если является это ошибка
- if(stream.peek()== EOF){
- string errorDateFormat = "Wrong date formate: " + date_string; //
- throw runtime_error(errorDateFormat);
- }
- stream >> month;
- EnsureNextSymbolAndSkip(stream, date_string);
- //проверяем не явл. ли символ после"-" концом строки, если является это ошибка
- if(stream.peek()== EOF){
- string errorDateFormat = "Wrong date formate: " + date_string; //
- throw runtime_error(errorDateFormat);
- }
- stream >> day;
- if(stream.eof()){
- return Date(year,month,day);
- } else {
- string errorDateFormat = "Wrong date formate: " + date_string; //
- throw runtime_error(errorDateFormat);
- }
- };
- int main() {
- Database db;
- string command;
- while (getline(cin, command)) {
- stringstream stream(command);
- string operation = "";
- stream >> operation;
- try {
- if (operation == "") {
- continue;
- }
- string data_string, events;
- stream >> data_string >> events;
- if (operation == "Add") {
- Date date = ParseDate(data_string);
- db.AddEvent(date, events);
- }
- else if (operation == "Del") {
- Date date = ParseDate(data_string);
- if (events == "") {
- cout << "Deleted " << db.DeleteDate(date) << " events" << endl;
- }
- else {
- if (db.DeleteEvent(date, events) == 1) {
- cout << "Deleted successfully" << endl;
- }
- else cout << "Event not found" << endl;
- }
- }
- else if (operation == "Find") {
- Date date = ParseDate(data_string);
- set<string> result = db.Find(date);
- for (auto x : result) {
- cout << x << endl;
- }
- }
- else if (operation == "Print") {
- db.Print();
- }
- else cout << "Unknown command: " << operation << endl;
- }
- catch (exception & ex) {
- cout << ex.what()<< endl;
- return 1;
- }
- }
- return 0;
- }
- /* тестовые наборы
- Wrong date format:
- Add (без даты)
- Add 1--1-f event1
- Add 1-1-1- event1
- Add 1-2-3*f
- Add 1-0 event1
- Add 1-0-9- event1
- Add 2001-9-0- event1
- Add a1-1-1 a
- Add a1-1-1a a
- Add - event1
- Add 0 event1
- Add 1-0- event1
- Add 1-0- event1
- Month value is invalid:
- Add 1-0-999 event1
- Add 1-999-1 event1
- Add 1-0-1 a
- Add 1--1-1 event1
- Add 1--1--1 event1
- Day value is invalid:
- Add 1-1-0 a
- Add 1-1--1 event1*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement