Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.61 KB | None | 0 0
  1. #include "iostream"
  2. #include "string"
  3. #include "map"
  4. #include "set"
  5. #include "algorithm"
  6. #include "sstream"
  7. #include "iomanip"
  8.  
  9. using namespace std;
  10.  
  11. // Реализуйте функции и методы классов и при необходимости добавьте свои
  12. class Date {
  13. public:
  14. Date() { year = 0; month = 0; day = 0; }
  15. Date(int new_year, int new_month, int new_day) {
  16. if (new_month > 12 || new_month < 1) {
  17. string error = "Month value is invalid: " + to_string(new_month);
  18. throw runtime_error(error);
  19. }
  20. else if (new_day < 1 || new_day > 31) {
  21. string error = "Day value is invalid: " + to_string(new_day);
  22. throw runtime_error(error);
  23. }
  24. else {
  25. year = new_year;
  26. month = new_month;
  27. day = new_day;
  28. }
  29. }
  30.  
  31. int GetYear() const { return year; };
  32. int GetMonth() const { return month; };
  33. int GetDay() const { return day; };
  34.  
  35. private:
  36. int year;
  37. int month;
  38. int day;
  39. };
  40.  
  41. bool operator<(const Date& lhs, const Date& rhs) {
  42. if (lhs.GetYear() != rhs.GetYear()) {
  43. return lhs.GetYear() < rhs.GetYear();
  44. }
  45. else if (lhs.GetMonth() != rhs.GetMonth()) {
  46. return lhs.GetMonth() < rhs.GetMonth();
  47. }
  48. else {
  49. return lhs.GetDay() < rhs.GetDay();
  50. }
  51. };
  52. ostream& operator<<(ostream& stream, const Date& date) {
  53. stream << setfill('0') << setw(4)
  54. << to_string(date.GetYear()) << "-";
  55. stream << setfill('0') << setw(2)
  56. << to_string(date.GetMonth()) << "-";
  57. stream << setfill('0') << setw(2)
  58. << to_string(date.GetDay());
  59. return stream;
  60. }
  61. class Database {
  62.  
  63. public:
  64. void AddEvent(const Date& date, const string& event) {
  65. db[date].insert(event);
  66. };
  67.  
  68. bool DeleteEvent(const Date& date, const string& event) {
  69. if (db.count(date) > 0) {
  70. if (count(begin(db[date]), end(db[date]), event) > 0) { // ищем количество событий в дате и если событий больше одного
  71. db[date].erase(event); // удаляем текущее событие из даты
  72. return true;
  73. }
  74. else return false;
  75. }
  76. };
  77. int DeleteDate(const Date& date) {
  78. if (db.count(date) == 0) {
  79. return 0;
  80. }
  81. else {
  82. int N = db[date].size();
  83. db[date].clear();
  84. return N;
  85. }
  86.  
  87. };
  88.  
  89. set<string>Find(const Date& date) const {
  90. if (db.count(date) > 0) { // если дата есть в базе
  91. return db.at(date); // вернем значение
  92. }
  93. };
  94.  
  95. void Print() const {
  96. for (auto& item : db) {
  97. for (auto i : item.second) {
  98. cout << item.first << " " << i << endl;
  99. }
  100. }
  101. };
  102.  
  103. private:
  104. map<Date, set<string>> db;
  105. };
  106.  
  107. void EnsureNextSymbolAndSkip(stringstream& stream, const string& date_string) {
  108. if (stream.peek() != '-' ) { //
  109. string errorDateFormat = "Wrong date formate: " + date_string; //
  110. throw runtime_error(errorDateFormat);
  111. }
  112. stream.ignore(1);
  113.  
  114. }
  115. Date ParseDate(const string& date_string) {
  116. stringstream stream(date_string);
  117. int year, month, day;
  118. stream >> year;
  119. EnsureNextSymbolAndSkip(stream, date_string);
  120. //проверяем не явл. ли символ после"-" концом строки, если является это ошибка
  121. if(stream.peek()== EOF){
  122. string errorDateFormat = "Wrong date formate: " + date_string; //
  123. throw runtime_error(errorDateFormat);
  124. }
  125. stream >> month;
  126. EnsureNextSymbolAndSkip(stream, date_string);
  127. //проверяем не явл. ли символ после"-" концом строки, если является это ошибка
  128. if(stream.peek()== EOF){
  129. string errorDateFormat = "Wrong date formate: " + date_string; //
  130. throw runtime_error(errorDateFormat);
  131. }
  132. stream >> day;
  133. if(stream.eof()){
  134. return Date(year,month,day);
  135. } else {
  136. string errorDateFormat = "Wrong date formate: " + date_string; //
  137. throw runtime_error(errorDateFormat);
  138. }
  139. };
  140.  
  141. int main() {
  142.  
  143. Database db;
  144. string command;
  145. while (getline(cin, command)) {
  146. stringstream stream(command);
  147. string operation = "";
  148. stream >> operation;
  149. try {
  150. if (operation == "") {
  151. continue;
  152. }
  153. string data_string, events;
  154. stream >> data_string >> events;
  155. if (operation == "Add") {
  156. Date date = ParseDate(data_string);
  157. db.AddEvent(date, events);
  158. }
  159. else if (operation == "Del") {
  160. Date date = ParseDate(data_string);
  161. if (events == "") {
  162. cout << "Deleted " << db.DeleteDate(date) << " events" << endl;
  163. }
  164. else {
  165. if (db.DeleteEvent(date, events) == 1) {
  166. cout << "Deleted successfully" << endl;
  167. }
  168. else cout << "Event not found" << endl;
  169. }
  170. }
  171. else if (operation == "Find") {
  172. Date date = ParseDate(data_string);
  173. set<string> result = db.Find(date);
  174. for (auto x : result) {
  175. cout << x << endl;
  176. }
  177. }
  178. else if (operation == "Print") {
  179. db.Print();
  180. }
  181. else cout << "Unknown command: " << operation << endl;
  182. }
  183. catch (exception & ex) {
  184. cout << ex.what()<< endl;
  185. return 1;
  186. }
  187. }
  188. return 0;
  189. }
  190. /* тестовые наборы
  191. Wrong date format:
  192. Add (без даты)
  193. Add 1--1-f event1
  194. Add 1-1-1- event1
  195. Add 1-2-3*f
  196. Add 1-0 event1
  197. Add 1-0-9- event1
  198. Add 2001-9-0- event1
  199. Add a1-1-1 a
  200. Add a1-1-1a a
  201. Add - event1
  202. Add 0 event1
  203. Add 1-0- event1
  204. Add 1-0- event1
  205. Month value is invalid:
  206. Add 1-0-999 event1
  207. Add 1-999-1 event1
  208. Add 1-0-1 a
  209. Add 1--1-1 event1
  210. Add 1--1--1 event1
  211. Day value is invalid:
  212. Add 1-1-0 a
  213. Add 1-1--1 event1*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement