武汉纺织大学课程设计报告书第1页共24页武汉纺织大学课程设计报告书名称C++程序设计课程设计题目万年历专业班级指导教师李敏2014年6月11日第2页共24页目录课程设计报告书..............................................................1第一章需求分析......................................................................3第二章概要设计......................................................................4第三章详细设计与编码..........................................................5第四章调试分析......................................................................13第五章用户使用说明...........................................................144设计心得.....................................................................................15参考文献............................................................................166致谢............................................................................................16武汉纺织大学课程设计报告书第3页共24页第一章需求分析如今的社会是一个信息的时代,随着电脑等科技产品在人们生活中占据着越来越重要的地位,人们就会越加的善加利用,这为我们的生活带来了极大的效率,同时计算机的普及更可以看出它所占的地位。万年历作为日常中的一种小工具,它具有多方面的小工能,主要在日期的显示上给人以直观的表达效果,在日期的查询上方便简洁,还有就是在某些节日的提醒上都给我们带来极大的方便,是一种比较实用的小工具。我们每个人都可以在自己的个人电脑上进行制作,一方面不仅可以加强巩固我们对C++语言的学习,还可以通过自主的编程找到自身的缺点。这对培养我们自身的创新能力和动手能力具有很大的作用。武汉纺织大学课程设计报告书第4页共24页第二章概要设计1.设计要求①模仿现实生活中的挂历.②当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几).③当系统日期变到下一月时,系统自动翻页到下一月.2.总体设计1实现操作流程图显示当月月历查询月历退出实时时钟显示运行万年历程序进入程序界面选择执行操作武汉纺织大学课程设计报告书第5页共24页第三章详细设计与编码1设计思路要输出一个月的月历。第一要输出一行星期,这个很简单就可以实现,第二要知道一个月的一号是星期几,为了知道它,必须有一个日历的开始时间,我在这里设定的是1970年1月1号,此时它对应的事星期四,然后要计算你输入的日期与开始日期的总天数totaldays,(totaldays+4)%7即可得到月头是星期几,然后为了判断用户输入的日期是否正确,还得有一个检测判断函数,然后关于第三个功能—实时时钟显示的实现思想为:每隔一秒输出系统当前时钟,每次输出时要在第一排的最前面输出,以覆盖掉上次输出的时钟,给人像是时钟自己在变化,我们可以调用系统API函数SetConsoleCursorPosition()来控制光标位置,整体思路如上所述。2每个模块实现详解㈠Calendar类的实现,具体代码如下classCalendar{public:Calendar(){stringp;武汉纺织大学课程设计报告书第6页共24页t=time(0);p=getYear();year=atoi(p.c_str());//将从系统时间中提取的字符串转换为整数p=getDay();day=atoi(p.c_str());p=getMonth();month=convert(p);//coutctime(&t);}Calendar(inty,intm,intd){longa;year=y;month=m;day=d;a=getTotalDay();a=a*24*3600;t=a;}intconvert(stringp);stringgetYear()const{returnextract(20,4);}stringgetMonth()const{returnextract(4,3);}stringgetDay()const{returnextract(8,2);}stringgetTime()const{returnextract(11,8);}intgetYear2()const{returnyear;}intgetMonth2()const{returnmonth;}intgetDay2()const{returnday;}friendintcreate();friendboolisTrueDate(Calendar&temp);boolisLeapYear(intyear);intgetTotalDay();intgetStartDay();intgetDaysInMonth(inta);voiddisplay();friendostream&operator(ostream&out,Calendar&a);武汉纺织大学课程设计报告书第7页共24页private:stringextract(intoffset,intcount)const{stringtimeString=ctime(&t);returntimeString.substr(offset,count);}time_tt;intyear;intmonth;intday;};㈡主要函数详解1、总天数函数intCalendar::getTotalDay(){inti=1970,totalDay=0;//从1970年开始循环到当前年分for(;iyear;i++){if(isLeapYear(i))//判断点前年份是否为闰年totalDay+=366;//如果是加366天,否则加365天elsetotalDay+=365;}for(i=1;imonth;i++)totalDay+=getDaysInMonth(i);returntotalDay;}2、求每个月天数函数intCalendar::getDaysInMonth(intm){inta;if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)//1,3,5,7,8,10,12a=31;武汉纺织大学课程设计报告书第8页共24页if(m==4||m==6||m==9||m==11)//4,6,9,11月份a=30;if(isLeapYear(year)==true&&m==2)//闰年2月a=29;if(isLeapYear(year)==false&&m==2)//平年2月a=28;returna;}3、重载输出操作符函数ostream&operator(ostream&out,Calendar&a){inti=1,startDay;startDay=a.getStartDay();outSunMonTueWedThuFriSatendl;//输出星期行for(;i=startDay;i++)out;//前面没有日期以空格填充for(i=0;ia.getDaysInMonth(a.convert(a.getMonth()));i++){if((i+startDay)%7==0)//每输出7个后换行outendl;if((i+1)==a.day){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);//设置字的颜色为红色outsetw(4)i+1;//当月历中日期为当前日期时显示为红色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);}//设置字的颜色为白色,仅仅使当前日期显示为红色,其他日期为白色else{outsetw(4)i+1;}}武汉纺织大学课程设计报告书第9页共24页coutendl;returnout;}4、判断输入日期是否正确函数boolisTrueDate(Calendar&temp){if(temp.day=temp.getDaysInMonth(temp.month))returntrue;//输入的天数是不是小于当月最大日期elsereturnfalse;if(temp.isLeapYear(temp.year)&&temp.month==2){if(temp.day=29)//闰年2月是不是小于29天returntrue;elsereturnfalse;}if(!temp.isLeapYear(temp.year)&&temp.month==2){if(temp.day=28)//平年2月是不是小于28天returntrue;elsereturnfalse;}}5、实时显示时钟函数intlocalTime(){inti=0;time_tnow;structtm*timenow;HANDLEhStdout;//定义句柄武汉纺织大学课程设计报告书第10页共24页CONSOLE_SCREEN_BUFFER_INFOpBuffer;//CONSOLE_CURSOR_INFO结构体中包含了关于命令行光标的一些信息,是否显示和光标大小两个信息。通过更改这个结构体,再赋给命令行,就可以实现想要的一些效果了hStdout=GetStdHandle(STD_OUTPUT_HANDLE);GetConsoleScreenBufferInfo(hStdout,&pBuffer);//让句柄指向当前进程,获取当前光标位置COORDpos;//COORD结构体,与位置有关while(i10){time(&now);//time()用来获取当前的系统时间,返回的结果是一个time_t类型,原型time_ttime(time_t*t);//如果t是空指针,直接返回当前时间。如果t不是空指针,返回当前时间的同时,将返回值赋予t指向的内存空间timenow=localtime(&now);//原型structtm*localtime(consttime_t*clock)//把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);//设置字的颜色为绿色,时钟绿色输出coutasctime(timenow);//函数原型char*asctime(conststructtm*timeptr),把timeptr指向的tm结构体中储存的时间转换为字符串字符串格式返回pos.X=0;pos.Y=pBuffer.dwCursorPosition.Y;//设置光标位置为排头SetConsoleCursorPosition(hStdout,pos);//移动光标到排头i++;武汉纺织大学课