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





《最新C--万年历课程设计报告...doc》由会员分享,可在线阅读,更多相关《最新C--万年历课程设计报告...doc(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateC-万年历课程设计报告.存档资料 成绩: 武汉纺织大学课 程 设 计 报 告 书名 称 C+程序设计课程设计题 目 万年历 专业班级 指导教师 李 敏 2014 年 6月11 日 -目录课 程 设 计 报 告 书1第一章 需求分析.3 第二章 概要设计.2第三章 详细设计与编码5第四章 调试分析13第五章 用户使用说明24设计心得15参 考 文 献26致谢.16 第一
2、章 需求分析 如今的社会是一个信息的时代,随着电脑等科技产品在人们生活中占据着越来越重要的地位,人们就会越加的善加利用,这为我们的生活带来了极大的效率,同时计算机的普及更可以看出它所占的地位。 万年历作为日常中的一种小工具,它具有多方面的小工能,主要在日期的显示上给人以直观的表达效果,在日期的查询上方便简洁,还有就是在某些节日的提醒上都给我们带来极大的方便 ,是一种比较实用的小工具。我们每个人都可以在自己的个人电脑上进行制作,一方面不仅可以加强巩固我们对C+语言的学习,还可以通过自主的编程找到自身的缺点。这对培养我们自身的创新能力和动手能力具有很大的作用。 第二章 概要设计 1. 设计要求 模
3、仿现实生活中的挂历. 当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几).当系统日期变到下一月时,系统自动翻页到下一月.2. 总体设计 实现操作流程图运行万年历程序 进入程序界面 显示当月月历 选择执行操作 查询月历 退出 实时时钟显示 第三章 详细设计与编码设计思路 要输出一个月的月历。第一要输出一行星期,这个很简单就可以实现,第二要知道一个月的一号是星期几,为了知道它,必须有一个日历的开始时间,我在这里设定的是1970年1月1号,此时它对应的事星期四,然后要计算你输入的日期与开始日期的总天数totaldays,(totaldays+4)%7即可得到月头是星期几,然后
4、为了判断用户输入的日期是否正确,还得有一个检测判断函数,然后关于第三个功能实时时钟显示的实现思想为:每隔一秒输出系统当前时钟,每次输出时要在第一排的最前面输出,以覆盖掉上次输出的时钟,给人像是时钟自己在变化,我们可以调用系统API函数SetConsoleCursorPosition()来控制光标位置,整体思路如上所述。每个模块实现详解 Calendar类的实现,具体代码如下class Calendarpublic:Calendar()string p;t=time(0);p=getYear();year=atoi(p.c_str(); /将从系统时间中提取的字符串转换为整数p=getDay()
5、;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();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(
6、8,2); string getTime() const return extract(11,8); int 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);v
7、oid display();friend ostream& operator(ostream& out,Calendar& 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;主要函数详解1、总天数函数int Calendar:getTotalDay()int i=1970,totalDay=0; /从1970年开始循环到当前年分for(
8、;iyear;i+)if(isLeapYear(i) /判断点前年份是否为闰年totalDay+=366; /如果是加366天,否则加365天elsetotalDay+=365;for(i=1;imonth;i+)totalDay+=getDaysInMonth(i);return 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(isL
9、eapYear(year)=true&m=2) /闰年2月a=29;if(isLeapYear(year)=false&m=2) /平年2月a=28;return a;3、重载输出操作符函数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.g
10、etMonth();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|FOREGR
11、OUND_GREEN|FOREGROUND_BLUE);/设置字的颜色为白色,仅仅使当前日期显示为红色,其他日期为白色elseoutsetw(4)i+1;coutendl;return out;4、判断输入日期是否正确函数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) /闰年2月是不是
12、小于29天return true;elsereturn false;if(!temp.isLeapYear(temp.year)&temp.month=2)if(temp.day=28) /平年2月是不是小于28天return true;elsereturn false;5、实时显示时钟函数int localTime() int i=0;time_t now; struct tm *timenow;HANDLE hStdout; /定义句柄CONSOLE_SCREEN_BUFFER_INFO pBuffer; /CONSOLE_CURSOR_INFO 结构体中包含了关于命令行光标的一些信息,是
13、否显示和光标大小两个信息。通过更改这个结构体,再赋给命令行,就可以实现想要的一些效果了hStdout = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hStdout, &pBuffer); /让句柄指向当前进程,获取当前光标位置COORD pos; /COORD结构体,与位置有关while(i10)time(&now); /time()用来获取当前的系统时间,返回的结果是一个time_t类型,原型time_t time(time_t *t);/如果t是空指针,直接返回当前时间。如果t不是空指针,返回当前时间的同时,将返
14、回值赋予t指向的内存空间timenow = localtime(&now); /原型struct tm *localtime(const time_t *clock)/把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN); /设置字的颜色为绿色,时钟绿色输出coutasctime(timenow); /函数原型char* asctime (const struct tm * timeptr
15、),把timeptr指向的tm结构体中储存的时间转换为字符串字符串格式返回pos.X=0;pos.Y=pBuffer.dwCursorPosition.Y; /设置光标位置为排头SetConsoleCursorPosition(hStdout,pos); /移动光标到排头i+;Sleep(1000);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);/设置字的颜色为白色return 1;6、菜单
16、函数int select()int n=0;cout*endl;cout* 1.显示当月日历 *endl;cout* 2.查询日历 *endl;cout* 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; 第四章 调试分析 程序运行测试 进入程序界面: (进入程序的第一步) 选择操作1:(可以看到显示出当月月历,并且当天用红色标出)再
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 万年历 课程设计 报告

限制150内