Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // main.cpp
- // Final_White
- //
- // Created by Robert Bartuli on 18.09.19.
- // Copyright © 2019 Robert Bartuli. All rights reserved.
- //
- #include <iostream>
- #include <map>
- #include <string>
- #include <set>
- #include <algorithm>
- #include <iomanip>
- using namespace std;
- // Реализуйте функции и методы классов и при необходимости добавьте свои
- class Date {
- public:
- int GetYear() const{
- return Year;
- };
- int GetMonth() const{
- return Month;
- };
- int GetDay() const{
- return Day;
- };
- Date(string s){
- string raw_Year={},raw_Month={},raw_Day={};
- if (s[0]=='-' || s[0]=='+') {
- raw_Year=s.substr(0,s.find("-",1));
- }else raw_Year=s.substr(0,s.find("-",0));
- if (s.size()>=raw_Year.size()+1)
- raw_Month=s.substr(raw_Year.size()+1,s.size()-(s.size()-s.rfind("-")+1)-raw_Year.size());
- if (raw_Month[raw_Month.size()-1]=='-') raw_Month=raw_Month.substr(0,raw_Month.size()-1);
- if (s.size()>=raw_Year.size()+raw_Month.size()+2)
- raw_Day=s.substr(raw_Year.size()+raw_Month.size()+2,s.size()-1);
- // cout<<"Year="<<raw_Year<<" Month="<<raw_Month<<" Day="<<raw_Day<<endl;
- //Проверка на посторонние смволы в дате
- string temp1,temp2,temp3;//Дата с удаленными дифисами и + и -
- if (raw_Year[0]=='-' || raw_Year[0]=='+') temp1=raw_Year.substr(1,raw_Year.size()-1);else temp1=raw_Year;
- if (raw_Month[0]=='-' || raw_Month[0]=='+') temp2=raw_Month.substr(1,raw_Month.size()-1);else temp2=raw_Month;
- if (raw_Day[0]=='-' || raw_Day[0]=='+') temp3=raw_Day.substr(1,raw_Day.size()-1);else temp3=raw_Day;
- if ((temp1.size()==0)||(temp2.size()==0)||(temp3.size()==0) ||((temp1+temp2+temp3).find_first_not_of("0123456789")!=-1))
- throw runtime_error("Wrong date format: "+s);
- if (stoi(raw_Month)>12||stoi(raw_Month)<1) throw runtime_error("Month value is invalid: "+raw_Month);
- if (stoi(raw_Day)>12||stoi(raw_Day)<1) throw runtime_error("Day value is invalid: "+raw_Day);
- Year=stoi(raw_Year);
- Month=stoi(raw_Month);
- Day=stoi(raw_Day);
- }
- private:
- int Year;
- int Month;
- int Day;
- };
- bool operator<(const Date& lhs, const Date& rhs){
- if ((lhs.GetYear()==rhs.GetYear())&&(lhs.GetMonth()==rhs.GetMonth())) return (lhs.GetDay()<rhs.GetDay());
- if (lhs.GetYear()==rhs.GetYear()) return (lhs.GetMonth()<rhs.GetMonth());
- return (lhs.GetYear()<rhs.GetYear());
- };
- class Database {
- public:
- void AddEvent(const Date& date, const string& event){
- BD[date].insert(event);
- };
- bool DeleteEvent(const Date& date, const string& event){
- if (BD.count(date) > 0) {
- if (BD.at(date).count(event)>0) {
- BD.at(date).erase(event);
- return true;
- }else return false;
- }else return false;
- };
- int DeleteDate(const Date& date){
- int retur_count;
- if (BD.count(date) > 0) {
- retur_count=BD.at(date).size();
- BD.erase (date);
- return retur_count;
- } else return 0;
- };
- void Find(const Date& date) const{
- if (BD.count(date) > 0) {
- for (auto s:BD.at(date)){
- cout<<s<<endl;
- };
- }
- };
- void Print() const{
- for(auto& s: BD){
- for (auto s_event:s.second){
- cout<<setfill ('0')<<setw(4) <<s.first.GetYear()<<"-"<<setw(2)<<s.first.GetMonth()<<"-"<<setw(2)<<s.first.GetDay();
- cout<<" "<<s_event<<endl;
- };
- };
- };
- private:
- map<Date, set<string>> BD;
- };
- int main() {
- Database db;
- string command,raw_date,raw_event;
- try {
- while (getline(cin, command)) {
- //Обрабатывам команды без параметров
- if (count(command.begin(), command.end(), ' ')==0) {
- if (command=="Print"){
- db.Print();
- } else if (command.size()==0); else throw runtime_error("Unknown command: "+command);
- }
- //Обрабатывам команды с одним параметром
- if (count(command.begin(), command.end(), ' ')==1) {
- if (command.substr(0,command.find(" "))=="Del"){
- //Обработка DEL
- string raw_date=command.substr(4,command.rfind(" ")-4);
- int temp_del=db.DeleteDate(Date(raw_date));
- cout<<"Deleted "<<temp_del<<" events"<<endl;
- } else if (command.substr(0,command.find(" "))=="Find"){
- //Обработка Find
- string raw_date=command.substr(5,command.rfind(" ")-5);
- db.Find(Date(raw_date));
- } if ((command.substr(0,command.find(" "))=="Print")||
- (command.substr(0,command.find(" "))=="Add")||
- (command.substr(0,command.find(" "))=="Del")||
- (command.substr(0,command.find(" "))=="Find")) ;else throw runtime_error("Unknown command: "+command.substr(0,command.find(" ")));
- }
- //Обрабатывам команды с двумя параметрами
- if (count(command.begin(), command.end(), ' ')==2) {
- if (command.substr(0,command.find(" "))=="Del"){
- //Обработка DEL
- string raw_date=command.substr(4,command.rfind(" ")-4);
- string raw_event=command.substr(command.rfind(" ")+1,command.size()-1);
- if (db.DeleteEvent(Date(raw_date),raw_event)) cout<<"Deleted successfully"<<endl;
- else cout<<"Event not found"<<endl;
- } else if (command.substr(0,command.find(" "))=="Add"){
- string raw_date=command.substr(4,command.rfind(" ")-4);
- string raw_event=command.substr(command.rfind(" ")+1,command.size()-1);
- db.AddEvent(Date(raw_date), raw_event);
- } else throw runtime_error("Unknown command: "+command.substr(0,command.find(" ")));
- }
- //Обрабатывам команды c более чем 2-мя параметрами
- if (count(command.begin(), command.end(), ' ')>2) throw runtime_error("Unknown command: "+command.substr(0,command.find(" ")));
- }
- return 0;
- } catch (runtime_error& ex) {
- cout << ex.what()<<endl; return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement