节日查询和任务提醒系统程序设计报告.docx
《节日查询和任务提醒系统程序设计报告.docx》由会员分享,可在线阅读,更多相关《节日查询和任务提醒系统程序设计报告.docx(33页珍藏版)》请在冰豆网上搜索。
节日查询和任务提醒系统程序设计报告
程序设计报告
(2011/2012学年第二学期)
题目:
日历查询和任务提醒系统
专业自动化
学生姓名陈康、李鹏飞、苏沛霖
班级学号B11050218、B11050216、B11050217
指导教师吴敏
指导单位计算机软件教学中心
日期2012-6-5
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
年月日
评分等级
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
节日查询和任务提醒系统
一、课题内容和要求
设计一个简单的日历、月历系统,支持节日查询,任务提醒功能,用C或C++语言实现。
本系统的基本功能必须包括:
(1)日历、月历功能:
界面能够显示日历和月历,默认为当月的月历能够通过上下翻页查询每月的月历。
(2)日历查询:
通过日期查询月历。
(3)任务提醒:
可添加、删除、修改、查询任务功能,并完成任务提醒功能。
二、需求分析
本系统的基本功能必须包括:
(1)日历、月历功能:
界面能够显示日历和月历,默认为当月的月历能够通过上下翻页查询每月的月历。
(2)日历查询:
通过日期查询月历。
(3)任务提醒:
可添加、删除、修改、查询任务功能,并完成任务提醒功能。
功能框架如图
(2):
图
(2)
三、概要设计
<1>主要结构体:
voidmain()
{
charch;
structtm*t;
time_tsec;
load();//读取日程
ch='t';
while
(1)
{
switch(ch)
{
case-32:
ch=getch();
switch(ch)
{
case72:
lastyear(t);
break;//按上,年份减1
case80:
nextyear(t);
break;//按下,年份加1
case75:
lastmon(t);
break;//按左,月份减1
case77:
nextmon(t);
break;//按右,月份加1
}
break;
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;
case27:
exit(0);//按ESC退出
}
check(t);//检查是否有提醒
mon_calendar(*t);//显示日历
ch=getch();//获取用户选择输入
}
}
<2>主要函数流程图:
(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)任务提醒系统:
创建任务提醒文件夹,保存任务提醒,并且通过函数调用实现任务提醒系统的增加、删除、修改、查询等功能。
(见图3-6)
图3-6
四、源程序代码
#include
#include
#include
#include
#defineN100
structremind
{
structtmt;//时间
charthings[100];//内容
}jr[N],rw[N];//节日提醒任务提醒
intlenj;//节日提醒的个数
intlenr;//任务提醒的个数
voidsave()//保存信息
{
FILE*fp;
if((fp=fopen("renwu.dat","wb"))==NULL)//打开任务文件
{
printf("文件打开失败!
");
exit(0);
}
fwrite(&rw,sizeof(structremind),N,fp);//写入文件
fclose(fp);//关闭文件
}
voidload()//读取信息
{
FILE*fp;
inti;
jr[0].t.tm_mon=0;jr[0].t.tm_mday=1;strcpy(jr[0].things,"今天是元旦节");
jr[1].t.tm_mon=2;jr[1].t.tm_mday=8;strcpy(jr[1].things,"今天是国际妇女节");
jr[2].t.tm_mon=2;jr[2].t.tm_mday=12;strcpy(jr[2].things,"今天是植树节");
jr[3].t.tm_mon=3;jr[3].t.tm_mday=22;strcpy(jr[3].things,"今天是世界地球日");
jr[4].t.tm_mon=4;jr[4].t.tm_mday=1;strcpy(jr[4].things,"今天是国际劳动节");
jr[5].t.tm_mon=5;jr[5].t.tm_mday=1;strcpy(jr[5].things,"今天是儿童节");
jr[6].t.tm_mon=6;jr[6].t.tm_mday=1;strcpy(jr[6].things,"今天是建党节");
jr[7].t.tm_mon=7;jr[7].t.tm_mday=1;strcpy(jr[7].things,"今天是建军节");
jr[8].t.tm_mon=9;jr[8].t.tm_mday=1;strcpy(jr[8].things,"今天是国庆节");
jr[9].t.tm_mon=7;jr[9].t.tm_mday=1;strcpy(jr[9].things,"今天是建军节");
jr[10].t.tm_mon=1;jr[10].t.tm_mday=14;strcpy(jr[10].things,"今天是情人节");
jr[11].t.tm_mon=3;jr[11].t.tm_mday=1;strcpy(jr[11].things,"今天是愚人节");
jr[12].t.tm_mon=3;jr[12].t.tm_mday=5;strcpy(jr[12].things,"今天是清明节");
jr[13].t.tm_mon=4;jr[13].t.tm_mday=4;strcpy(jr[13].things,"今天是中国青年节");
jr[14].t.tm_mon=8;jr[14].t.tm_mday=10;strcpy(jr[14].things,"今天是中国教师节");
jr[15].t.tm_mon=9;jr[15].t.tm_mday=31;strcpy(jr[15].things,"今天是万圣节");
jr[16].t.tm_mon=10;jr[16].t.tm_mday=25;strcpy(jr[16].things,"今天是感恩节");
jr[17].t.tm_mon=11;jr[17].t.tm_mday=1;strcpy(jr[17].things,"今天是世界艾滋病日");
jr[18].t.tm_mon=11;jr[18].t.tm_mday=25;strcpy(jr[18].things,"今天是圣诞节");
//初始化各种节日
lenj=19;//节日个数
if((fp=fopen("renwu.dat","rb"))==NULL)//打开任务文件
{
fopen("renwu.dat","wb");//创建文件
}
else
{
fread(&rw,sizeof(structremind),N,fp);//读取文件
for(i=0,lenr=0;iif(strlen(rw[i].things)!
=0)
{
lenr++;//计算日程条数
}
fclose(fp);//关闭文件
}
}
intrun_or_not(intyear)//判断是否是是闰年
{
if(year%400==0)//400的整数倍为闰年,返回1
return1;
elseif(year%4==0&&year%100!
=0)//4的整数倍且不为百年为闰年,返回1
return1;
else
return0;//不是闰年
}
intday_count(intyear,intmonth)//每个月的天数,此函数调用run_or_not
{
switch(month)
{
case1:
return31;
case2:
if(run_or_not(year)==0)return28;
elsereturn29;
case3:
return31;
case4:
return30;
case5:
return31;
case6:
return30;
case7:
return31;
case8:
return31;
case9:
return30;
case10:
return31;
case11:
return30;
case12:
return31;
default:
return0;
}
}
voidmon_calendar(structtmt)//显示月历
{
intwd,max_day;
inti;
system("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(wd<0)//如果星期是负数就加上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("日一二三四五六\n");
for(i=0;iprintf("");//输出空格占上个月的位
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_RED|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");
}
intweek(intyear,intmonth,intday)//计算星期,此函数调用day_count
{
inti;
intweek_year_1_1;//当年1月1日的星期数
intcount_day;//距当年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;icount_day+=day_count(year,i);//计算当年所经历的整月的天数,比如:
5月20日,就计算1、2、3、4月的天数,5月未完,接下来计算
count_day+=day-1;//加上当月已经过的天数,减一是因为当天还没过完,不算一天
return(week_year_1_1+count_day%7)%7;
}
voidsearch(structtm*t)//跳转日期
{
printf("请输入要跳转的日期(格式:
年,月,日如:
1949,10,1):
");
while
(1)
{
scanf("%d,%d,%d",&t->tm_year,&t->tm_mon,&t->tm_mday);
getchar();//消除上一步的回车符
if(t->tm_year>9999||t->tm_year<1||t->tm_mon>12||t->tm_mon<1||t->tm_mday>day_count(t->tm_year,t->tm_mon)||t->tm_mday<1)
{
printf("输出错误,请重新输入:
");
continue;//合法性检查出不合法,重新输入
}
else
break;//合法性检查合法,结束输入
}
t->tm_wday=week(t->tm_year,t->tm_mon,t->tm_mday);//计算星期
t->tm_year-=1900;
t->tm_mon-=1;
}
voidlastmon(structtm*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);//计算上月的今天是星期几
}
voidnextmon(structtm*t)//下个月的月历
{
t->tm_mon++;//月份加一
if(t->tm_mon==12)//如果加到12月了,就变成1月
t->tm_mon=0;
t->tm_wday=week(t->tm_year+1900,t->tm_mon+1,t->tm_mday);//计算下月月的今天是星期几
}
voidlastyear(structtm*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);//计算上月的今天是星期几
}
voidnextyear(structtm*t)//下一年的本月月历
{
t->tm_year++;//年份加一
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);//计算上月的今天是星期几
}
intcheckjr(structtmt,intf)//检查今天是否是节日
{
inti,flag;
for(i=0,flag=0;i{
if(jr[i].t.tm_mon==t.tm_mon&&jr[i].t.tm_mday==t.tm_mday)
{
if(f==0)//没有任务提醒需要清屏
system("cls");
flag=1;//标记已经清屏
printf("节日提醒:
");
puts(jr[i].things);//显示提醒
}
}
returnflag;
}
intcheckrw(structtmt)//检查是否有任务提醒
{
inti,flag;
for(i=0,flag=0;i{
if(rw[i].t.tm_mon==t.tm_mon&&rw[i].t.tm_mday==t.tm_mday)
{
if(flag==0)
{
system("cls");//清屏
flag=1;//标记已经清屏
}
printf("任务提醒:
");
puts(rw[i].things);//显示提醒
}
}
if(flag==1)
{
printf("\n\n\n");
}
returnflag;
}
voidcheck(structtm*t)//检查是否有提醒
{
intflag1,flag2;
flag1=checkrw(*t);
flag2=checkjr(*t,flag1);//检查是否有提醒
if(flag1==1||flag2==1)
{
printf("\n\n\n\n\n提醒完毕,回车返回。
");
getchar();
}
}
voidadd()//增加任务提醒
{
inti;
system("cls");//清屏
i=lenr;
printf("请输入提醒年月日(格式:
2011,9,11):
");
scanf("%d,%d,%d",&rw[i].t.tm_year,&rw[i].t.tm_mon,&rw[i].t.tm_mday);
getchar();//消除回车符
rw[i].t.tm_year-=1900;
rw[i].t.tm_mon--;
printf("请输入提醒内容:
");
gets(rw[i].things);
lenr++;//提醒数加1
save();//保存
printf("添加成功!
回车返回。
");
getchar();
}
voiddel()//删除提醒
{
structremindtp;
inti;
system("cls");//清屏
printf("_______________________________________________________________________\n");
printf("编号提醒日期提醒内容\n");
for(i=0;iprintf("%-6d%-4d-%-2.2d-%-2.2d%s\n",i,rw[i].t.tm_year+1900,rw[i].t.tm_mon+1,rw[i].t.tm_mday,rw[i].things);
printf("_______________________________________________________________________\n");
printf("请输入要删除的编号:
");
scanf("%d",&i);
getchar();
while(i<0||i>=lenr)
{
printf("输入错误请重新输入:
");
scanf("%d",&i);
}
rw[i].things[0]='\0';//删除
tp=rw[i];
rw[i]=rw[lenr-1];
rw[lenr-1]=tp;//和最后一个记录交换位置
lenr--;//任务个数减一
save();//保存
printf("_______________________________________________________________________\n");
printf("编号提醒日期提醒内容\n");
for(i=0;iprintf("%-6d%-4d-%-2.2d-%-2.2d%s\n",i,rw[i].t.tm_year+1900,rw[i].t.tm_mon+1,rw[i].t.tm_mday,rw[i].things);
printf("___________________________________________________________________