收藏 分销(赏)

C万年历课程设计报告.doc

上传人:w****g 文档编号:2939291 上传时间:2024-06-11 格式:DOC 页数:24 大小:101KB
下载 相关 举报
C万年历课程设计报告.doc_第1页
第1页 / 共24页
C万年历课程设计报告.doc_第2页
第2页 / 共24页
C万年历课程设计报告.doc_第3页
第3页 / 共24页
C万年历课程设计报告.doc_第4页
第4页 / 共24页
C万年历课程设计报告.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、 武汉纺织大学课 程 设 计 报 告 书名 称 C+程序设计课程设计题 目 万年历 专业班级 指导教师 李 敏 2014 年 6月11 日 目录课 程 设 计 报 告 书1第一章 需求分析.3 第二章 概要设计.2第三章 详细设计与编码5第四章 调试分析13第五章 用户使用说明24设计心得15参 考 文 献26致谢.16 第一章 需求分析 如今的社会是一个信息的时代,随着电脑等科技产品在人们生活中占据着越来越重要的地位,人们就会越加的善加利用,这为我们的生活带来了极大的效率,同时计算机的普及更可以看出它所占的地位。 万年历作为日常中的一种小工具,它具有多方面的小工能,主要在日期的显示上给人以直

2、观的表达效果,在日期的查询上方便简洁,还有就是在某些节日的提醒上都给我们带来极大的方便 ,是一种比较实用的小工具。我们每个人都可以在自己的个人电脑上进行制作,一方面不仅可以加强巩固我们对C+语言的学习,还可以通过自主的编程找到自身的缺点。这对培养我们自身的创新能力和动手能力具有很大的作用。 第二章 概要设计 1. 设计要求 模仿现实生活中的挂历. 当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几).当系统日期变到下一月时,系统自动翻页到下一月.2. 总体设计 实现操作流程图运行万年历程序 进入程序界面 显示当月月历 选择执行操作 查询月历 退出 实时时钟显示 第三章 详

3、细设计与编码设计思路 要输出一个月的月历。第一要输出一行星期,这个很简单就可以实现,第二要知道一个月的一号是星期几,为了知道它,必须有一个日历的开始时间,我在这里设定的是1970年1月1号,此时它对应的事星期四,然后要计算你输入的日期与开始日期的总天数totaldays,(totaldays+4)%7即可得到月头是星期几,然后为了判断用户输入的日期是否正确,还得有一个检测判断函数,然后关于第三个功能实时时钟显示的实现思想为:每隔一秒输出系统当前时钟,每次输出时要在第一排的最前面输出,以覆盖掉上次输出的时钟,给人像是时钟自己在变化,我们可以调用系统API函数SetConsoleCursorPos

4、ition()来控制光标位置,整体思路如上所述。每个模块实现详解 Calendar类的实现,具体代码如下class Calendarpublic:Calendar()string p;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(int y,int m,int d)long a;year=y;month=m;day=d;a=getTotalDay();

5、a=a*24*3600;t=a;int convert(string p);string getYear() const return extract(20,4);string getMonth() const return extract(4,3); string getDay() const return extract(8,2); string getTime() const return extract(11,8); int getYear2() const return year;int getMonth2() const return month; int getDay2() co

6、nst return day; friend int create();friend bool isTrueDate(Calendar& temp);bool isLeapYear(int year);int getTotalDay();int getStartDay();int getDaysInMonth(int a);void display();friend ostream& operator(ostream& out,Calendar& a);private:string extract(int offset,int count) conststring timeString=cti

7、me(&t);return timeString.substr(offset,count);time_t t;int year;int month;int day;主要函数详解1、总天数函数int Calendar:getTotalDay()int i=1970,totalDay=0; /从1970年开始循环到当前年分for(;iyear;i+)if(isLeapYear(i) /判断点前年份是否为闰年totalDay+=366; /如果是加366天,否则加365天elsetotalDay+=365;for(i=1;imonth;i+)totalDay+=getDaysInMonth(i);r

8、eturn totalDay;2、求每个月天数函数int Calendar:getDaysInMonth(int m)int a;if(m=1|m=3|m=5|m=7|m=8|m=10|m=12) /1,3,5,7,8,10,12a=31;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;return a;3、重载输出操作符函数ostream& operator(ostream& out,Calendar&

9、a)int i=1,startDay;startDay=a.getStartDay();out Sun Mon Tue Wed Thu Fri Satendl; /输出星期行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_INTEN

10、SITY|FOREGROUND_RED); /设置字的颜色为红色outsetw(4)i+1; /当月历中日期为当前日期时显示为红色 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);/设置字的颜色为白色,仅仅使当前日期显示为红色,其他日期为白色elseoutsetw(4)i+1;coutendl;return out;4、判断输入日期是否正确函数bool isTrueDate(Calendar&

11、 temp)if(temp.day=temp.getDaysInMonth(temp.month)return true; /输入的天数是不是小于当月最大日期else return false;if(temp.isLeapYear(temp.year)&temp.month=2)if(temp.day=29) /闰年2月是不是小于29天return true;elsereturn false;if(!temp.isLeapYear(temp.year)&temp.month=2)if(temp.day=28) /平年2月是不是小于28天return true;elsereturn false;

12、5、实时显示时钟函数int localTime() int i=0;time_t now; struct tm *timenow;HANDLE hStdout; /定义句柄CONSOLE_SCREEN_BUFFER_INFO pBuffer; /CONSOLE_CURSOR_INFO 结构体中包含了关于命令行光标的一些信息,是否显示和光标大小两个信息。通过更改这个结构体,再赋给命令行,就可以实现想要的一些效果了hStdout = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hStdout, &pBuffer); /让句

13、柄指向当前进程,获取当前光标位置COORD pos; /COORD结构体,与位置有关while(i10)time(&now); /time()用来获取当前的系统时间,返回的结果是一个time_t类型,原型time_t time(time_t *t);/如果t是空指针,直接返回当前时间。如果t不是空指针,返回当前时间的同时,将返回值赋予t指向的内存空间timenow = localtime(&now); /原型struct tm *localtime(const time_t *clock)/把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间SetConsoleTextAt

14、tribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN); /设置字的颜色为绿色,时钟绿色输出coutasctime(timenow); /函数原型char* asctime (const struct tm * timeptr),把timeptr指向的tm结构体中储存的时间转换为字符串字符串格式返回pos.X=0;pos.Y=pBuffer.dwCursorPosition.Y; /设置光标位置为排头SetConsoleCursorPosition(hStdout,pos); /移动光标到排头

15、i+;Sleep(1000);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);/设置字的颜色为白色return 1;6、菜单函数int select()int n=0;cout*endl;cout* 1.显示当月日历 *endl;cout* 2.查询日历 *endl;cout* 3.实时显示时钟 *endl;cout* 4.退出软件 *endl;cout*endl;coutendl;coutp

16、lease selset the operator!n;coutn4|n1) /纠错coutthe numble you input is wrong ,try again!n;return n; 第四章 调试分析 程序运行测试 进入程序界面: (进入程序的第一步) 选择操作1:(可以看到显示出当月月历,并且当天用红色标出)再次选择,选择操作2(提示是以年月方式,或者以年月日方式查询月历)(选择方式一,并输入1992年13月,提示输入错误,清再次输入)(再次输入1992年12月后得到正确结果)再次选择操作,选择操作3(可以看到时间在不断变化,达到了实际效果) 第五章 用户使用说明 这是一个简单

17、的万年历程序,用户可以通过键入年月或者年月日,便可以轻松快速的查询到当月月历,还可以输入1快速的得到现在用户所处月的月历,每天的信息一目了然,方便快捷,可能够通过键入3来获取当前时间(精确到秒)。 设计心得通过几天的不懈努力,这一份C+的课程设计终于在自己的努力与同学的帮助下顺利的完成了。前期可能是自己的一些方面薄弱,并没有完全的理解一些代码,从而设计出来的程序编译出错,还好在一些知识能力强的同学下进行了合理的改正才有了现在的这个完整的程序。设计一个万年历的程序之前,可能都是有自己大概的一点想法,也许看上去简单,但通过实际的操作我便发现,各种细小的错误都可能会出现,这便让我意识到个人平时的动手

18、操作还是有欠缺的。所以还是如老师讲的那般,以电脑软件的检验来通过不断的练习完善自己的薄弱点。通过这次为数不多的几天计算机实践学习,加上这学期的学习,我了解了一些关于c+语言的知识,理解巩固了我c+语言的理论知识,开始可能学的枯燥,但不断的深入便能发现他的有趣点,就如这一次万年历的设计,所以这便更容易让我感觉到,只要认真的学了,加上自己的汗水,还是一样能够有收获的。 参 考 文 献作者:Y.Daniel Liang Java语言程序设计作者: Richard Johnsonbaugh & Martin Kalin 面向对象程序设计C+语言描述百度文库: 致 谢附录一:#include #incl

19、ude #include #include #include using namespace std;class Calendar;ostream& operator(ostream& out,Calendar& a);bool isTrueDate(Calendar& temp);int create();class Calendarpublic:Calendar()string p;t=time(0);p=getYear();year=atoi(p.c_str(); p=getDay();day=atoi(p.c_str();p=getMonth();month=convert(p);co

20、utctime(&t);Calendar(int y,int m,int d)long a;year=y;month=m;day=d;a=getTotalDay();a=a*24*3600;t=a;int convert(string p);string getYear() const return extract(20,4);string getMonth() const return extract(4,3); string getDay() const return extract(8,2); string getTime() const return extract(11,8); in

21、t getYear2() const return year;int getMonth2() const return month; int getDay2() const return day; friend int create();friend bool isTrueDate(Calendar& temp);bool isLeapYear(int year);int getTotalDay();int getStartDay();int getDaysInMonth(int a);void display();friend ostream& operator(ostream& out,C

22、alendar& a);private:string extract(int offset,int count) conststring timeString=ctime(&t);return timeString.substr(offset,count);time_t t;int year;int month;int day;int Calendar:convert(string p)int monthName;if(p=Jan)monthName=1;if(p=Feb)monthName=2;if(p=Mar)monthName=3;if(p=Apr)monthName=4;if(p=Ma

23、y)monthName=5;if(p=Jun)monthName=6;if(p=Jul)monthName=7;if(p=Aug)monthName=8;if(p=Sep) monthName=9;if(p=Oct) monthName=10;if(p=Nov) monthName=11;if(p=Dec) monthName=12;return monthName;bool Calendar:isLeapYear(int y)if(y%400=0|(y%4=0&y%100!=0)return true;elsereturn false;int Calendar:getTotalDay()in

24、t i=1970,totalDay=0; for(;iyear;i+)if(isLeapYear(i)totalDay+=366;elsetotalDay+=365;for(i=1;imonth;i+)totalDay+=getDaysInMonth(i);return totalDay;int Calendar:getDaysInMonth(int m)int a;if(m=1|m=3|m=5|m=7|m=8|m=10|m=12)a=31;if(m=4|m=6|m=9|m=11)a=30;if(isLeapYear(year)=true&m=2)a=29;if(isLeapYear(year

25、)=false&m=2)a=28;return a;int Calendar:getStartDay()int a=0;a=getTotalDay();a=(a+4)%7;return a;void Calendar:display()int i=1,startDay;startDay=getStartDay();cout Mon Tue Wed Thu Fri Sat Sunendl;for(;i=startDay;i+)cout ;for(i=0;igetDaysInMonth(month);i+)if(i+startDay)%7=0)coutendl;coutsetw(4)i+1;cou

26、tendl;ostream& operator(ostream& out,Calendar& a)int i=1,startDay;startDay=a.getStartDay();out Sun Mon Tue Wed Thu Fri Satendl;for(;i=startDay;i+)out ;for(i=0;ia.getDaysInMonth(a.convert(a.getMonth();i+)if(i+startDay)%7=0)outendl;if(i+1)=a.day)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),

27、FOREGROUND_INTENSITY|FOREGROUND_RED); /设置字的颜色为红色outsetw(4)i+1; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);elseoutsetw(4)i+1;coutendl;return out;int select()int n=0;cout*endl;cout* 1.显示当月日历 *endl;cout* 2.查询日历 *endl;cou

28、t* 3.实时显示时钟 *endl;cout* 4.退出软件 *endl;cout*endl;coutendl;coutplease selset the operator!n;coutn4|n1)coutthe numble you input is wrong ,try again!n;return n;int localTime() int i=0;time_t now; struct tm *timenow;HANDLE hStdout; /定义句柄CONSOLE_SCREEN_BUFFER_INFO pBuffer; /CONSOLE_CURSOR_INFO hStdout = Ge

29、tStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hStdout, &pBuffer); COORD pos; /COORD结构体,与位置有关while(i10)time(&now); timenow = localtime(&now);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN); /设置字的颜色为绿色coutasctime(timenow); pos.X=0;pos.Y=pBuffe

30、r.dwCursorPosition.Y; SetConsoleCursorPosition(hStdout,pos); i+;Sleep(1000);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);/设置字的颜色为白色return 1;int create()int x, y, z,n;coutplease chioce the input way:endl;cout1.年月方式(默认为当月

31、一号)endl;cout2.年月日方式endln;coutplease input the date:2|n1)coutthe numble you input is wrong ,please try again!n;if(n=1)cinxy;z=1;if(n=2)cinxyz;Calendar temp(x,y,z); /设置临时变量,测试输入数据是否正确while(!isTrueDate(temp)coutthe date you input is wrong,please checked,and try again!xyz;if(n=1)cinxy;z=1;temp.year=x;te

32、mp.month=y;temp.day=z;Calendar a1(x,y,z);cout a1.getYear2()年 a1.getMonth2()月 a1.getDay2()日endlendl;couta1;coutendl;return 1;bool isTrueDate(Calendar& temp)if(temp.day=temp.getDaysInMonth(temp.month)return true;else return false;if(temp.isLeapYear(temp.year)&temp.month=2)if(temp.day=29)return true;el

33、sereturn false;if(!temp.isLeapYear(temp.year)&temp.month=2)if(temp.day=28)return true;elsereturn false;int main()Calendar a;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);for(;)switch(select()case 1:cout a.getMonth() a.getDay() a.getYear()endlendl; couta; break;case 2:create();break;case 3:localTime(); break;case 4:exit(0);break;default:break;return 1;

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服