Procedure practice: Electronic memorandum and practice electronic Memorandum
Electronic Memorandum
1. Basic functions of the system
Use an electronic memorandum to record future to-do matters within a certain period of time. Query and add are allowed.
2 Requirements
(1) You can set the storage method of the memo information to ensure flexible operations. A memo can contain a maximum of 100 Chinese characters. The time settings of the memo information can be precise to a specific date, a time period in a specific date, or a specific time in a specific date. You can set the recurrence of the event, such as taking the salary on the 10 th day of each month and taking the examination at AM on April 9, June 16-28.
(2) If there is an arrangement during the period when you add the service, a message is displayed.
(3) When querying, if there is a memo on the current date, it will be automatically reminded.
(4) According to the start date and end date entered by the keyboard, collect all the memo information in the period and output the result (including the time and memo information ); statistics are sorted by time.
It's so ugly.
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#include <map>#include <string>#include <ctime>#include <fstream>using namespace std;int const MAXLEN = 10000;struct E_Memorandum{ string begin_date; string end_date; string item; bool repeat;}em[MAXLEN];int item_num;string get_to_year(string date){ string ans = ""; int len = date.length(); for(int i = 0; i < len; i++) { if(date[i] != '/') ans += date[i]; else break; } return ans;}string get_to_month(string date){ string ans = ""; int cnt = 0; int len = date.length(); for(int i = 0; i < len; i++) { if(date[i] == '/') cnt ++; if(cnt == 2) break; ans += date[i]; } return ans;}string get_to_day(string date){ string ans = ""; int cnt = 0; int len = date.length(); for(int i = 0; i < len; i++) { if(date[i] == '/') cnt ++; if(cnt == 3) break; ans += date[i]; } return ans;}string get_to_hour(string date){ string ans = ""; int cnt = 0; int len = date.length(); for(int i = 0; i < len; i++) { if(date[i] == '/') cnt ++; if(cnt == 4) break; ans += date[i]; } return ans;}string get_to_minute(string date){ string ans = ""; int cnt = 0; int len = date.length(); for(int i = 0; i < len; i++) { if(date[i] == '/') cnt ++; if(cnt == 5) break; ans += date[i]; } return ans;}bool is_leap(string y){ int year = 0; int len = y.length(); for(int i = 0; i < len; i++) year = year * 10 + (y[i] - '0'); if((year % 400 == 0) || (year % 4 == 0 && year % 100)) return true; return false;}int Convert(string date){ int num = 0; int len = date.length(); for(int i = 0; i < len; i++) num = num * 10 + (date[i] - '0'); return num;}bool judge_input(string in){ if(in == "notsure") return true; string year = get_to_year(in); int y = Convert(year); if(y != 0 && (y > 9999 || y < 1000)) { cout << "error year (1000 - 9999)\n"; return false; } string tmp = get_to_month(in), month = "", day = "", hour = "", minute = ""; for(int i = 5; i < (int) tmp.length(); i++) month += tmp[i]; int m = Convert(month); if(m != 0 && (m> 12 || m < 1)) { cout << "error month (01 - 12)\n"; return false; } tmp = get_to_day(in); for(int i = 8; i < (int) tmp.length(); i++) day += tmp[i]; int d = Convert(day); if(d != 0) { if(m == 2) { if(is_leap(year) && d > 29) { cout << "error day (Leap yaer Feb only 29 days)\n"; return false; } else if(!is_leap(year) && d > 28) { cout << "error day (no Leap yaer Feb only 28 days)\n"; return false; } } else if((m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) && d > 31) { cout << "error day (this month only 31 days)\n"; return false; } else if((m == 4 || m == 6 || m == 9 || m == 11) && d > 30) { cout << "error day (this month only 30 days)\n"; return false; } if(d < 1) { cout << "error day (must more than 01)\n"; return false; } } tmp = get_to_hour(in); for(int i = 11; i < (int) tmp.length(); i++) hour += tmp[i]; int h = Convert(hour); if(h != 0 && (h > 24 || h < 0)) { cout << "error hour (00 - 24)\n"; return false; } tmp = get_to_minute(in); for(int i = 16; i < (int) tmp.length(); i++) minute += tmp[i]; int minu = Convert(minute); if(minu != 0 && (minu > 60 || minu < 1)) { cout << "error minute (01 - 60)\n"; return false; } return true;}void Add(){ string b_date, e_date, item; cout << "please input your item (formate: begin_date-end_date content)\n"; cout << "if no end_date (formate: begin_date-notsure content)\n"; cout << "date formate(Y/M/D/H/MIN)\n"; bool flag = false; while(!flag) { flag = true; cout << "Input start time: "; cin >> b_date; while(!judge_input(b_date)) { cout << "Input start time: "; cin >> b_date; } cout << "Input end time: "; cin >> e_date; while(!judge_input(e_date)) { cout << "Input end time: "; cin >> e_date; } if(e_date <= b_date) { cout << "the end time should not ahead of begin time\n"; flag = false; } for(int i = 0; i < item_num; i++) { if(em[i].begin_date <= b_date && em[i].end_date != "notsure" && em[i].end_date >= b_date) { cout << "begin time conflict\n"; flag = false; break; } else if(em[i].begin_date <= e_date && em[i].end_date != "notsure" && em[i].end_date >= e_date) { cout << "end time conflict\n"; flag = false; break; } } } cout << "Input the item: "; cin >> item; cout << "Whether repeat ?(Y/N) "; char tmp2[2] = ""; while(tmp2[0] != 'Y' && tmp2[0] != 'N') { cin >> tmp2; if(tmp2[0] == 'Y') { em[item_num].repeat = true; break; } else if(tmp2[0] == 'N') { em[item_num].repeat = false; break; } else cout << "error input" << endl; } if(em[item_num].repeat) { if(em[item_num].begin_date.length() == 7) { string curb, cure; for(int i = 5; i < 7; i++) curb += em[item_num].begin_date; for(int i = 5; i < 7; i++) cure += em[item_num].end_date; char tmp[100]; for(int i = 1000; i <= 9999; i++) { sprintf(tmp, "%d", i); em[item_num].begin_date += tmp; em[item_num].begin_date += "/"; em[item_num].begin_date += curb; if(em[item_num].end_date != "notsure") { em[item_num].begin_date += tmp; em[item_num].begin_date += "/"; em[item_num].begin_date += cure; } else em[item_num].end_date = e_date; em[item_num].item = item; em[item_num++].repeat = true; } } else if(em[item_num].begin_date.length() == 9) { string curb, cure; for(int i = 8; i < 10; i++) curb += em[item_num].begin_date; for(int i = 8; i < 10; i++) cure += em[item_num].end_date; for(int i = 1000; i <= 9999; i++) { char tmp[100]; for(int j = 1; j <= 12; j++) { char tmpp[100]; sprintf(tmp, "%d", i); sprintf(tmpp, "%d", j); em[item_num].begin_date += tmp; if((int)strlen(tmpp) < 2) { tmpp[1] = tmpp[0]; tmpp[0] = '0'; } em[item_num].begin_date += "/"; em[item_num].begin_date += tmpp; em[item_num].begin_date += "/"; em[item_num].begin_date += curb; if(em[item_num].end_date != "notsure") { em[item_num].begin_date += tmp; if((int)strlen(tmpp) < 2) { tmpp[1] = tmpp[0]; tmpp[0] = '0'; } em[item_num].begin_date += "/"; em[item_num].begin_date += tmpp; em[item_num].begin_date += "/"; em[item_num].begin_date += cure; } else em[item_num].end_date = e_date; em[item_num].item = item; em[item_num++].repeat = true; } } } } else { em[item_num].begin_date = b_date; em[item_num].end_date = e_date; em[item_num].item = item; item_num ++; } ofstream file; file.open("file.txt"); file << item_num << endl; for(int i = 0; i < item_num; i++) file << em[i].begin_date << " " << em[i].end_date << " " << em[i].item << " " << em[i].repeat << endl; cout << "Add sucessfully\n"; return;}bool cmp(E_Memorandum a, E_Memorandum b){ int len1 = a.begin_date.length(); int len2 = b.begin_date.length(); if(len1 > len2) return a.begin_date < b.begin_date; if(len1 < len2) return a.begin_date > b.begin_date; if(len1 == len2) { if(a.begin_date != b.begin_date) return a.begin_date < b.begin_date; else return a.end_date < b.end_date; } return true;}void Output(int idx, bool flag){ if(flag) cout << "Your have some item at now\n"; if(em[idx].end_date != "notsure") cout << "date: " << em[idx].begin_date << " - " << em[idx].end_date << endl; else if(em[idx].end_date == "notsure") cout << "date: " << em[idx].begin_date << endl; cout << "item: " << em[idx].item << endl; return;}void Judge_no_end(int idx, string date, string now, bool &flag){ if(date == now) { Output(idx, flag); flag = false; } return;}void Judge_has_end(int idx, string b_date, string e_date, string now, bool &flag){ if(b_date <= now && now <= e_date) { Output(idx, flag); flag = false; } return;}void Query(){ bool find = false; time_t t = time(0); char tmp[100], get[100]; memset(tmp, 0, sizeof(tmp)); memset(get, 0, sizeof(get)); strftime(tmp, sizeof(tmp), "%Y/%m/%d/%X",localtime(&t)); int cnt = 0; for(int i = 0; i < (int) strlen(tmp); i++) { if(tmp[i] == ':') cnt++; if(cnt == 2) break; get[i] = tmp[i]; if(tmp[i] == ':') get[i] = '/'; } string now = get; string year = get_to_year(now); string month = get_to_month(now); string day = get_to_day(now); string hour = get_to_hour(now); string minute = get_to_minute(now); bool flag = true; for(int i = 0; i < item_num; i++) { if(em[i].end_date == "notsure") { Judge_no_end(i, em[i].begin_date, minute, flag); } else { Judge_has_end(i, em[i].begin_date, em[i].end_date, minute, flag); } } if(!flag) find = true; sort(em, em + item_num, cmp); string b_date, e_date; cout << "Input the date that you want to query: (formate: Y/M/D/H/MIN)\n"; cout << "Input start time: "; cin >> b_date; while(!judge_input(b_date)) { cout << "Input start time: "; cin >> b_date; } cout << "Input end time: "; cin >> e_date; while(!judge_input(e_date)) { cout << "Input end time: "; cin >> e_date; } while(e_date <= b_date) { cout << "the end time should not ahead of begin time\n"; cout << "Input end time: "; cin >> e_date; } for(int i = 0; i < item_num; i++) { if(em[i].end_date == "notsure") { if(b_date <= em[i].begin_date && em[i].begin_date <= e_date) { Output(i, false); find = true; } } else { if(b_date <= em[i].begin_date && em[i].end_date <= e_date) { Output(i, false); find = true; } } } if(!find) cout << "There is no item in your query time\n";}int main(){ cout << "welcome to E_memorandum\n"; char type[2]; ifstream file; file.open("file.txt"); file >> item_num; for(int i = 0; i < item_num; i++) file >> em[i].begin_date >> em[i].end_date >> em[i].item >> em[i].repeat; file.close(); while(true) { cout << "please input your operation\n"; cout << "press 1 to add\n"; cout << "press 2 to query\n"; cout << "press q to quit\n"; cin >> type; if(type[0] != '1' && type[0] != '2' && type[0] != 'q') { cout << "Wrong input\n"; } else if(type[0] == '1') { Add(); } else if(type[0] == '2') { Query(); } else { cout << "Thank for using\n"; return 0; } }}