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即为年数的后两位数,month为输入日期的月份,day为输入日期的天数。W为除以7后的余数,以为一个星期有7天。当余数为0是是星期天,为1时是星期一.为6是则为星期六。计算星期函数不需考虑闰年和平年的问题所以十分容易处理。(2)日期重载+函数:日期重载+函数就相对比较麻烦,首先就是闰年平年的问题,其次就是各个月份天数的不同问题。对于天数的处理
2、,我选择了有数组来保存各月天数。对于闰年和平年则选择再在日期重载+函数中在分两函数,分别处理闰年和平年。(3)日期重载=函数:日期重载=函数就更好处理了,只要判断年月日相等就可以了。所以只要用bool类型重载就行( bool operator = (const CDate &dt1)const;),返回值为ture则说明相等,为false时则说明两日期不相等。(4)日期重载-函数:日期重载-函数是最难处理的,要使两个日期相减得到相差的天数,还得用到重载-,而且重载-时两个类CDate dt相减返回的是一个int整形数值,所以是比较困难的。我在调试中将详细说明我所遇到的困难。现在我就简单的说明一
3、下我的思路。输入两个日期,分别计算出它们到公元元年元月1日的天数,再将两天数相减,就得到两日期的天数差。计算输入日期到公元元年元月1日的天数得公式:D=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+D1+day;其中D即为天数,year为年份,D1为输入月份以前的几个月的天数和,day为输入的日期。 详细设计共有五个模块:(1)计算星期模块;(2)日期重载+模块;(3)日期重载=模块;(4)日期重载-模块;(5)退出模块;(1)计算星期模块:主要功能:当输入一个日期是,计算出输入的日期是星期几。如图:计算出2011年6月23日为星期四。主要
4、使用技术:由于公式的要求,if(month=1|month=2) month+=12; -year; 当月份为1月或2月份时,月份要加12,即1月为13月,2月为14月,而年数则要减1,如2001年1月12日,1月要用13月来计算,年份2001年则用2000来计算。char *week=Sunday,MondayTuesdayWednesdayThursdayFridaySaturday;用一个指针数组char*week,来储存星期。W=(C/4)-2*C+y+(y/4)+(13*(month+1)/5)+day-1)+700)%7;coutThis day is weekWyear; if(
5、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
6、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日则两日期不相等;重载=就是判断输入的两日期的年、月、日相等或不相等就行,主要代
7、码如下:bool CDate:operator = (const CDate &dt1)const if(year=dt1.year& month=dt1.month& day=dt1.day) return true; else return false;如果相等则返回 true如果不相等则返回false;(4)日期重载-模块:输入两个日期,计算出两个日期间的相差天数。如输入2011年6月23日与2011年6月21日则两日期相减得2;两日期间的天数相差2.重载-是使两个类对象 dt1,dt2相减得到一个整型数d;就让两个日期类对象相减是不可能得到整型数的,即使让它得到一个日期类对象也不能算出
8、其准确的日期,以为其中有些年份闰年,而且各个月的天数不尽相同,得到减的日期,也不能用哪个月来算。如:输入日期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;然后算出其中有多少个闰年,每个闰年再多加一天,d2=(year-
9、1)/4-(year-1)/100+(year-1)/400;这样就计算出年份的天数。再来计算月份的天数,D1就是月份的天数,for(int i=0;i=month-1;i+) D1+=mon_dayi; 通过for循环就得到月份的天数D1;最后就加上天数day,得到输入日期到公元元年元月1日的天数;最后重载-,得到两日期相差的天数。(5)退出模块:是程序退出; 调试及问题解决在以上五个模块中,有两个模块对我来说是比较纠结的,第一个就是重载+模块,另一个就是重载-模块。重载+模块:重载+模块首先就是闰年2月为29天,而平年为28天,这个问题让我思考实验了一整天,最终才想出了分两个函数来解决的本
10、方法。一开始我用了一个if语句,说年份为闰年且当month=2时返回值mon_day1=29;即:if(year%4=0&=0|year%400=0)retuen mon_day1=29 ;但让人纠结的是,当函数用到mon_day时,在函数中不能运用,最后没办法,为了做完只能想出用两个函数解决的本方法。重载-模块:这个模块是我花的时间最长的模块,在一开始真的不知道如何解决,只是想着两个日期对象相减是如何得到一个int型的数。当我直接重载-使两个日期对象相减返回一个int型的数,编译不能通过,两对象想减不能返回非对象值。最后只能走一弯路,先算出天数,再将两天数重载相减返回int型整数。最后才能将
11、就的将问题解决。2宾馆客房管理系统 主函数退房结账房间信息录入退出客房信息浏览房间信息查询客人入住登记按房间号查询按客人姓名查询按空房间查询2.总设计方案要实现以上的功能,共分为7个模块:(1)录入房间信息;(2)客人入住登记;(3)客房信息浏览;(4)客房信息查询;(5)客房信息修改;(6)退房结账;(7)退出。模块(4)客房信息查询又分为三个小的模块,1)按空房间查询;2)按客人姓名查询;3)按房号查询。(1)录入房间信息:(2)客人入住登记:(3)客房信息浏览:(4)客房信息查询:(5)客房信息修改:(6)退房结账:(7)退出:3结束语:通过这次C+课程设计,使我在编程能力和抗打击能力上
12、步入了一个新的阶层。通过编程,使我以前不懂的知识点逐渐弄清楚了,也使我的上机编程能力得到大步的提高。也让我感到编程不是一件简单的事情,若不在加倍的努力学习C+编程,今后的能否找到工作,也是一项重大的问题。当然现在还不是向那远的时候,但的确C+编程不好学习,所以现在还是给自己一些压力的好,如此才有动力努力地学好编程。说实在的在C+课设的三个星期里,感想有很多,我发现自己只有在一心一意的时候才能做好一件事,只有专心致志才能完成好一件事。所以今后我要锻炼自己做事将全身的精力都投入到一件事情中,用所有的精力集中去完成一件事。十分感谢王老师和董老师在课设期间对我的指导,没有老师们的指正,我的程序是不可能
13、完成的,老师在课设期间的辛苦大家都有目共睹,几天全天都在机房指导我们,再次谢谢老师!感谢老师对我们的指导,感谢老师对我在编程过程的指正!4源代码:万年历源代码:/在头文件中声明;#include fstreamusing namespace std;void calculate ();/由日期计算出星期几;void Operator1();/平年日期重载+;void Operator2();/两日期对象相减的相差的天数;void Operator3();/重载=,判断两天是否相等;void LeapYearOperator();/闰年日期重载+;/主函数/ MY DAY.cpp : Defin
14、es the entry point for the console application./#include stdafx.hint main() cout(1)由日期计算星期 (2)日期重载+(3)日期重载-(4)日期重载= if(a=1) goto one; else if(a=2) goto two; else if(a=3) goto three; else if(a=4) goto four;five:return 0;/由日期计算星期几函数 /头文件,iostream在头文件中以声明; /指针数组,保存星期;void calculate() int C,W,y; int yea
15、r,month,day;请输入日期! cout年份:月份:month;日期:day; if(year=0|month12|day31) cout请输入正确的日期! else if(month=1|month=2) month+=12; -year; else C=year/100; y=year%100; W=(C/4)-2*C+y+(y/4)+(13*(month+1)/5)+day-1)+700)%7;/平年日期重载+、重载-、重载=函数class CDate; /声明类;CDate operator + (int d,CDate dt); /必须在此先声明重载CDate operator
16、 - (int d,CDate dt1); /否则后面的不能识别重载;/声明类class CDatepublic: CDate(int y=0,int m=0,int d=0); void output(); void input(); friend CDate operator + (int d,CDate dt); friend CDate operator - (int d,CDate dt1); bool operator = (const CDate &private:CDate:CDate(int y,int m,int d):year(y),month(m),day(d)void
17、 CDate:output()year-monthdayinput()n /数组,保存每月天数;平年月为天; dt.day=dt.day+d; dt.day-=mon_daydt.month-1; if(+dt.month=13) dt.month=1; dt.year+; CDate operator - (int d,CDate dt1) /重载-计算两日期对象的天数差; int D,D1=0,D2=0; CDate dt2; D=(dt1.year-1)*356+(dt1.year-1)/4-(dt1.year-1)/100+(dt1.year-1)/400+D1+dt1.day -(d
18、t2.year-1)*356+(dt2.year-1)/4-(dt2.year-1)/100+(dt2.year-1)/400+D2+dt2.day; for(int i=0;=dt1.month-1;i+) D1+=mon_dayi; for(int j=0;j=dt2.month-1;j+) D2+=mon_dayi;return D;dt1)const /重载=判断两日期 对象是否相等; if(year=dt1.year&void Operator1() int W; CDate olddate; olddate.input(); CDate newdate;请输入加的天数:W; newdate=W+olddate; newdate.output();/重载减计算日期天差;void Operator2() /计算两日期对象的天差; int D,D1,D2,D3,d; D2=(year-1)*365+(year
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1