电子备忘录
1 系统的基本功能
利用电子备忘录记录未来某时间内的待办事宜。允许查询、添加。
2 要求
(1)备忘信息的保存方式自己设定,尽量保证操作灵活。一条备忘信息最多允许100个汉字。备忘信息的时间设置可以精确到具体的某个日期、或者某个日期中的某个时间段、或者某个日期中的某个具体时间。可以对事件的重复出现进行设置,如每月10号取工资,6月16号到28号每天上午9:10考试等。
(2)如果在添加时,该时段内已有安排则出现提示信息。
(3)查询时,如果当前日期有备忘信息,自动提醒。
(4)根据键盘输入的起始日期和终止日期,统计该时间段内的所有备忘信息并输出结果(包括时间和备忘信息);统计时按照时间的先后顺序进行排序。
好惨啊,写的太丑
#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; } } }
时间: 2024-12-25 16:37:51