最新版C++课程设计报告7348335.docx
- 文档编号:12220599
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:37
- 大小:92.33KB
最新版C++课程设计报告7348335.docx
《最新版C++课程设计报告7348335.docx》由会员分享,可在线阅读,更多相关《最新版C++课程设计报告7348335.docx(37页珍藏版)》请在冰豆网上搜索。
最新版C++课程设计报告7348335
学院:
计算机学院
1.课程设计目的及要求:
1.设计目的:
(1)提高和加强学生的计算机应用与软件开发能力,使学生由初学者向专业的程序员过渡。
(2)培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。
(3)学习和掌握C++程序设计方法以及上机调试技巧,为今后学习其它专业课程打好基础。
2.设计要求:
本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,作出设计报告。
(1)万年历
设计一个万年历,输入一个日期如:
1980-05-25,要求:
●计算出该日是星期几,
●重载“+”操作,当万年历对象加一个天数时,生成一个新的万年历对象,注意满足交换律
●重载“-”操作,当两个万年历对象相减时,获得其对象相差的天数
●重载“==”,判断两万年历对象是否相等
(2)宾馆房间管理系统
宾馆客房管理系统
宾馆的客房信息包括客房号、客房类型、客房价格、空闲情况、客人姓名、客人身份证号、入住时间、退房时间,预付费用等信息。
试设计一宾馆客房管理系统统,系统以菜单方式工作,使之能提供以下功能:
●客房信息的录入功能
●客人入住登记
●客人退房结算
●客房信息浏览功能,浏览全部客房的信息 ()客房信息保存于文件
●客房信息查询:
查询空房间情况、按姓名或房间号查询
●客房信息的删除、修改功能
●至少包含2个类,客房信息和客人信息
2.课程设计具体实现:
1.万年历
◆总体设计:
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)日期重载+函数:
日期重载+函数就相对比较麻烦,首先就是闰年平年的问题,其次就是各个月份天数的不同问题。
对于天数的处理,我选择了有数组来保存各月天数。
对于闰年和平年则选择再在日期重载+函数中在分两函数,分别处理闰年和平年。
(3)日期重载==函数:
日期重载==函数就更好处理了,只要判断年月日相等就可以了。
所以只要用bool类型重载就行(booloperator==(constCDate&dt1)const;),返回值为ture则说明相等,为false时则说明两日期不相等。
(4)日期重载-函数:
日期重载-函数是最难处理的,要使两个日期相减得到相差的天数,还得用到重载-,而且重载-时两个类CDatedt相减返回的是一个int整形数值,所以是比较困难的。
我在调试中将详细说明我所遇到的困难。
现在我就简单的说明一下我的思路。
输入两个日期,分别计算出它们到公元元年元月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日为星期四。
主要使用技术:
由于公式的要求,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","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
用一个指针数组char*week[],来储存星期。
W=(((C/4)-2*C+y+(y/4)+(13*(month+1)/5)+day-1)+700)%7;
cout<<"Thisdayis"< (2)日期重载+模块: 主要功能: 输入一个日期,如: 2011年6月20日,在输入要加的天数3,输出日期2011年6月23日。 如图: 主要使用技术: 由于闰年的2月是29天,与平年的是不同,所以用了两个函数来解决,也就要先判断闰年还是平年。 cout<<"输入要重载的年份: "; cin>>year; if(year%4==0&&year%100! =0||year%400==0) {LeapYearOperator();}//闰年日期重载+; else{Operator1();}//平年日期重载+; 如果是平年则调用Operator1()函数,如果是闰年则调用LeapYearOperator()函数。 intmon_day[]={};//数组保存每月天数,平年2月为28天; CDateoperator+(intd,CDatedt) {dt.day=dt.day+d; while(dt.day>mon_day[dt.month-1]) {dt.day-=mon_day[dt.month-1]; if(++dt.month==13){dt.month=1;dt.year++;} } returndt; } 当加入的天数>输入的日期的月份天数,则输入日期的天数dt.day=dt.day-mon_day[dt.month-1];而月份则要加1;如果月份为13了则月份等于1,而年数要加1;返回日期。 闰年的同平年也一样,只是二月的天数不同。 (3)日期重载==模块: 主要功能: 输入两个日期,判断两日期是否相等。 如图: 如输入2011年6月23日与2011年6月23日则两日期相等;如输入2011年6月23日与2011年6月21日则两日期不相等; 主要使用技术: 重载==就是判断输入的两日期的年、月、日相等或不相等就行,主要代码如下: boolCDate: : operator==(constCDate&dt1)const {if(year==dt1.year&& month==dt1.month&& day==dt1.day) returntrue; else returnfalse; } 如果相等则返回true如果不相等则返回false; (4)日期重载-模块: 主要功能: 输入两个日期,计算出两个日期间的相差天数。 如图: 如输入2011年6月23日与2011年6月21日则两日期相减得2;两日期间的天数相差2. 主要使用技术: 重载--是使两个类对象dt1,dt2相减得到一个整型数d;就让两个日期类对象相减是不可能得到整型数的,即使让它得到一个日期类对象也不能算出其准确的日期,以为其中有些年份闰年,而且各个月的天数不尽相同,得到减的日期,也不能用哪个月来算。 如: 输入日期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-1)/4-(year-1)/100+(year-1)/400;这样就计算出年份的天数。 再来计算月份的天数,D1就是月份的天数, intmon_day[]={}; for(inti=0;i<=month-1;i++){D1+=mon_day[i];} 通过for循环就得到月份的天数D1;最后就加上天数day,得到输入日期到公元元年元月1日的天数;最后重载--,得到两日期相差的天数。 (5)退出模块: 主要功能: 是程序退出; ◆调试及问题解决 在以上五个模块中,有两个模块对我来说是比较纠结的,第一个就是重载+模块,另一个就是重载--模块。 重载+模块: 重载+模块首先就是闰年2月为29天,而平年为28天,这个问题让我思考实验了一整天,最终才想出了分两个函数来解决的本方法。 一开始我用了一个if语句,说年份为闰年且当month==2时返回值mon_day[1]==29;即: intmon_day[]={}; if(year%4==0&&year%100! =0||year%400==0)retuenmon_day[1]==29; 但让人纠结的是,当函数用到mon_day[]时,在函数中不能运用,最后没办法,为了做完只能想出用两个函数解决的本方法。 重载--模块: 这个模块是我花的时间最长的模块,在一开始真的不知道如何解决,只是想着两个日期对象相减是如何得到一个int型的数。 当我直接重载--使两个日期对象相减返回一个int型的数,编译不能通过,两对象想减不能返回非对象值。 最后只能走一弯路,先算出天数,再将两天数重载相减返回int型整数。 最后才能将就的将问题解决。 2宾馆客房管理系统 ◆总体设计: 1.设计图 主函数 2.总设计方案 要实现以上的功能,共分为7个模块: (1)录入房间信息; (2)客人入住登记;(3)客房信息浏览;(4)客房信息查询;(5)客房信息修改;(6)退房结账;(7)退出。 其中: 模块(4)客房信息查询又分为三个小的模块,1)按空房间查询;2)按客人姓名查询;3)按房号查询。 ◆详细设计 (1)录入房间信息: (2)客人入住登记: (3)客房信息浏览: (4)客房信息查询: (5)客房信息修改: (6)退房结账: (7)退出: 3.结束语: 通过这次C++课程设计,使我在编程能力和抗打击能力上步入了一个新的阶层。 通过编程,使我以前不懂的知识点逐渐弄清楚了,也使我的上机编程能力得到大步的提高。 也让我感到编程不是一件简单的事情,若不在加倍的努力学习C++编程,今后的能否找到工作,也是一项重大的问题。 当然现在还不是向那远的时候,但的确C++编程不好学习,所以现在还是给自己一些压力的好,如此才有动力努力地学好编程。 说实在的在C++课设的三个星期里,感想有很多,我发现自己只有在一心一意的时候才能做好一件事,只有专心致志才能完成好一件事。 所以今后我要锻炼自己做事将全身的精力都投入到一件事情中,用所有的精力集中去完成一件事。 十分感谢王老师和董老师在课设期间对我的指导,没有老师们的指正,我的程序是不可能完成的,老师在课设期间的辛苦大家都有目共睹,几天全天都在机房指导我们,再次谢谢老师! 感谢老师对我们的指导,感谢老师对我在编程过程的指正! 4.源代码: 万年历源代码: ///////////////////////////////////////////////////////在头文件中声明; #include #include usingnamespacestd; voidcalculate();//由日期计算出星期几; voidOperator1();//平年日期重载+; voidOperator2();//两日期对象相减的相差的天数; voidOperator3();//重载==,判断两天是否相等; voidLeapYearOperator();//闰年日期重载+; //////////////////////////////////////////////////////////////////主函数 //MYDAY.cpp: Definestheentrypointfortheconsoleapplication. // #include"stdafx.h" voidOperator1(); voidOperator2(); voidOperator3(); intmain() { cout<<" (1)由日期计算星期"<<""<<" (2)日期重载+"<<""<<"(3)日期重载-"<<""<<"(4)日期重载==" <<""<<"(5)退出"< intyear,a; cin>>a; if(a==1) { while(a==1) { one: cout<<"由日期计算星期! "< calculate();//由日期计算出星期几; cin>>a; if(a==1)gotoone; elseif(a==2)gototwo; elseif(a==3)gotothree; elseif(a==4)gotofour; elsegotofive; } } elseif(a==2) { while(a==2) { two: cout<<"日期重载+! "< cout<<"输入要重载的年份: "; cin>>year; if(year%4==0&&year%100! =0||year%400==0) { LeapYearOperator();//闰年日期重载+; } else { Operator1();//平年日期重载+; } cin>>a; if(a==1)gotoone; elseif(a==2)gototwo; elseif(a==3)gotothree; elseif(a==4)gotofour; elsegotofive; } } elseif(a==3) { three: cout<<"日期重载-! "< Operator2();//两日期对象相减的相差的天数; cin>>a; if(a==1)gotoone; elseif(a==2)gototwo; elseif(a==3)gotothree; elseif(a==4)gotofour; elsegotofive; } elseif(a==4) { four: cout<<"日期重载==! "< Operator3();//重载==,判断两天是否相等; cin>>a; if(a==1)gotoone; elseif(a==2)gototwo; elseif(a==3)gotothree; elseif(a==4)gotofour; elsegotofive; } five: return0; } //////////////////////////////////////////////////////////由日期计算星期几函数 #include"stdafx.h"//头文件,iostream在头文件中以声明; char*week[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};//指针数组,保存星期; voidcalculate() { intC,W,y; intyear,month,day; cout<<"请输入日期! "< { cout<<"年份: "; cin>>year; cout<<"月份: "; cin>>month; cout<<"日期: "; cin>>day; { if(year<=0||month<=0||month>12||day<=0||day>31) { 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; cout<<"Thisdayis"< } } } } ////////////////////////////////////////////////////////平年日期重载+、重载--、重载==函数 #include"stdafx.h"//头文件,iostream在头文件中以声明; classCDate;//声明类; CDateoperator+(intd,CDatedt);//必须在此先声明重载 CDateoperator-(intd,CDatedt1);//否则后面的不能识别重载; ////////////////////////////////////////////////声明类 classCDate { public: CDate(inty=0,intm=0,intd=0); voidoutput(); voidinput(); friendCDateoperator+(intd,CDatedt); friendCDateoperator-(intd,CDatedt1); booloperator==(constCDate&dt1)const; private: intyear,month,day; }; CDate: : CDate(inty,intm,intd): year(y),month(m),day(d) { } voidCDate: : output() { cout< } voidCDate: : input() { cout<<"请输入日期! \n"; cout<<"年份: "; cin>>year; cout<<"月份: "; cin>>month; cout<<"日期: "; cin>>day; } intmon_day[]={};//数组,保存每月天数;平年月为天; CDateoperator+(intd,CDatedt) { dt.day=dt.day+d; while(dt.day>mon_day[dt.month-1]) { dt.day-=mon_day[dt.month-1]; if(++dt.month==13) { dt.month=1; dt.year++; } } returndt; } CDateoperator-(intd,CDatedt1)//重载-计算两日期对象的天数差; { intD,D1=0,D2=0; CDatedt2; D=(dt1.year-1)*356+(dt1.year-1)/4-(dt1.year-1)/100+(dt1.year-1)/400+D1+dt1.day -(dt2.year-1)*356+(dt2.year-1)/4-(dt2.year-1)/100+(dt2.year-1)/400+D2+dt2.day; for(inti=0;i<=dt1.month-1;i++) { D1+=mon_day[i]; } for(intj=0;j<=dt2.month-1;j++) { D2+=mon_day[i]; } returnD; } boolCDate: : operator==(constCDate&dt1)const//重载==判断两日期对象是否相等; { if(year==dt1.year&& month==dt1.month&& day==dt1.day) returntrue; else returnfalse; } voidOperator1() { intW; CDateolddate; olddate.input(); CDatenewdate; cout<<"请输入加的天数: "; cin>>W; newdate=W+olddate; newdate.output(); } //////////////////////////////////重载减计算日期天差; voidOperator2()//计算两日期对象的天差; { intyear,month,day; intD,D1,D2,D3,d; cout<<"请输入日期! \n"; cout<<"年份: "; cin>>year; cout<<"月份: "; cin>>month; cout<<"日期: "; cin>>day; D=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+D1+day; for(inti=0;i<=month-1;i++) { D1+=mon_day[i]; } cout<<"请输入日期! \n"; cout<<"年份: "; cin>>year; cout<<"月份: "; cin>>month; cout<<"日期: "; cin>>day; D2=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+D3+day; for(intj=0;j<=month-1;j++) { D3+=mon_day[i]; } d=D-D2; cout< } voidOperator3()//判断两日期对象是否相等; { CDatedt1,dt2; dt1.input(); dt2.input(); if(dt1==dt2) cout<<"dt1anddt2areequal."<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新版 C+ 课程设计 报告 7348335