1、齐鲁工业大学信息学院课程设计报告课程名称:面向对象程序设计题目名称:日期查询工具学生姓名:刘胜军学生学号:201203014036专业班级:计科(高职)12-1指导教师:任晓强完成日期:2013年6月25日目录一、课程设计目的与任务2二、课程设计内容21本设计题目的主要内容22设计思想与程序构架33软件使用说明书144程序测试及分析155设计总结19三、主要参考资料19四、附录201程序源代码及基本注释2031一、课程设计目的与任务本课程设计是针对面向对象程序设计课程的实践教学项目,为学生提供一个既动手又动脑,针对C+面向对象语言的独立实践的机会,将课本上的理论知识和实际有
3、对应的日期。6).可以对年日历和月日历进行保存。3.最终程序样式4.运行环境(1)WindowsXP/7/8系统(2)MicrosoftVisualC+6.0编译环境5.开发工具C语言6.实现方法(1)定义一个Date类,使包含所有数据成员及函数,如数据成员年、月、日、星期,成员函数年份平润年的判断函数JudgeYear(inty),某日期到公元1年1月1日实有天数的计算函数GetYearDays(inty)等12个主要函数及主要函数中需要用到的12个辅助函数;(2)在主函数中通过选择不同的功能,执行不同的模块,完成相应功能;(3)画出所有模块的流程图;(4)编写代码;(5
5、最后还要定义构造函数以实现对数据成员的快速赋值,包括没有参数,年月日皆为1,只一个参数对年赋值,月日为1,两个参数对年月赋值,日为1,三个参数对年月日赋值,星期直接通过函数计算可得。成员函数累计24个,基本如下:classDate/定义日期类private:intYear;intMonth;intDay;intWeek;public:Date()Year=1;Month=1;Day=1;/构造函数,经初始化数据成员Date(inty)Year=y;Month=1;Day=1;Date(inty,intm)Year=y;Month=m;Day=1;Date(inty,int
6、m,intd)Year=y;Month=m;Day=d;voidSetYear(inty)Year=y;/设置年份voidSetMonth(intm)Month=m;/设置月份voidSetDay(intd)Day=d;/设置日份voidSetWeek(intw)Week=w;/设置星期intGetYear()constreturnYear;/获取年份intGetMonth()constreturnMonth;/获取月份intGetDay()constreturnDay;/获取日份intGetWeek()constreturnW
7、eek;/设置星期staticboolJudgeYear(inty)/判断某年是否为润年(平年)if(y%4=0&y%100!=0|y%400=0)returntrue;elsereturnfalse;intGetMonthDays(intm);/判断某年某月实有天数intGetYearDays(inty);/判断某年实有天数intDateToNum();/判断某年到1年1月1日实有天数DateNumToDate(int);/由1年1月1日至指定日期实有天数返回日期voidOutMonth(intr);/月份输出voidOutWeek(int
8、r);/星期输出voidAllShow();/输出某年全年日历voidWAllShow();/文件输出某年全年日历voidMonthShow();/输出某年某月日历voidWMonthShow();/输出某年某月日历voidWeekShow();/输出某年某月某日星期日历;3.定义平润年的判断,只需要获取指定的年份,能过“能被4整除不能被100整除是润年和能被400整除是润年”判断即可,是润年返回True,否则返回False,直接在类内定义。staticboolJudgeYear(inty)/判断某年是否为润年(平年)if(y%4=0&y%100!=0|
9、y%400=0)returntrue;elsereturnfalse;4.定义任意年份的实有天数判断,只需要判断指定年份是否为润年,是则返回366,否则365。intDate:GetYearDays(inty)/判断某年实有天数if(JudgeYear(y)/调用JudgeYear(inty)判断平润年return366;elsereturn365;5.定义任意月的实有天数判断,需要获取指定的年份与月份,能过判断月份,大月返回31天,小月返回30天,2月还需要通过判断年份是否为润年返回相应值,润年返回29天,平年返回28天。intDate:GetMonthDays(in
10、tm)/判断某年某月实有天数intn;switch(m)/判断月份case1:case3:case5:case7:case8:case10:case12:n=31;break;case4:case6:case9:case11:n=30;break;case2:if(JudgeYear(GetYear()/调用JudgeYear(inty)判断平润年n=29;/是润年返回29年elsen=28;/不是润年返回28年break;returnn;6.定义任意年到1年1月1日的实有天数,定义一个用于存放总天数的n,赋初值为0,通过循环先与指定年份前1年到公元1年
11、所有年份的总天数相加,每次循环都需要调用任意年份的实有天数判断函数获取某年的总天数;指定年份前x年所有年份总天数相加完成后,再通过循环与指定月份前1月到1月所有月份总天数相加,期间也要计算个个月的总天数;最后与指定日期的天数相加,返回n的值即可。intDate:DateToNum()/判断某年到1年1月1日实有天数inty,n=0;for(y=1;yGetYear();y+)n+=GetYearDays(y);for(intm=1;mGetYearDays(y);y+)rest-=GetYearDays(y);for(m=1,rest;restGetMonthDays(m);m+)re
12、st-=GetMonthDays(m);d=rest;returnDate(y,m,d);8.定义判断任意日期对应的星期,此过程只需要计算出指定日期到公元1年1月1日的实有天数,然后除7取余即可,其余数就是对应的星期。9.定义显示年日历,此函数目的在于输入全年日历。具体实现如下:定义4个变量,分别存放指定年份的1月1日到公元1年1月1日的实有天数,可调用函数实现,此年份中某月1号对应的星期,可调用函数计算此年某月1号到公元1年1月1日的实有天数除7取余实现,另两个用于循环。共有两层循环,第一层循环共计12次,一年只有12个月,第二层循环次数由当前要输出的月份的总天数判断。第二层循环内又嵌
13、套二个循环,第一个条件为某月1号是星期几则输出几个tab空格,第二层循环用于输出日历,能过输出的日期加上之前的空格数除7余0作为换行条件,以实现以星期布局。主要部分也就如此,另外日历前后的横线、星期、年月份直接输出,或调用函数输出即可。此次编写,也把月份的输出重定义了一个函数,由获取一个月份,输出大写月份,由switch语句实现。voidDate:AllShow()/输出某年全年日历intn,morday,wek,j;morday=DateToNum();coutYear年endl;for(n=1;n=12;n+)cout-n;cout;OutMonth(n);cout星期日星期一
14、星期二星期三星期四星期五星期六n;wek=morday%7;for(j=1;j=wek;j+)coutt;for(j=1;j=GetMonthDays(n);j+)couttj;if(wek+j)%7=0)coutn;morday+;if(j=GetMonthDays(n)coutn;cout-n;10.定义保存年日历,前面定义了在屏幕上显示的函数,这里和上面差不多,只需要打开或新建一文件,判断文件打开与否,打开了,则把所有输出到屏幕的内容,改为输入到文件即可。最后关闭文件,提示用户保存成功。voidDate:WAllShow()/文件输出某年全年日历intn,morday,
15、wek,j;morday=DateToNum();ofstreamoutfile(年日历.txt,ios:trunc);if(!outfile)cerrOpenerror!endl;exit(1);outfileYear年endl;for(n=1;n=12;n+)outfile-n;outfile;switch(n)case1:outfile一月份n;break;case2:outfile二月份n;break;case3:outfile三月份n;break;case4:outfile四月份n;break;case5:outfile五月份n;break;case6:outfi
16、le六月份n;break;case7:outfile七月份n;break;case8:outfile八月份n;break;case9:outfile九月份n;break;case10:outfile十月份n;break;case11:outfile十一月份n;break;default:outfile十二月份n;outfile星期日星期一星期二星期三星期四星期五星期六n;wek=morday%7;for(j=1;j=wek;j+)outfilet;for(j=1;j=GetMonthDays(n);j+)outfiletj;if(wek+j)%7=0)outfilen;
17、morday+;if(j=GetMonthDays(n)outfilen;outfile-n;outfile.close();cout保存成功endl;11.定义显示月日历,此函数与定义显示年日历函数相似,只是不需要外循环而以,比起定义显示年日历函数相对简单。能过显示年日历函数略微修改即可。voidDate:MonthShow()/输出某年某月日历intmorday,wek,j;morday=DateToNum();coutGetYear()年GetMonth()月endl;cout-n;cout星期日星期一星期二星期三星期四星期五星期六n;wek=morday%7;fo
18、r(j=1;j=wek;j+)coutt;for(j=1;j=GetMonthDays(GetMonth();j+)couttj;if(wek+j)%7=0)coutn;morday+;if(j=GetMonthDays(GetMonth()coutn;cout-n;12.定义保存月日历,与定义保存年日历相似,通过显示月日历函数修改即可。voidDate:WMonthShow()/输出某年某月日历intmorday,wek,j;morday=DateToNum();ofstreamoutfile(月日历.txt,ios:trunc);if(!outfile)cerrOpenerro
19、r!endl;exit(1);outfileGetYear()年GetMonth()月endl;outfile-n;outfile星期日星期一星期二星期三星期四星期五星期六n;wek=morday%7;for(j=1;j=wek;j+)outfilet;for(j=1;j=GetMonthDays(GetMonth();j+)outfiletj;if(wek+j)%7=0)outfilen;morday+;if(j=GetMonthDays(GetMonth()outfilen;outfile-n;outfile.close();cout保存成功12|md.GetMonthD
20、ays(m)|da1;)coutymda;d.SetYear(y);d.SetMonth(m);d.SetDay(da);y=d.GetYear();m=d.GetMonth();da=d.GetDay();.程序主函数中主要功能的实现方式及解释(代码详见附录1)1.为实现循环,调用dowhile语句。2.提示部分直接在dowhile语句内最前面输出即可,如选择几,是什么功能。cout-n;cout选择1:查看X年日历n;cout选择2:查看X年X月日历n;cout选择3:查看X年X月X日对应星期n;cout选择4:计算两日期间的天数差n;cout选择5:计算指定日期后X天
25、保存,直接返回主菜单。2.第二项,用于查询任意指定年份与月份的全月日历。选择第2项后,输入想要查询的年份,月份,年月中间用空格间隔,如“20136”,回车确认后,屏幕上会以一星期为周期显示全月日历,显示完成后,会提示用户是否保存当前所查询的月份日历到文本文档,用户输入y或Y,即可保存,输入其他任意字符则不保存,不输入则不做任何反应。判断结束,若保存,程序自动将本月份日历保存到程序所在位置,并命名为月日历.txt,然后回到主菜单,若不保存,直接返回主菜单。3.第三项,用于查询某具体日期对应的星期。选择第3项后,输入想要查询的具体日期,年月日中间用空格间隔,如“201361”,回车确认后
26、,屏幕上会显示查询日期与对应的星期数,此功能不具有保存功能。显示完毕,直接返回主菜单。4.第四项,用于查询两具体日期间的间隔天数。选择第4项后,首先根据提示输入具体的首日期,然后再输入具体的尾日期,回车确认后,屏幕上会显示两日期的间隔天数,此功能不具有保存功能。显示完毕,直接返回主菜单。(两同一日期间隔天数为0。)5.第五项,用于查询指定日期,推迟任意天数后的日期。选择第5项后,首先根据提示输入具体的固定日期,然后再输入在此日期推迟的天数,回车确认后,屏幕上会显示具体日期,此功能不具有保存功能。显示完毕,直接返回主菜单。(推迟天数为正,往后计算日期,推迟天数为负,往前计算日期。)6.第六
28、行一个功能,一个功能运行结束,整个程序也就结束了。起初以为是当前部分的代码出现问题,可是查了好久,并没有发现错误。后来想了想,分析了一下,应该是主函数中的循环语句出现问题,通过查找,最后确定为循环语句dowhile语句的条件中“=”,打成“=”而造成,更改后,运行正常。2.第13个功能,通过输入任意的10组数据进行测试,把显示出来的结果与的日期进行对比。并未发现异常。3.第45个功能,以同日期间隔天数为0为标准计算。在测试天数差的时候,有几组数据的运行结果为负值。后想到用户输入的日期先后顺序不固定,所以需要将两日期差取绝对值,所以将t2.DateToNum()-t1.DateToNum()
29、修改为abs(t2.DateToNum()-t1.DateToNum()。第5个功能运行正常,且输入的数据有正负之分,正为向后推出查询,负为向前查询。4.第58个功能经测试可正常运行。5设计总结程序设计类似于数学的研究,要求每一个环节都不能有问题,哪怕“一毫米的差池”。在此次的程序的编写中,使我不仅更加熟练了C+的使用与程序的编写,更使我懂得了对任何事情的严谨性。在此程序中判断闰年的条件,某月1日是星期几,输入的日期判断是否有误要求不能有一点错误,否则整个程序的大部分功能将无法使用。除了严谨性外,还有就是要有耐心和足够的细心,程序的编写较为顺利,程序本身测试也没有问题,但在最后测试时,遇到
31、9.四、附录1.程序源代码及基本注释#include/预处理命令#include#includeusingnamespacestd;/使用标准命名空间stdclassDate/定义日期类private:intYear;/年intMonth;/月intDay;/日intWeek;/星期public:Date()Year=1;Month=1;Day=1;/构造函数Date(inty)Year=y;Month=1;Day=1;Date(inty,intm)Year=y;Month=m;Day=1;Date(inty,intm,intd)Year=y;Mo
32、nth=m;Day=d;voidSetYear(inty)Year=y;/设置年份voidSetMonth(intm)Month=m;/设置月份voidSetDay(intd)Day=d;/设置日份voidSetWeek(intw)Week=w;/设置星期intGetYear()constreturnYear;/获取年份intGetMonth()constreturnMonth;/获取月份intGetDay()constreturnDay;/获取日份intGetWeek()constreturnWeek;/设置星期staticb
33、oolJudgeYear(inty)/判断某年是否为润年(平年)if(y%4=0&y%100!=0|y%400=0)returntrue;elsereturnfalse;intGetMonthDays(intm);/判断某年某月实有天数intGetYearDays(inty);/判断某年实有天数intDateToNum();/判断某年到1年1月1日实有天数DateNumToDate(int);/由1年1月1日至指定日期实有天数返回日期voidOutMonth(intr);/月份输出voidOutWeek(intr);/星期输出voidAllS
34、how();/输出某年全年日历voidWAllShow();/文件输出某年全年日历voidMonthShow();/输出某年某月日历voidWMonthShow();/输出某年某月日历voidWeekShow();/输出某年某月某日星期日历;intDate:DateToNum()/判断某年到1年1月1日实有天数inty,n=0;for(y=1;yGetYear();y+)/计算当前年份前一年到公元1年1月1日实有天数n+=GetYearDays(y);for(intm=1;mGetYearDays(y);y+)/计算总天数中最多含有的年份yrest-=GetYear
35、Days(y);for(m=1,rest;restGetMonthDays(m);m+)/计算剩余天数中最多含有的月份mrest-=GetMonthDays(m);d=rest;/将最终剩余的天数赋给天数dreturnDate(y,m,d);/以日期型返回;intDate:GetMonthDays(intm)/判断某年某月实有天数intn;switch(m)case1:case3:case5:case7:case8:case10:case12:/大月n=31天n=31;break;case4:case6:case9:case11:/小月n=30天n=30;bre
36、ak;case2:if(JudgeYear(GetYear()/判断平润年n=29;/润年n=29天elsen=28;/平年n=28天break;returnn;/返回n;intDate:GetYearDays(inty)/判断某年实有天数if(JudgeYear(y)return366;elsereturn365;voidDate:OutMonth(intr)/月份输出switch(r)/根据月份的值,以“一(二、三、)月份”形式输出相应的月份case1:cout一月份n;break;case2:cout二月份n;break;case3:cout三月份n;brea
37、k;case4:cout四月份n;break;case5:cout五月份n;break;case6:cout六月份n;break;case7:cout七月份n;break;case8:cout八月份n;break;case9:cout九月份n;break;case10:cout十月份n;break;case11:cout十一月份n;break;default:cout十二月份n;voidDate:OutWeek(intr)/星期输出switch(r)case1:cout星期一n;break;case2:cout星期二n;break;case3:cout星期三n;br
38、eak;case4:cout星期四n;break;case5:cout星期五n;break;case6:cout星期六n;break;default:cout星期日n;voidDate:AllShow()/输出某年全年日历intn,morday,wek,j;morday=DateToNum();coutYear年endl;/输出总标题年份for(n=1;n=12;n+)/循环开始,共计12个月,12次循环cout-n;/输出横线cout;/保证格式,输出空格OutMonth(n);/调用函数,输出月份cout星期日星期一星期二星期三星期四星期五星期六n;/输出星期wek=morday%7;/计算当前年份的相应月份的1号是星期几for(j=1;j=wek;j+)/输出每月开头的空闲天数,以tab字符顶替coutt;for(j=1;j=GetMonthDays(n);j+)/日期输出循环开始couttj;if(wek+j)%7=0)/判断输出次数,每7次的换行1次coutn;morday+;/总天数,依次加1if(j=GetMonthDays(n)/判断输出日期是否等于当月实有天数,若等于说明当月输出完毕,换行coutn;cout-n;/输出横线;voidDate:WAllSh