1、节日查询和任务提醒系统程序设计报告程序设计报告(2011/2012学年 第二学期)题 目:日历查询和任务提醒系统 专 业 自动化 学 生 姓 名 陈康、李鹏飞、苏沛霖 班 级 学 号 B11050218、B11050216、B11050217指 导 教 师 吴敏 指 导 单 位 计算机软件教学中心 日 期 2012-6-5 评 分 细 则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简 短 评 语教师签名: 年 月 日评分等级备注评分等级有五种:优秀
2、、良好、中等、及格、不及格节日查询和任务提醒系统一、课题内容和要求设计一个简单的日历、月历系统,支持节日查询,任务提醒功能,用C或C+语言实现。本系统的基本功能必须包括:(1)日历、月历功能:界面能够显示日历和月历,默认为当月的月历能够通过上下翻页查询每月的月历。(2)日历查询:通过日期查询月历。(3)任务提醒:可添加、删除、修改、查询任务功能,并完成任务提醒功能。二、需求分析本系统的基本功能必须包括:(1)日历、月历功能:界面能够显示日历和月历,默认为当月的月历能够通过上下翻页查询每月的月历。(2)日历查询:通过日期查询月历。(3)任务提醒:可添加、删除、修改、查询任务功能,并完成任务提醒功
3、能。功能框架如图(2): 图(2)三、概要设计 主要结构体:void main() char ch; struct tm *t; time_t sec; load();/读取日程 ch=t; while(1) switch(ch) case -32: ch=getch(); switch(ch) case 72: lastyear(t); break;/按上,年份减1 case 80: nextyear(t); break;/按下,年份加1 case 75: lastmon(t); break;/按左,月份减1 case 77: nextmon(t); break;/按右,月份加1 break
4、; case f: search(t); break;/跳转日期 case t: sec=time(NULL);/获取当前系统时间 t=localtime(&sec);/将获取的秒数转换具体为时间 break;/按s,年份加1 case 1: add();/增加提醒 break; case 2: del();/删除提醒 break; case 3: mod();/修改提醒 break; case 4: srh();/查询提醒 break; case 5: srhjr(t);/查询节日 break; case 27: exit(0);/按ESC退出 check(t);/检查是否有提醒 mon_c
5、alendar(*t);/显示日历 ch=getch();/获取用户选择输入 主要函数流程图: (1)主体函数结构图(见图3-1): 图3-1 (2)闰年判断:用“400的整数倍”和“4的整数倍 且 不为百年”为闰年来判断闰年,不满足条件的则不为闰年。(见图3-2)图3-2(3)计算当日星期数:利用day_count函数,并通过计算得出当日的星期数(见图3-3)图3-3 图3-4(4)节日提醒系统:检测当日是否与节日文件中的节日日期相符合,若符合,则显示节日提醒。(见图3-4)(5)节日查询系统:输入节日名,与节日文件中的节日对照,若名称相符则显示节日时间(见图3-5) 图3-5(6)任务提醒
6、系统:创建任务提醒文件夹,保存任务提醒,并且通过函数调用实现任务提醒系统的增加、删除、修改、查询等功能。(见图3-6) 图3-6四、源程序代码 #include #include #include #include #define N 100struct remind struct tm t;/时间 char things100;/内容 jrN,rwN;/节日提醒 任务提醒int lenj;/节日提醒的个数int lenr;/任务提醒的个数void save()/保存信息 FILE *fp; if(fp=fopen(renwu.dat,wb)=NULL)/打开任务文件 printf(文件打开失
7、败!); exit(0); fwrite(&rw,sizeof(struct remind),N,fp);/写入文件 fclose(fp);/关闭文件 void load()/读取信息 FILE *fp; int i; jr0.t.tm_mon=0; jr0.t.tm_mday=1; strcpy(jr0.things,今天是元旦节); jr1.t.tm_mon=2; jr1.t.tm_mday=8; strcpy(jr1.things,今天是国际妇女节); jr2.t.tm_mon=2; jr2.t.tm_mday=12; strcpy(jr2.things,今天是植树节); jr3.t.t
8、m_mon=3; jr3.t.tm_mday=22; strcpy(jr3.things,今天是世界地球日); jr4.t.tm_mon=4; jr4.t.tm_mday=1; strcpy(jr4.things,今天是国际劳动节); jr5.t.tm_mon=5; jr5.t.tm_mday=1; strcpy(jr5.things,今天是儿童节); jr6.t.tm_mon=6; jr6.t.tm_mday=1; strcpy(jr6.things,今天是建党节); jr7.t.tm_mon=7; jr7.t.tm_mday=1; strcpy(jr7.things,今天是建军节); jr
9、8.t.tm_mon=9; jr8.t.tm_mday=1; strcpy(jr8.things,今天是国庆节); jr9.t.tm_mon=7; jr9.t.tm_mday=1; strcpy(jr9.things,今天是建军节); jr10.t.tm_mon=1; jr10.t.tm_mday=14; strcpy(jr10.things,今天是情人节); jr11.t.tm_mon=3; jr11.t.tm_mday=1; strcpy(jr11.things,今天是愚人节); jr12.t.tm_mon=3; jr12.t.tm_mday=5; strcpy(jr12.things,今
10、天是清明节); jr13.t.tm_mon=4; jr13.t.tm_mday=4; strcpy(jr13.things,今天是中国青年节); jr14.t.tm_mon=8; jr14.t.tm_mday=10; strcpy(jr14.things,今天是中国教师节); jr15.t.tm_mon=9; jr15.t.tm_mday=31; strcpy(jr15.things,今天是万圣节); jr16.t.tm_mon=10; jr16.t.tm_mday=25; strcpy(jr16.things,今天是感恩节); jr17.t.tm_mon=11; jr17.t.tm_mday
11、=1; strcpy(jr17.things,今天是世界艾滋病日); jr18.t.tm_mon=11; jr18.t.tm_mday=25; strcpy(jr18.things,今天是圣诞节); /初始化各种节日 lenj=19;/节日个数 if(fp=fopen(renwu.dat,rb)=NULL)/打开任务文件 fopen(renwu.dat,wb);/创建文件 else fread(&rw,sizeof(struct remind),N,fp);/读取文件 for(i=0,lenr=0;iN;i+) if(strlen(rwi.things)!=0) lenr+;/计算日程条数 f
12、close(fp);/关闭文件 int run_or_not(int year)/判断是否是是闰年 if(year%400=0)/400的整数倍为闰年,返回1 return 1; else if(year % 4 = 0 & year % 100 != 0)/4的整数倍 且 不为百年为闰年,返回1 return 1; else return 0;/不是闰年int day_count(int year,int month)/每个月的天数,此函数调用run_or_not switch(month) case 1: return 31; case 2: if(run_or_not(year)=0)
13、return 28; else return 29; case 3: return 31; case 4: return 30; case 5: return 31; case 6: return 30; case 7: return 31; case 8: return 31; case 9: return 30; case 10: return 31; case 11: return 30; case 12: return 31; default: return 0; void mon_calendar(struct tm t)/显示月历 int wd,max_day; int i; sy
14、stem(cls);/清屏 wd=(t.tm_wday-(t.tm_mday%7-1)%7;/计算当月1日是星期几 max_day=day_count(t.tm_year+1900,t.tm_mon+1);/计算本月天数 if(wd0)/如果星期是负数就加上7 wd+=7; if(run_or_not(t.tm_year)=0)/不是闰年 printf( %d年%d月n,t.tm_year+1900,t.tm_mon+1); else printf( %d年(闰年)%d月n,t.tm_year+1900,t.tm_mon+1); printf(_n); printf(日 一 二 三 四 五 六
15、n); for( i=0;iwd;i+) printf( );/输出空格占上个月的位 for( i=1;i=max_day;i+,wd+) if(i=t.tm_mday) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED);/与当前系统日期相等,改变颜色 printf(%-4d,i); if(i=t.tm_mday ) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RE
16、D | FOREGROUND_GREEN | FOREGROUND_BLUE);/恢复颜色 if(wd%7=6) printf(n);/当前为星期6,换行 printf(n_n); printf(、减少月份 、增加月份 n、减少年份 、增加年份n1、增加提醒 2、删除提醒n3、修改提醒 4、查询提醒n5、查询节日 t、显示系统日期nf、跳转日期 ESC、退出n); printf(_n);int week(int year,int month,int day)/计算星期,此函数调用day_count int i; int week_year_1_1;/当年1月1日的星期数 int count_d
17、ay;/距当年1月1日的天数 week_year_1_1=(year-1+(year-1)/4)-(year-1)/100)+(year-1)/400)+1)%7;/计算当年一月一日星期几,接下来星期的计算依次为基准 for(i=1,count_day=0;itm_year,&t-tm_mon,&t-tm_mday); getchar();/消除上一步的回车符 if(t-tm_year9999 | t-tm_yeartm_mon12 | t-tm_montm_mdayday_count(t-tm_year,t-tm_mon) | t-tm_mdaytm_wday=week(t-tm_year,
18、t-tm_mon,t-tm_mday);/计算星期 t-tm_year-=1900; t-tm_mon-=1; void lastmon(struct tm *t)/上个月的月历 t-tm_mon-;/月份减一 if(t-tm_mon=-1)/如果减到1月了,就变成12月 t-tm_mon=11; t-tm_wday=week(t-tm_year+1900,t-tm_mon+1,t-tm_mday);/计算上月的今天是星期几 void nextmon(struct tm *t)/下个月的月历 t-tm_mon+;/月份加一 if(t-tm_mon=12)/如果加到12月了,就变成1月 t-tm
19、_mon=0; t-tm_wday=week(t-tm_year+1900,t-tm_mon+1,t-tm_mday);/计算下月月的今天是星期几 void lastyear(struct tm *t)/上一年的本月月历 t-tm_year-;/年份减一 if(t-tm_year=1-1901)/如果减到公元0年,就变成9999年 t-tm_year=9999-1900; t-tm_wday=week(t-tm_year+1900,t-tm_mon+1,t-tm_mday);/计算上月的今天是星期几 void nextyear(struct tm *t)/下一年的本月月历 t-tm_year+
20、;/年份加一 if(t-tm_year=9999-1900+1)/如果加到公元9999年,就变成1年 t-tm_year=1-1900; t-tm_wday=week(t-tm_year+1900,t-tm_mon+1,t-tm_mday);/计算上月的今天是星期几 int checkjr(struct tm t,int f)/检查今天是否是节日 int i,flag; for(i=0,flag=0;ilenj;i+) if(jri.t.tm_mon=t.tm_mon & jri.t.tm_mday=t.tm_mday ) if(f=0)/没有任务提醒 需要清屏 system(cls); fl
21、ag=1;/标记已经清屏 printf(节日提醒:); puts(jri.things);/显示提醒 return flag; int checkrw(struct tm t)/检查是否有任务提醒 int i,flag; for(i=0,flag=0;ilenj;i+) if(rwi.t.tm_mon=t.tm_mon & rwi.t.tm_mday=t.tm_mday ) if(flag=0) system(cls);/清屏 flag=1;/标记已经清屏 printf(任务提醒:); puts(rwi.things);/显示提醒 if(flag=1) printf(nnn); return
22、flag; void check(struct tm *t)/检查是否有提醒 int flag1,flag2; flag1=checkrw(*t); flag2=checkjr(*t,flag1);/检查是否有提醒 if(flag1=1 | flag2=1) printf(nnnnn提醒完毕,回车返回。); getchar(); void add()/增加任务提醒 int i; system(cls);/清屏 i=lenr; printf(请输入提醒年月日(格式:2011,9,11):); scanf(%d,%d,%d,&rwi.t.tm_year,&rwi.t.tm_mon,&rwi.t.t
23、m_mday); getchar();/消除回车符 rwi.t.tm_year-=1900; rwi.t.tm_mon-; printf(请输入提醒内容:); gets(rwi.things); lenr+;/提醒数加1 save();/保存 printf(添加成功!回车返回。); getchar(); void del() /删除提醒 struct remind tp; int i; system(cls);/清屏 printf(_n); printf(编号 提醒日期 提醒内容n); for(i=0;ilenr;i+) printf(%-6d%-4d-%-2.2d-%-2.2d %sn,i,
24、rwi.t.tm_year+1900,rwi.t.tm_mon+1,rwi.t.tm_mday,rwi.things ); printf(_n); printf(请输入要删除的编号:); scanf(%d,&i); getchar(); while(i=lenr) printf(输入错误请重新输入:); scanf(%d,&i); rwi.things0=0;/删除 tp=rwi; rwi=rwlenr-1; rwlenr-1=tp;/和最后一个记录交换位置 lenr-;/任务个数减一 save();/保存 printf(_n); printf(编号 提醒日期 提醒内容n); for(i=0;ilenr;i+) printf(%-6d%-4d-%-2.2d-%-2.2d %sn,i,rwi.t.tm_year+1900,rwi.t.tm_mon+1,rwi.t.tm_mday,rwi.things ); printf(_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1