C课程设计说明书万年历.docx
- 文档编号:25384697
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:31
- 大小:97.77KB
C课程设计说明书万年历.docx
《C课程设计说明书万年历.docx》由会员分享,可在线阅读,更多相关《C课程设计说明书万年历.docx(31页珍藏版)》请在冰豆网上搜索。
C课程设计说明书万年历
数学与计算机学院
课程设计说明书
课程名称:
计算机科学与技术程序设计语言-课程设计
课程代码:
题目:
万年历系统
年级/专业/班:
学生姓名:
学 号:
31200908061117
开始时间:
2010年12月24日
完成时间:
2011年01月06日
课程设计成绩:
学习态度及平时成绩(30)
技术水平与实际能力(20)
创新(5)
说明书撰写质量(45)
总分(100)
指导教师签名:
年月日
目录
1引言1
1.1问题的提出1
1.2国内外研究的现状1
1.3任务与分析1
2程序的主要功能3
2.1显示功能3
2.2自动翻页功能3
2.3查询功能3
2.4帮助功能3
2.5退出功能3
3程序运行平台4
4总体设计图4.1流程图5
5程序代码明细6
6模块分析11
6.1系统日期模块11
6.2打印模块11
6.3闰年判断模块12
6.4查询模块12
6.5菜单模块voidmainMenu(intyear,intmonth,intday)//主菜单12
6.6关键代码13
7系统测试首先进入VC++6.0,打开工程person.dsw,然后进入源程序,接着选择Build下的Executeperson.exe即可,也可以不打开工程,直接双击person文件夹下的debug或release子文件夹下的person.exe文件即可运行程序。
7.1进入程序14
8结论17
1引言
1.1问题的提出
万年历是我国古代传说中最古老的一部太阳历。
为纪念历法编撰者万年功绩,便将这部历法命名为“万年历”。
而现在所使用的万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体的日期的年历,方便有需要的人查询使用。
怎样在电脑上显示万年历以便查询,是一个很普遍的需求。
附:
万年历算星期几:
只要随便说出公元几几年几月几日就可以马上算出是星期几。
只要计算出日的代码,月份代码,年份代码。
三个加起来除以七的余数就是星期几,(如余数是三,则就是星期三)。
日的代码计算:
日的代码最简单,就是它本身,是几号就是几。
月份代码计算:
月份代码也很简单,下面有十二个数:
144725736146,分别代表一至十二月份每个月的代码。
比如,九月份的代码为6。
(据来宾介绍,他是用逆推的方法,计算出这12个月份代码的,即知道某年某月某日是星期几,反过来推算月份代码。
年份代码计算:
年份代码相对比较复杂,先记住2000年对应的年份代码是4,这是基础代码,牢记即可。
假如大于2000年,比如2010年,则对应的年份代码是(2010-2000)÷4=2……2,再用基数代码4减去2倍的商加上余数再加1。
即4-2×2+2+1=3,则2010年对应的年份代码为3。
如果没有余数,即润年,则余数后面的1也不用加。
比如2008年,对应的年份代码为0。
1.2国内外研究的现状
万年历已经在我们生活中随处可见,基本功能的万年历很早就出现了,现在已经进入到多元化的设计时代了。
现在的万年历不单单可以查询日历还带有许多的拓展功能,如黄历,星座,节日等等。
1.3任务与分析
要求:
模仿现实生活中的挂历。
当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几)。
当系统日期变到下一月时,系统自动翻页到下一月
分析:
1:
难点在于判断星期,但根据蔡勒公式,可以很容易地有年月日推断出星期:
nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday;
w=nDay%7;
其中year:
要查询的年份
nday:
从该年的一月一日起到该天的天数
w:
得出的星期数,w==0表示星期天。
在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过定长度输出日期,在遇到某天时星期六时,就换行输出,因此可以按照月历的格式输出。
对于初始输入当前月历,可以通过
time_ttimer;
structtm*gmt;
time(&timer);
gmt=localtime(&timer);
gmt就是一个时间结构体,可以从中取出年月日。
2:
闰年的判断,能被4整除但不能被100整除,或者能被400整除的年份为闰年,否则为平年。
日期的查询,就是直接打印改天所在月份的月历。
3:
判断日期是否合法,可以先判断年月日是否有小于0的值,月和日是否有超出最大值12和31,如果通过此判断合法,再判断是否时闰年,如果时闰年,则判断二月份是否满足要求,闰年二月份不能超过29天,平年二月份不能超过28天。
在查询过程中,如果发现输入不合法或者不满足输入要求,则要求重新输入。
2程序的主要功能
查询万年历
2.1显示功能
能够显示以系统当前时间为准的日历。
2.2自动翻页功能
能够随系统时间改变而自动翻页到下一页。
2.3查询功能
能够查询任意年份和月份的万年历。
2.4帮助功能
提供程序使用的说明。
2.5退出功能
随时退出程序。
3程序运行平台
VC++6.0。
具体操作如下:
新建行编辑器工程,然后按照要求编写代码,再编译,链接,执行等。
要是出现报错,就依次查找错误行,分析报错原因并修改。
2、日期查询
3、帮助文件
1、日期显示
4总体设计
图4.1流程图
图4.2功能模块
5程序代码明细
#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}};
intrunYear(intyear)//判断是否是闰年
{
intflag=0;
if(year%400==0||(year%4==0&&year%100!
=0))
flag=1;
returnflag;
}
structtm*getDay()//从系统取得当前时间
{
time_ttimer;
structtm*gmt;
time(&timer);
gmt=localtime(&timer);
returngmt;
}
intdayExame(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(runYear(year)&&day>29)
return0;
elseif(runYear(year)==0&&day>28)
return0;
}
return1;
}
intgetwDay(intyear,intmonth,intday)//取得星期
{
intnday=0,nDay,i,w;
for(i=0;i nday+=daysOfMonth[runYear(year)][i]; nday+=day; nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nDay%7; returnw; } voidprintCalender(intyear,intmonth,intday)//打印月历 { inti; intw; intn; intnowDay=1; charwday[7][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; printf("%d年%d月%d日\n",year,month,day); printf("***********************************\n"); for(i=0;i<7;i++) printf("%5s",wday[i]); printf("\n"); w=getwDay(year,month,nowDay);//找到第一天的星期 n=daysOfMonth[runYear(year)][month-1]; switch(w)//放置第一天 { case0: printf("%5d",nowDay);break; case1: printf("%10d",nowDay);break; case2: printf("%15d",nowDay);break; case3: printf("%20d",nowDay);break; case4: printf("%25d",nowDay);break; case5: printf("%30d",nowDay);break; default: printf("%35d\n",nowDay); } nowDay++; for(i=1;i { w=getwDay(year,month,nowDay); printf("%5d",nowDay); if(w==6)//如果是星期六则换行打印 puts("\n"); nowDay++; } printf("\n***********************************\n\n"); } voidcheckCalender()//查询日历 { intyear,month,day; system("cls"); printf("请输入你要查询的日期(格式为年月日,如20101212): "); scanf("%d%d%d",&year,&month,&day); while(! dayExame(year,month,day))//如果日期输入不正确,则重新输入 { printf("%c你输入的日期错误,请重新输入: ",7); scanf("%d%d%d",&year,&month,&day); } system("cls"); if(runYear(year)) printf("\n闰年\n\n"); elseprintf("\n正常年\n\n"); printCalender(year,month,day); } voidbackMenu() { printf("请按任意字符键返回主菜单: "); getch(); system("cls"); } voidmainMenu(intyear,intmonth,intday)//主菜单 { charmenu[100]; intflag=0; printf("************主菜单************\n"); printf("*1、日历显示*\n"); printf("*2、日历查询*\n"); printf("*3、帮助*\n"); printf("*4、退出*\n"); printf("******************************\n"); do{ intf=0; do { f=0; intf("\n请输入相应数字: "); scanf("%s",menu); if(strlen(menu)>2)f=1; }while(f==1);pr switch(*menu) { case'1': system("cls");//清屏 printCalender(year,month,day); backMenu();//实现任意键返回主菜单 mainMenu(year,month,day); break; case'2': system("cls"); checkCalender(); backMenu(); mainMenu(year,month,day); break; case'3': system("cls"); printf("在主菜单中输入相应的数字就可以完成以下功能: \n\n"); printf("*1、显示今天所在月的月份\n\n"); printf("*2、输入日期,判断该年是否是闰年,并显示所在月份的月历\n\n"); printf("*3、显示功能及操作方法\n\n"); printf("*4、退出程序\n\n"); backMenu(); mainMenu(year,month,day); break; case'4': system("cls");printf("程序已退出! \n");exit(0); default: printf("%c输入错误! \n",7);flag=1; } }while(flag); } voidmain() { structtm*gmt=getDay(); year=gmt->tm_year+1900; month=gmt->tm_mon+1; day=gmt->tm_mday; printCalender(year,month,day);//用系统时间进行初始化,打印当前月历 backMenu(); mainMenu(year,month,day); } } 6模块分析 6.1系统日期模块 structtm*getDay()//从系统取得当前时间 { time_ttimer; structtm*gmt; time(&timer); gmt=localtime(&timer); returngmt; } 6.2打印模块 voidprintCalender(intyear,intmonth,intday)//打印月历 { inti; intw; intn; intnowDay=1; charwday[7][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; printf("%d年%d月%d日\n",year,month,day); printf("***********************************\n"); for(i=0;i<7;i++) printf("%5s",wday[i]); printf("\n"); w=getwDay(year,month,nowDay);//找到第一天的星期 n=daysOfMonth[runYear(year)][month-1]; switch(w)//放置第一天 { case0: printf("%5d",nowDay);break; case1: printf("%10d",nowDay);break; case2: printf("%15d",nowDay);break; case3: printf("%20d",nowDay);break; case4: printf("%25d",nowDay);break; case5: printf("%30d",nowDay);break; default: printf("%35d\n",nowDay); } nowDay++; for(i=1;i { w=getwDay(year,month,nowDay); printf("%5d",nowDay); if(w==6)//如果是星期六则换行打印 puts("\n"); nowDay++; } printf("\n***********************************\n\n"); } 6.3闰年判断模块 闰年的判断,能被4整除但不能被100整除,或者能被400整除的年份为闰年,否则为平年。 日期的查询,就是直接打印改天所在月份的月历。 intrunYear(intyear)//判断是否是闰年 { intflag=0; if(year%400==0||(year%4==0&&year%100! =0)) flag=1; returnflag; } 6.4查询模块 voidcheckCalender()//查询日历 { intyear,month,day; system("cls"); printf("请输入你要查询的日期(格式为年月日,如20101212): "); scanf("%d%d%d",&year,&month,&day); while(! dayExame(year,month,day))//如果日期输入不正确,则重新输入 { printf("%c你输入的日期错误,请重新输入: ",7); scanf("%d%d%d",&year,&month,&day); } 6.5菜单模块 voidmainMenu(intyear,intmonth,intday)//主菜单 { charmenu[100]; intflag=0; printf("************主菜单************\n"); printf("*1、日历显示*\n"); printf("*2、日历查询*\n"); printf("*3、帮助*\n"); printf("*4、退出*\n"); printf("******************************\n") 6.6关键代码 structtm*getDay(); 该函数用以取得系统的时间。 该函数没有参数,返回值类型为structtm*,是一个包含时间的结构体。 intdayExame(intyear,intmonth,intday); 该函数用以判断输入的年份是否合法,参数为要判断的年月日,返回值为1表示该日期合法,为0表示不合法。 intgetwDay(intyear,intmonth,intday); 该函数用以根据一个日期推断星期,参数为要判断的年月日。 返回值为整型,123456分别表示星期一到星期六,0表示星期天。 voidcheckCalender(); 该函数用以显示要查询的日期的月历,无参数和返回值,。 voidinlinebackMenu(); 该函数为内联函数,用以实现完成某项功能后按任意字符键返回主菜单,无参数和返回值, voidmainMenu(intyear,intmonth,intday); 该函数参数为系统日期,无返回值,用户在该函数执行时可以选择功能。 7系统测试 首先进入VC++6.0,打开工程person.dsw,然后进入源程序,接着选择Build下的Executeperson.exe即可,也可以不打开工程,直接双击person文件夹下的debug或release子文件夹下的person.exe文件即可运行程序。 7.1进入程序 7.2按任意字符返回主菜单 在键盘上输入任意字符,进入主菜单 7.31号功能 显示系统时间 7.42号功能 输入201115 得到2011年1月5日的日历 输入11111(测试对错误日期的判断) 提示错误信息,要求重新输入 7.53号功能 得到提示信息 7.64号功能 成功退出 8结论 此程序是自己所写的第一个功能比较完整的能实现一定的实际功能的程序,代码比较短,不到200行,实现的功能有显示当前日历,进行某天的查询,闰年的判断,日期的合法性判断,简单的提示信息。 然后在程序编写过程中,遇到了一些细节性的问题,比如在乱输入的情况下,有时会出现程序崩溃,后来通过修改,修正了漏洞。 到写报告为止,漏洞基本被找出,并得到修正。 通过写这个程序,我对程序的健壮性有了更深的认识,也更加注意程序的细节问题。 完成程序的编写,决不意味着万事大吉。 你认为万无一失的程序,实际上机运行时可能不断出现麻烦。 如编译程序检测出一大堆错误。 有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。 开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。 程序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是非常重要的。 有时候一个消耗你几个小时时间的小小错误,调试高手一眼就看出错误所在。 通过这次为数不多的几天计算机实践学习,我了解了一些关于c语言的知识,理解巩固了我c语言的理论知识,这对我将来到社会工作将会有莫大的帮助。 同时它让我知道,只要你努力,任何东西都不会太难。 最后小结: 程序设计过程有如何解决实际问题,从解决实际问题的角度,我们可以这样来看: 首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;其次,从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的变量、数组、函数,然后确定处理过程--算法。 可得最后结论。 附录(可选) 附录1源程序清单 #include #include #include #include intyear,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 说明书 万年历