fork download
  1. #include <iostream>
  2. #include <exception>
  3. #include <string>
  4. #include <ctime>
  5. #include <sstream>
  6. #include <system_error>
  7. #include <set>
  8. #include <map>
  9. using namespace std;
  10.  
  11.  
  12. class Date {
  13.  
  14. public:
  15.  
  16. Date(){}
  17.  
  18. Date(long int y, int m, int d){
  19.  
  20. string string_y = to_string(y);
  21. string string_m = to_string(m);
  22. string string_d = to_string(d);
  23.  
  24. year = y;
  25. month = m;
  26. day = d;
  27.  
  28. string zero_y="";
  29.  
  30. if(string_y.size()>=4){
  31. } else if(string_y.size()<4 && year>0){
  32. string zeros_y((4-string_y.size()), '0');
  33. zero_y=zeros_y;
  34. }
  35.  
  36. string zeros_m((2-string_m.size()), '0');
  37. string zeros_d((2-string_d.size()), '0');
  38.  
  39. data = zero_y + string_y + "-" + zeros_m + string_m + "-" + zeros_d + string_d;
  40.  
  41.  
  42. }
  43.  
  44. int GetYear() const{
  45. return year;
  46. }
  47. int GetMonth() const{
  48. return month;
  49. }
  50. int GetDay() const{
  51. return day;
  52. }
  53.  
  54. string GetDate() const{
  55. return data;
  56. }
  57.  
  58.  
  59. private:
  60.  
  61. long int year;
  62. int month;
  63. int day;
  64. string data;
  65. };
  66.  
  67. bool operator<(const Date& lhs, const Date& rhs){
  68. if(lhs.GetYear() < rhs.GetYear()){
  69. return true;
  70. } else if(lhs.GetYear()==rhs.GetYear() && lhs.GetMonth() < rhs.GetMonth()){
  71. return true;
  72. } else if(lhs.GetYear()==rhs.GetYear() && lhs.GetMonth() == rhs.GetMonth() && lhs.GetDay()<rhs.GetDay()){
  73. return true;
  74. } else return false;
  75.  
  76. }
  77.  
  78. class Database {
  79.  
  80. public:
  81.  
  82. Database(){
  83. basa;
  84. }
  85.  
  86. void AddEvent(const Date& date, const string& event){
  87.  
  88. basa[date].insert(event);
  89.  
  90. }
  91.  
  92. bool DeleteEvent(const Date& date, const string& event){
  93.  
  94. set <string>::iterator it;
  95.  
  96. if(basa.count(date)>0){
  97. it = basa.at(date).find(event);
  98. if(basa.at(date).empty() || it==basa.at(date).end()){
  99. return false;
  100. } else {
  101. basa.at(date).erase(basa.at(date).find(event));
  102. if(basa.at(date).empty()) basa.erase(date);
  103. return true;
  104. }
  105. } else return false;
  106.  
  107. }
  108.  
  109. int DeleteDate(const Date& date){
  110.  
  111. int N;
  112.  
  113. if(basa.count(date)>0){
  114. N = basa.at(date).size();
  115. basa.erase(date);
  116. } else N=0;
  117.  
  118. return N;
  119.  
  120. }
  121.  
  122. void Find(const Date& date) {
  123.  
  124. if(basa.count(date)>0){
  125. for(const auto& item: basa.at(date)){
  126. cout<<item<<endl;
  127. }
  128. }
  129. }
  130.  
  131.  
  132. void Print() const{
  133.  
  134. Date dt;
  135.  
  136. int negat_num=0;
  137.  
  138. for(const auto& it:basa){
  139. if(it.first.GetYear()<0){
  140. negat_num++;
  141. }
  142. }
  143.  
  144. if(basa.begin()->first.GetYear()<0){ //если первый год меньше 0
  145. for(const auto& it : basa){
  146. if(it.first.GetYear()<0){
  147. cout<<"";
  148. }
  149. else if(it.first.GetYear()>=0){
  150. string datik = it.first.GetDate();
  151. for(const auto& item: it.second){
  152. cout<<datik<<" "<<item<<endl;
  153. }
  154. }
  155. }
  156. }
  157.  
  158. else{ //Если первый год больше 0
  159. for(const auto& it: basa){
  160. for(const auto& item : it.second){
  161. string datik = it.first.GetDate();
  162. cout<<datik<<" "<<item<<endl;
  163. }
  164. }
  165. }
  166. }
  167.  
  168. void Clear() {
  169. basa.clear();
  170. }
  171.  
  172. private:
  173.  
  174. map <Date, set <string> > basa;
  175.  
  176.  
  177.  
  178.  
  179. };
  180.  
  181.  
  182. ostream& operator<<(ostream& stream, const Date& d){
  183. stream<<d.GetDate();
  184. return stream;
  185. }
  186.  
  187. istream& operator>>(istream& ss, Date& d){
  188.  
  189.  
  190. long int year;
  191. int month, day;
  192. char def1, def2;
  193.  
  194. string wrongdate;
  195. ss>>wrongdate;
  196.  
  197. stringstream stream(wrongdate);
  198.  
  199.  
  200.  
  201. int indicator=0;
  202.  
  203. if(!(stream.rdbuf()->in_avail()==0)){
  204. stream>>year;
  205. stream>>def1;
  206. if(def1!='-'){
  207. indicator=2;
  208. stringstream wformat;
  209. wformat<<"Wrong date format: "<<wrongdate<<endl;
  210. throw runtime_error(wformat.str());
  211. }
  212. else if(def1=='-'){
  213. stream>>month;
  214. if(month==0 && to_string(month)!="0"){
  215. indicator=2;
  216. stringstream wformat;
  217. wformat<<"Wrong date format: "<<wrongdate<<endl;
  218. throw runtime_error(wformat.str());
  219. } else {
  220. stream>>def2;
  221. if(def2!='-'){
  222. indicator=2;
  223. stringstream wformat;
  224. wformat<<"Wrong date format: "<<wrongdate<<endl;
  225. throw runtime_error(wformat.str());
  226. } else if(def2=='-'){
  227. stream>>day;
  228. if(day==0 && to_string(day)!="0"){
  229. indicator=2;
  230. stringstream wformat;
  231. wformat<<"Wrong date format: "<<wrongdate<<endl;
  232. throw runtime_error(wformat.str());
  233. } if(!stream.eof()){
  234. indicator=2;
  235. stringstream wformat;
  236. wformat<<"Wrong date format: "<<wrongdate<<endl;
  237. throw runtime_error(wformat.str());
  238. }
  239.  
  240. }}} indicator=1; } else {}
  241.  
  242. if(indicator==1){
  243. if(month>12 || month<1){
  244. stringstream ss;
  245. ss<<"Month value is invalid: "<<to_string(month)<<endl;
  246. throw runtime_error(ss.str());
  247. } else if(day>31 || day<1){
  248. stringstream ss;
  249. ss<<"Day value is invalid: "<<to_string(day)<<endl;
  250. throw runtime_error(ss.str());
  251. } else d = {year, month, day};
  252.  
  253. } else if(indicator==2){}
  254.  
  255. if(indicator==1 || indicator==2) return stream;
  256.  
  257. }
  258.  
  259.  
  260. int main() {
  261. Database db;
  262. string event;
  263.  
  264. map <string, int> commands = {{"Add", 1}, {"Del", 2}, {"Find", 3}, {"Print", 4}};
  265.  
  266. string command;
  267. string dothis;
  268.  
  269. Date dt;
  270. db.Clear();
  271.  
  272. while (getline(cin, command)) {
  273.  
  274. stringstream ss(command);
  275. if(command!=""){
  276. ss>>dothis;
  277. ss.ignore(1);
  278.  
  279. switch(commands[dothis]) {
  280. case 1:
  281. try{
  282. ss>>dt;
  283. ss.ignore(1);
  284. ss>>event;
  285. db.AddEvent(dt, event);
  286. } catch (exception& ex){
  287. cout<<ex.what();
  288. }
  289. break;
  290. case 2:
  291. if(!(ss.rdbuf()->in_avail())==0){
  292. try{
  293. ss>>dt;
  294. ss.ignore(1);
  295. if(ss.eof()){
  296. int N=db.DeleteDate(dt);
  297. cout<<"Deleted "<<N<<" events"<<endl;
  298. } else {
  299. ss>>event;
  300. if(db.DeleteEvent(dt, event)==true){
  301. cout<<"Deleted successfully"<<endl;
  302. }
  303. else cout<<"Event not found"<<endl;
  304. }
  305.  
  306. } catch (exception& ex){
  307. cout<<ex.what();
  308. }} else cout<<"Deleted 0 events"<<endl;
  309. break;
  310. case 3:
  311. try{
  312. ss>>dt;
  313. db.Find(dt);
  314. } catch (exception& ex){
  315. cout<<ex.what();
  316. }
  317. break;
  318. case 4:
  319. db.Print();
  320. break;
  321. default :
  322. {
  323. if(dothis!=""){
  324. cout << "Unknown command: "<<dothis<<endl;
  325. } else {
  326. break;
  327. };
  328. }
  329.  
  330. }
  331. }
  332. }
  333.  
  334.  
  335. return 0;
  336. }
Success #stdin #stdout 0s 4284KB
stdin
Add 1-1-1 t1
Del 12-12-12
Print
Add 1-0-1 t1
stdout
Deleted 0 events
0001-01-01 t1
Month value is invalid: 0