C语言课程设计万年历.docx
《C语言课程设计万年历.docx》由会员分享,可在线阅读,更多相关《C语言课程设计万年历.docx(18页珍藏版)》请在冰点文库上搜索。
C语言课程设计万年历
山东交通学院
面向对象课程设计
万年历系统
院(系)别信息工程系
班级计算111
学号********
姓名秦先生
指导教师徐硕博
时间2012-03-05—2012-03-09
课程设计任务书
题目万年历系统
系(部)信息工程系
专业计算机科学与
班级计算111
学生姓名秦先生
学号*********
03月05日至03月09日共1周
指导教师(签字)
系主任(签字)
年月日
成绩评定表
作品成绩
报告成绩
口试(答辩)成绩
总评成绩
.
1课程设计概述
字符统计软件功能概述
模仿Windwos的日历.
1)日历显示功能。
能根据系统日期进行初始化,如果没有任何输入,
则显示系统日期所在月份的月历。
2)日历查询、闰年判断功能。
输入日期进行查询,显示查询日期所在月份的月历,还将显示所在年份是否为闰年。
3)参数检查功能。
如果输入日期不合法,查询将被拒绝,并显示提示信息。
开发环境概述
在实验室一人一台微机。
2课程设计概述
问题分析
难点在于判断星期,但根据蔡勒公式,可以很容易地有年月日推断出星期:
nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday;
w=nDay%7;
其中year:
要查询的年份
nday:
从该年的一月一日起到该天的天数w:
得出的星期数,w==0表示星期天。
在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过定长度输出日期,在遇到某天时星期六时,就换行输出,因此可以按照月历的格式输出。
对于初始输入当前月历,可以通过中的time和localtime函数取出系统时间进行初始化。
time_ttimer;
structtm*gmt;
time(&timer);
gmt=localtime(&timer);
gmt就是一个时间结构体,可以从中取出年月日。
闰年的判断,能被4整除但不能被100整除,或者能被400整除的年份为闰年,否则为平年。
日期的查询,就是直接打印该天所在月份的月历。
判断日期是否合法,可以先判断年月日是否有小于0的值,月和日是否有超出最大值12和31,如果通过此判断合法,再判断是否时闰年,如果时闰年,则判断二月份是否满足要求,闰年二月份不能超过29天,平年二月份不能超过28天。
在查询过程中,如果发现输入不合法或者不满足输入要求,则要求重新输入。
总体设计流图
3万年历系统详细设计
intrunnian(intyear);
该函数判断某年是否是闰年,参数year表示要判断的年份,返回值1表示该年为闰年,0表示该年为平年。
structtm*getDay();
该函数用以取得系统的时间。
该函数没有参数,返回值类型为structtm*,是一个包含时间的结构体。
intjiancha(intyear,intmonth,intday);
该函数用以判断输入的年份是否合法,参数为要判断的年月日,返回值为1表示该日期合法,为0表示不合法。
intgetwDay(intyear,intmonth,intday);
该函数用以根据一个日期推断星期,参数为要判断的年月日。
返回值为整型,123456分别表示星期一到星期六,0表示星期天。
voidchaxun();
该函数用以显示要查询的日期的月历,无参数和返回值,。
voidinlinebackMenu();
该函数为内联函数,用以实现完成某项功能后按任意字符键返回主菜单,无参数和返回值。
voidcaidan(int&year,int&month,int&day);
该函数参数为系统日期,无返回值,用户在该函数执行时可以选择功能。
4程序测试
进入程序后显示
按任意键返回主菜单
进入主菜单后,按1,显示当前时间
在主菜单界面按2,进行日立的查询,并经时期的合法性判断和平润年的判断。
例如输入:
20201220.由于输入合法会显示:
进入程序后显示输入:
20121140,由于输入不合法,会进行报错,要求重新输
在主界面中输入3,程序退出
在主界面中输入:
eufhg,会显示
5.程序原代码:
#include
#include
#include
#include
#include
#include
intyear,month,day;//全局变量记录时间
intdaysOfMonth[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
intrunnian(intyear)//判断是否是闰年
{return(year%4==0&&year%100!
=0||year%400==0)?
1:
0;
}
structtm*getDay()//从系统取得当前时间
{
time_ttimer;
structtm*gmt;
time(&timer);
gmt=localtime(&timer);
returngmt;
}
intjianca(intyear,intmonth,intday)//检查日期是否正确
{
if(year<0||month<1||month>12||day<1||day>31)
return0;
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
if(day>31)return0;break;
case4:
case6:
case9:
case11:
if(day>30)return0;break;
default:
if(runnian(year)&&day>29)
return0;
elseif(runnian(year)==0&&day>28)
return0;
}
return1;
}
intgetwDay(intyear,intmonth,intday)//取得星期
{
intnday=0,nDay,i,w;
for(i=0;inday+=daysOfMonth[runnian(year)][i];
nday+=day;
nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday;
w=nDay%7;
returnw;
}
intweek(intyear,intmonth,intday)//取得星期
{
intnday=0,nDay,i,w;
for(i=0;inday+=daysOfMonth[runnian(year)][i];
nday+=day;
nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday;
w=nDay%7;
returnw;
}
voidty(intyear,intmonth,intday)//打印月历
{
inti;
charwday[7][4]={"日","一","二","三","四","五","六"};
printf("####################################\n");
printf("####################################\n");
printf("######%d年%d月%d日#######\n",year,month,day);
printf("************************************\n");
printf("************************************\n");
for(i=0;i<7;i++)
printf("%5s",wday[i]);
printf("\n");
intw;
intnowDay=1;
w=week(year,month,nowDay);//找到第一天的星期
intn;
n=daysOfMonth[runnian(year)][month-1];
{//放置第一天
if(w==0)
printf("%5d",nowDay);
elseif(w==1)
printf("%10d",nowDay);
elseif(w==2)
printf("%15d",nowDay);
elseif(w==3)
printf("%20d",nowDay);
elseif(w==4)
printf("%25d",nowDay);
elseif(w==5)
printf("%30d",nowDay);
else
printf("%35d\n",nowDay);
}
nowDay++;
for(i=1;i{
w=week(year,month,nowDay);
printf("%5d",nowDay);
if(w==6)//如果是星期六则换行打印
puts("\n");
nowDay++;
}
printf("\n************************************\n");
printf("************************************\n");
}
voidcaxun()//查询日历
{
system("cls");
intyear,month,day;
printf("请输入你要查询的日期(格式为年月日,如2009113):
");
scanf("%d%d%d",&year,&month,&day);
while(!
jianca(year,month,day))//如果日期输入不正确,则重新输入
{
printf("%c你输入的日期错误,请重新输入:
");
scanf("%d%d%d",&year,&month,&day);
}
system("cls");
if(runnian(year))
printf("\n闰年\n\n");
elseprintf("\n平年\n\n");
ty(year,month,day);
}
voidinlinebackMenu()
{
printf("请按任意字符键进入主菜单:
\n");
getch();
/*system("cls");*/
}
voidcaidan(int&year,int&month,int&day)//主菜单
{system("cls");
printf("---------------------------------------------------\n");
printf("---------------------------------------------------\n");
printf("---------------------------------------------------\n");
printf("---------------------------------------------------\n");
printf("***************************************************\n");
printf("***************************************************\n");
printf("***********主菜单*************\n");
printf("***************************************************\n");
printf("****************************************************\n");
printf("***********1.显示日历*************\n");
printf("***********2.查询日历*************\n");
printf("***********3.退出*************\n");
printf("************************\n");
printf("************************\n");
printf("************************\n");
charm[100];
intg=0;
do{
intf=0;
do
{
f=0;
printf("\n请输入相应数字:
");
scanf("%s",m);
if(strlen(m)>2)f=1;
}while(f==1);
switch(*m)
{
case'1':
system("cls");
ty(year,month,day);
backMenu();//实现任意键返回主菜单
caidan(year,month,day);
break;
case'2':
system("cls");
caxun();
backMenu();
caidan(year,month,day);
break;
case'3':
system("cls");
printf("程序已退出!
\n");break;
default:
printf("%c输入错误!
\n");g=1;
}
}while(g);
}
voidmain()
{
structtm*gmt=getDay();
year=gmt->tm_year+1900;
month=gmt->tm_mon+1;
day=gmt->tm_mday;
ty(year,month,day);//用系统时间进行初始化,打印当前月历
backMenu();
caidan(year,month,day);
}
设计体会及改进意见:
此程序是自己所写的第一个功能比较完整的能实现一定的实际功能的程序,代码比较短,不到300行,实现的功能有显示当前日历,进行某天的查询,闰年的判断,日期的合法性判断,。
然后在程序编写过程中,遇到了一些细节性的问题,比如在乱输入的情况下,有时会出现程序崩溃,后来通过修改,修正了漏洞。
到写报告为止,漏洞基本被找出,并得到修正。
通过写这个程序,我对程序的健壮性有了更深的认识,也更加注意程序的细节问题。
参考文献:
《日历推算天才》邓国俊浸会大学教育学系助理教授;
《C程序设计》谭浩强全国高等院校计算机全国基础教育研究会荣誉会长。