c课程设计报告万年历的设计与实现

上传人:shaoy****1971 文档编号:108845099 上传时间:2019-10-25 格式:DOC 页数:18 大小:137KB
返回 下载 相关 举报
c课程设计报告万年历的设计与实现_第1页
第1页 / 共18页
c课程设计报告万年历的设计与实现_第2页
第2页 / 共18页
c课程设计报告万年历的设计与实现_第3页
第3页 / 共18页
c课程设计报告万年历的设计与实现_第4页
第4页 / 共18页
c课程设计报告万年历的设计与实现_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《c课程设计报告万年历的设计与实现》由会员分享,可在线阅读,更多相关《c课程设计报告万年历的设计与实现(18页珍藏版)》请在金锄头文库上搜索。

1、 信息科学与工程学院课程设计任务书 题目: 万年历的设计与实现 姓名: * 学号: * 专业:计算机科学与技术 班级: 2009级本2班 课程: c+程序设计 指导教师: * 完成时间: 2011年 12 月-2011年 12 月2011年12 月20日课程设计任务书及成绩评定课程设计的任务和具体要求任务:学习和掌握C+程序设计方法以及上机调试技巧,培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。具体要求: 本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,作出设计报告。设计一个万年历, 输入一个日期如:198005

2、25,要求:l 计算出该日是星期几,l 重载“+”操作,当万年历对象加一个天数时,生成一个新的万年历对象,注意满足交换律l 重载“-”操作,当两个万年历对象相减时,获得其对象相差的天数l 重载“=”,判断两万年历对象是否相等指导教师签字: 、 日期: 指导教师评语成绩:_ 指导教师签字: 日期: 指导教师评语成绩:_ 指导教师签字: 日期: 课程设计所需软件、硬件等n 硬件环境:Iterl(R) Core(TM)2 Duo CPU,主频2.31GHz;内存3G; 硬盘320G以上;1024768显示分辨率n 软件环境: visual c+ 6.0 课程设计进度计划起至日期工作内容备注2011.

3、12.1到2011.12.10设计一个万年历使之输出相应的日期, 包括年月日运用visualc+6.0设计参考文献、资料索引序号文献、资料名称编著者出版单位1 c+程序设计(第二版) 谭浩强编著 清华大学出版社一课程设计具体实现:1. 万年历u 总体设计 :u 1.设计图 计算星期 日期重载+ 主函数 日期重载- 日期重载=2. 设计方案(1) 计算星期函数:要知道计算星期的公式,这可以在网上找到公式 W=(C/4)-2*C+y+(y/4)+(13*(month+1)/5)+day-1)+700)%7; 其中:C=year/100即为年时的前两位数,y=year%100即为年数的后两位数,mo

4、nth为输入日期的月份,day为输入日期的天数。W为除以7后的余数,以为一个星期有7天。当余数为0是是星期天,为1时是星期一.为6是则为星期六。计算星期函数不需考虑闰年和平年的问题所以十分容易处理。(2) 日期重载+函数: 日期重载+函数就相对比较麻烦,首先就是闰年平年的问题,其次就是各个月份天数的不同问题。对于天数的处理,我选择了有数组来保存各月天数。对于闰年和平年则选择再在日期重载+函数中在分两函数,分别处理闰年和平年。(3) 日期重载=函数: 日期重载=函数就更好处理了,只要判断年月日相等就可以了。所以只要用bool类型重载就行(bool operator = (const CDate

5、&dt1)const;),返回值为ture则说明相等,为false时则说明两日期不相等。(4) 日期重载-函数: 日期重载-函数是最难处理的,要使两个日期相减得到相差的天数,还得用到重载-,而且重载-时两个类CDate dt相减返回的是一个int整形数值,所以是比较困难的。我在调试中将详细说明我所遇到的困难。现在我就简单的说明一下我的思路。输入两个日期,分别计算出它们到公元元年元月1日的天数,再将两天数相减,就得到两日期的天数差。计算输入日期到公元元年元月1日的天数得公式:D=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+D1+day; 其

6、中D即为天数,year为年份,D1为输入月份以前的几个月的天数和,day为输入的日期。u 详细设计共有五个模块:(1)计算星期模块;(2)日期重载+模块;(3)日期重载=模块;(4)日期重载-模块;(5)退出模块;(1)计算星期模块:主要功能:当输入一个日期是,计算出输入的日期是星期几。如图:计算出2011年6月23日为星期四。主要使用技术:由于公式的要求,if(month=1|month=2) month+=12;-year; 当月份为1月或2月份时,月份要加12,即1月为13月,2月为14月,而年数则要减1,如2001年1月12日,1月要用13月来计算,年份2001年则用2000来计算。c

7、har *week=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;用一个指针数组char*week,来储存星期。W=(C/4)-2*C+y+(y/4)+(13*(month+1)/5)+day-1)+700)%7;coutThis day is weekWendl;输出的就是星期。(2)日期重载+模块:主要功能:输入一个日期,如:2011年6月20日,在输入要加的天数3,输出日期2011年6月23日。如图:主要使用技术: 由于闰年的2月是29天,与平年的是不同,所以用了两个函数来解决,也就要先判断闰年还是平年。coutyear

8、;if(year%4=0&year%100!=0|year%400=0)LeapYearOperator(); /闰年日期重载+;else Operator1(); /平年日期重载+; 如果是平年则调用Operator1()函数,如果是闰年则调用LeapYearOperator()函数。int mon_day=31,28,31,30,31,30,31,31,30,31,30,31; /数组保存每月天数,平年2月为28天;CDate operator + (int d,CDate dt)dt.day=dt.day+d;while(dt.daymon_daydt.month-1)dt.day-=m

9、on_daydt.month-1; if(+dt.month=13)dt.month=1;dt.year+;return dt; 当加入的天数输入的日期的月份天数,则输入日期的天数dt.day=dt.day-mon_daydt.month-1;而月份则要加1;如果月份为13了则月份等于1,而年数要加1;返回日期。闰年的同平年也一样,只是二月的天数不同。(3)日期重载=模块:主要功能:输入两个日期,判断两日期是否相等。如图: 如输入2011年6月23日与2011年6月23日则两日期相等;如输入2011年6月23日与2011年6月21日则两日期不相等;主要使用技术:重载=就是判断输入的两日期的年、

10、月、日相等或不相等就行,主要代码如下:bool CDate:operator = (const CDate &dt1)const if(year=dt1.year&month=dt1.month&day=dt1.day)return true;elsereturn false;如果相等则返回 true如果不相等则返回false;(4)日期重载-模块:主要功能:输入两个日期,计算出两个日期间的相差天数。如图: 如输入2011年6月23日与2011年6月21日则两日期相减得2;两日期间的天数相差2.主要使用技术: 重载-是使两个类对象 dt1,dt2相减得到一个整型数d;就让两个日期类对象相减是不

11、可能得到整型数的,即使让它得到一个日期类对象也不能算出其准确的日期,以为其中有些年份闰年,而且各个月的天数不尽相同,得到减的日期,也不能用哪个月来算。如: 输入日期2011年12月1日与日期2010年2月1日,假设两日期相减,得到日起对象1年10月0日,这个日子是不能算日期天数的。所以我想到的方法是,先分别算出两日期到公元元年元月1日的天数,再将两天数相减,就得到两日期的天数差。主要代码: D=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+D1+day; 先不管平年还是闰年,当每一年多是365天来计算,d1=(year-1)*365;然后算

12、出其中有多少个闰年,每个闰年再多加一天,d2=(year-1)/4-(year-1)/100+(year-1)/400;这样就计算出年份的天数。再来计算月份的天数,D1就是月份的天数,int mon_day=31,28,31,30,31,30,31,31,30,31,30,31; for(int i=0;i=month-1;i+)D1+=mon_dayi; 通过for循环就得到月份的天数D1;最后就加上天数day,得到输入日期到公元元年元月1日的天数;最后重载-,得到两日期相差的天数。(5) 退出模块:主要功能:是程序退出;u 调试及问题解决 在以上五个模块中,有两个模块对我来说是比较纠结的,第一个就是重载+模块,另一个就是重载-模块。 重载+模块:重载+模块首先就是闰年2月为29天,而平年为28天,这个问题让我思考实验了一整天,最终才想出了分两个函数来解决的本方法。一开始我用了一个if语句,说年份为闰年且当month=2时返回值mon_day1=29;即:int mon_day=31,28,31,30,31,30,31,31,30,31,30,31;if(year%4=0&year%100!=0|year%400=0)retuen mon_day1=29 ;但让人纠结的是,当函数用到mon_day时,在函数中不能运用,最后没办法,为了做完只能想出用两个函数解决的本方法。重

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 总结/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号