C++课程设计报告万年历_第1页
C++课程设计报告万年历_第2页
C++课程设计报告万年历_第3页
C++课程设计报告万年历_第4页
C++课程设计报告万年历_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c+课程设计报告 学院:计算机学院 1 课程设计目的及要求:1 设计目的:(1)提高和加强学生的计算机应用与软件开发能力,使学生由初学者向专业的程序员过渡。(2)培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。(3)学习和掌握c+程序设计方法以及上机调试技巧,为今后学习其它专业课程打好基础。2设计要求: 本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,作出设计报告。(1) 万年历设计一个万年历, 输入一个日期如:19800525,要求:l 计算出该日是星期几,l 重载“+”操作,当万年历对象加一个天数时,生成一个新

2、的万年历对象,注意满足交换律l 重载“-”操作,当两个万年历对象相减时,获得其对象相差的天数l 重载“=”,判断两万年历对象是否相等(2)宾馆房间管理系统 宾馆客房管理系统宾馆的客房信息包括客房号、客房类型、客房价格、空闲情况、客人姓名、客人身份证号、入住时间、退房时间,预付费用等信息。试设计一宾馆客房管理系统统,系统以菜单方式工作,使之能提供以下功能:l 客房信息的录入功能l 客人入住登记l 客人退房结算l 客房信息浏览功能,浏览全部客房的信息()客房信息保存于文件l 客房信息查询:查询空房间情况、按姓名或房间号查询l 客房信息的删除、修改功能l 至少包含2个类,客房信息和客人信息2 课程设

3、计具体实现:1. 万年历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即为年数的后两位数,month为输入日期的月份,day为输入日期的天数。w为除以7后的余数,以为一个星期有7天。当余数为0是是星期天,为1时是星期一.为6是则为星期六。计算星期函数不需考虑闰年和平年的问题所以十分容易处理。(2) 日期重载+函数:日

4、期重载+函数就相对比较麻烦,首先就是闰年平年的问题,其次就是各个月份天数的不同问题。对于天数的处理,我选择了有数组来保存各月天数。对于闰年和平年则选择再在日期重载+函数中在分两函数,分别处理闰年和平年。(3) 日期重载=函数:日期重载=函数就更好处理了,只要判断年月日相等就可以了。所以只要用bool类型重载就行(bool operator = (const cdate &dt1)const;),返回值为ture则说明相等,为false时则说明两日期不相等。(4) 日期重载-函数:日期重载-函数是最难处理的,要使两个日期相减得到相差的天数,还得用到重载-,而且重载-时两个类cdate dt相减返

5、回的是一个int整形数值,所以是比较困难的。我在调试中将详细说明我所遇到的困难。现在我就简单的说明一下我的思路。输入两个日期,分别计算出它们到公元元年元月1日的天数,再将两天数相减,就得到两日期的天数差。计算输入日期到公元元年元月1日的天数得公式:d=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+d1+day;其中d即为天数,year为年份,d1为输入月份以前的几个月的天数和,day为输入的日期。u 详细设计共有五个模块:(1)计算星期模块;(2)日期重载+模块;(3)日期重载=模块;(4)日期重载-模块;(5)退出模块;(1) 计算星期模

6、块:主要功能:当输入一个日期是,计算出输入的日期是星期几。如图:计算出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*(m

7、onth+1)/5)+day-1)+700)%7;coutthis day is weekwendl;输出的就是星期。(2)日期重载+模块:主要功能:输入一个日期,如:2011年6月20日,在输入要加的天数3,输出日期2011年6月23日。如图:主要使用技术:由于闰年的2月是29天,与平年的是不同,所以用了两个函数来解决,也就要先判断闰年还是平年。coutyear;if(year%4=0&year%100!=0|year%400=0)leapyearoperator(); /闰年日期重载+;else operator1(); /平年日期重载+;如果是平年则调用operator1()函数,如果是

8、闰年则调用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-=mon_daydt.month-1; if(+dt.month=13)dt.month=1;dt.year+;return dt;当加入的天数输入的日期的月份天数,则输入日期的天数dt.day=dt.day-mon_daydt.month

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

10、e;elsereturn false;如果相等则返回 true如果不相等则返回false;(4)日期重载-模块:主要功能:输入两个日期,计算出两个日期间的相差天数。如图:如输入2011年6月23日与2011年6月21日则两日期相减得2;两日期间的天数相差2.主要使用技术:重载-是使两个类对象 dt1,dt2相减得到一个整型数d;就让两个日期类对象相减是不可能得到整型数的,即使让它得到一个日期类对象也不能算出其准确的日期,以为其中有些年份闰年,而且各个月的天数不尽相同,得到减的日期,也不能用哪个月来算。如:输入日期2011年12月1日与日期2010年2月1日,假设两日期相减,得到日起对象1年10

11、月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就是月份的天数,int mon_day=31,28,31,30,31,30,31

12、,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_da

13、y1=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时,在函数中不能运用,最后没办法,为了做完只能想出用两个函数解决的本方法。重载-模块:这个模块是我花的时间最长的模块,在一开始真的不知道如何解决,只是想着两个日期对象相减是如何得到一个int型的数。当我直接重载-使两个日期对象相减返回一个int型的数,编译不能通过,两对象想减不能返回非对象值。最后只能走一弯路,先算出天数,再将两天数重载

14、相减返回int型整数。最后才能将就的将问题解决。2宾馆客房管理系统客房信息修改u 总体设计 :1.设计图 主函数退房结账房间信息录入退出客房信息浏览房间信息查询客人入住登记 按房间号查询按客人姓名查询按空房间查询2. 总设计方案要实现以上的功能,共分为7个模块:(1)录入房间信息;(2)客人入住登记;(3)客房信息浏览;(4)客房信息查询;(5)客房信息修改;(6)退房结账;(7)退出。其中:模块(4)客房信息查询又分为三个小的模块,1)按空房间查询;2)按客人姓名查询;3)按房号查询。u 详细设计(1) 录入房间信息:(2) 客人入住登记:(3) 客房信息浏览:(4) 客房信息查询:(5)

15、客房信息修改:(6) 退房结账:(7) 退出:3 结束语:通过这次c+课程设计,使我在编程能力和抗打击能力上步入了一个新的阶层。通过编程,使我以前不懂的知识点逐渐弄清楚了,也使我的上机编程能力得到大步的提高。也让我感到编程不是一件简单的事情,若不在加倍的努力学习c+编程,今后的能否找到工作,也是一项重大的问题。当然现在还不是向那远的时候,但的确c+编程不好学习,所以现在还是给自己一些压力的好,如此才有动力努力地学好编程。说实在的在c+课设的三个星期里,感想有很多,我发现自己只有在一心一意的时候才能做好一件事,只有专心致志才能完成好一件事。所以今后我要锻炼自己做事将全身的精力都投入到一件事情中,

16、用所有的精力集中去完成一件事。十分感谢王老师和董老师在课设期间对我的指导,没有老师们的指正,我的程序是不可能完成的,老师在课设期间的辛苦大家都有目共睹,几天全天都在机房指导我们,再次谢谢老师!感谢老师对我们的指导,感谢老师对我在编程过程的指正!4 源代码:万年历源代码:/在头文件中声明;#include #include using namespace std;void calculate ();/由日期计算出星期几;void operator1();/平年日期重载+;void operator2();/两日期对象相减的相差的天数;void operator3();/重载=,判断两天是否相等;

17、void leapyearoperator();/闰年日期重载+;/主函数/ my day.cpp : defines the entry point for the console application./#include stdafx.hvoid operator1();void operator2();void operator3();int main()cout(1)由日期计算星期 (2)日期重载+ (3)日期重载- (4)日期重载= (5)退出a;if(a=1)while(a=1)one:cout由日期计算星期!a;if(a=1) goto one;else if(a=2)goto

18、 two;else if(a=3)goto three;else if(a=4)goto four;else goto five;else if(a=2)while(a=2)two:cout日期重载+!endl;coutyear;if(year%4=0&year%100!=0|year%400=0)leapyearoperator(); /闰年日期重载+; elseoperator1(); /平年日期重载+;cina;if(a=1) goto one;else if(a=2)goto two;else if(a=3)goto three;else if(a=4)goto four;else g

19、oto five;else if(a=3)three:cout日期重载-!a; if(a=1) goto one; else if(a=2) goto two; else if(a=3) goto three; else if(a=4) goto four; else goto five;else if(a=4)four:cout日期重载=!a;if(a=1) goto one;else if(a=2)goto two;else if(a=3)goto three;else if(a=4)goto four; else goto five; five:return 0;/由日期计算星期几函数#

20、include stdafx.h /头文件,iostream在头文件中以声明;char *week=sunday,monday,tuesday,wednesday,thursday,friday,saturday; /指针数组,保存星期;void calculate()int c,w,y;int year,month,day;cout请输入日期!endl;coutyear;coutmonth;coutday;if(year=0|month12|day31)cout请输入正确的日期!endl;elseif(month=1|month=2)month+=12;-year;elsec=year/10

21、0;y=year%100;w=(c/4)-2*c+y+(y/4)+(13*(month+1)/5)+day-1)+700)%7;coutthis day is weekwendl;/平年日期重载+、重载-、重载=函数#include stdafx.h /头文件,iostream在头文件中以声明;class cdate; /声明类;cdate operator + (int d,cdate dt); /必须在此先声明重载cdate operator - (int d,cdate dt1); /否则后面的不能识别重载;/声明类class cdatepublic:cdate(int y=0,int

22、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 &dt1)const;private:int year,month,day;cdate:cdate(int y,int m,int d):year(y),month(m),day(d)void cdate:output()coutyear-month-dayendl;void cdate:in

23、put()cout请输入日期!n;coutyear;coutmonth;coutday;int mon_day=31,28,31,30,31,30,31,31,30,31,30,31; /数组,保存每月天数;平年月为天;cdate operator + (int d,cdate dt)dt.day=dt.day+d;while(dt.daymon_daydt.month-1)dt.day-=mon_daydt.month-1;if(+dt.month=13)dt.month=1;dt.year+;return dt; cdate operator - (int d,cdate dt1) /重载

24、-计算两日期对象的天数差;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-(dt2.year-1)*356+(dt2.year-1)/4-(dt2.year-1)/100+(dt2.year-1)/400+d2+dt2.day;for(int i=0;i=dt1.month-1;i+)d1+=mon_dayi;for(int j=0;j=dt2.month-1;j+)d2+=mon_dayi;return d;bool cdate:

25、operator = (const cdate &dt1)const /重载=判断两日期 对象是否相等;if(year=dt1.year&month=dt1.month&day=dt1.day)return true;elsereturn false;void operator1()int w; cdate olddate;olddate.input();cdate newdate;coutw;newdate=w+olddate;newdate.output();/重载减计算日期天差;void operator2() /计算两日期对象的天差;int year,month,day;int d,d

26、1,d2,d3,d; cout请输入日期!n;coutyear;coutmonth;coutday; d=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+d1+day; for(int i=0;i=month-1;i+)d1+=mon_dayi;cout请输入日期!n;coutyear;coutmonth;coutday;d2=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+d3+day;for(int j=0;j=month-1;j+)d3+=mon_dayi;d=d-d2;coutden

27、dl;void operator3() /判断两日期对象是否相等;cdate dt1,dt2;dt1.input();dt2.input();if(dt1=dt2)coutdt1 and dt2 are equal.endl;elsecoutdt1 and dt2 are not equal.endl;/闰年日期重载+函数#include stdafx.h /头文件,iostream在头文件中以声明;class cdate1;cdate1 operator + (int d,cdate1 dt);class cdate1public:cdate1(int y,int m,int d)year=

28、y;month=m;day=d;cdate1()void output();void input();friend cdate1 operator + (int d,cdate1 dt);private:int year,month,day;void cdate1:output()coutyear-month-dayendl;void cdate1:input()cout请输入日期!n;coutyear;coutmonth;coutday; int mon_day1=31,29,31,30,31,30,31,31,30,31,30,31; /数组,保存每月天数;闰年月为天; cdate1 op

29、erator + (int d,cdate1 dt) /重载+使日期加天数得新的日期;dt.day=dt.day+d;while(dt.daymon_day1dt.month-1)dt.day-=mon_day1dt.month-1;if(+dt.month=13)dt.month=1;dt.year+;return dt;void leapyearoperator()int w;cdate1 olddate;olddate.input();cdate1 newdate;coutw;newdate=w+olddate;newdate.output();宾馆管理系统源代码:/ 旅馆房间管理系统.

30、cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include#include#include#includeusing namespace std;void out_message();void ruzhudengji();void tuifangjiesuan();void search_message();void change_message();void in_message();void empty_message();struct hotel /定义结构体hotel,包括各种房间信息的类型int i;int num;char leixing5;int

31、 jiage;int kongxian;char name20;int id;int yufu;int ruzhushijian;int tfsj;hote20;void menu_display() /菜单显示函数couttt*endl;couttt 欢迎进入旅馆管理系统 endl;couttt请输入您所要选择的功能: endl;couttt1.客房信息浏览 2.客人入住登记 3.客人退房结算endl;couttt4.客房信息查询 5.客房信息修改 6.客房信息录入endl;couttt0.退出旅馆管理系统 endl;couttt*choose;while(choose!=0)switch(

32、choose) /用switch语句判断选择的菜单功能case 1:out_message();break; /客房信息浏览case 2:ruzhudengji();break; /客人入住登记case 3:tuifangjiesuan();break; /客人退房结算case 4:search_message();break; /客房信息查询case 5:change_message();break; /客房信息修改case 6:in_message();break; /客房信息录入default:cout错误,不是有效的命令,请重新输入choose;void out_message() /

33、输出全部房间信息函数int i=0;ifstream liulan(旅店房间信息.txt,ios:in); /用输入输出流自定义信息文件if(! liulan) /判断文件是否打开成功cerr文件不能读.endl;return;cout房号客房类型价格(元/天) 是否空闲 姓名 身份证 预付款(元) 入住时间 退房时间hotei.idhotei.yufuhotei.ruzhushijianhotei.tfsj; coutsetw(4)hotei.numsetw(8)hotei.le

34、ixingsetw(9)hotei.jiagesetw(9)hotei.kongxiansetw(10)setw(10)hotei.idsetw(8)hotei.yufusetw(12)hotei.ruzhushijiansetw(10)hotei.tfsj; /用setw()进行界面排版cout endl;i+;liulan.close(); /关闭文件void ruzhudengji() /客人入住登记函数int a,b;cout现在的空客房信息为:endl;empty_message(); /输出空房间couta;int c=0;ifstream fin(旅店房间信息

35、.txt,ios:in);while(! fin.eof()hotec.idhotec.yufuhotec.ruzhushijianhotec.tfsj;if(hotec.num=a)b=c;c+;cout请输入客人的相关信息:endl;cout 姓名 身份证号 预付金(元) 入住时间(如)hoteb.idhoteb.ruzhushijianhoteb.yufu; /输入客人信息hoteb.kongxian=1;ofstream fout(旅店房间信息.t

36、xt,ios:out);for(int i=0;ic;i+) /将客人信息录入到信息文件中foutendlhotei.num hotei.leixing hotei.jiage hotei.kongxian hotei.id hotei.ruzhushijian hotei.yufu hotei.tfsj;fout.close();void tuifangjiesuan() /客人退房结算int a,b;ifstream fin(旅店房间信息.txt,ios:in);couta;int c=0;while(! fin.eof()finhotec.numhotec.leix

37、hotec.idhotec.yufuhotec.ruzhushijianhotec.tfsj;if(hotec.num=a) /查询客人房间b=c;c+;cout房间信息为:endl;cout 姓名 预付款(元) 入住时间 endl;coutsetw(6)setw(8)hoteb.yufusetw(20)hoteb.ruzhushijianendl;coutd;hoteb.tfsj=d;int fei;fei=(hoteb.tfsj-hoteb.ruzhushijian)*hoteb.jiage)-

38、hoteb.yufu; /结算函数,(结算时间-入住时间)*价格-预付cout应付费用为:fei元endl;hoteb.kongxian=0; /房间结算后初始化房间信息strcpy(,0);hoteb.id=0;hoteb.ruzhushijian=0;hoteb.tfsj=0;hoteb.yufu=0;hoteb.tfsj=0;fstream fout(旅店房间信息.txt,ios:out);for(int i=0;ic;i+)foutendlhotei.num hotei.leixing hotei.jiage hotei.kongxian ho

39、tei.id hotei.yufu hotei.ruzhushijian hotei.tfsj;fout.close();void search_message() /查询函数 void search_num();void search_empty();void search_id();cout-endl;cout请输入您要实现的功能:endl;cout(1)查询空房间;(2)按房间号查询;(3)按id查询;(4)退出endl;cout-i;while(i!=4)switch(i) /用switch语句判断选择的查询方法 case 1:search_empty();break;case 2:search_num();break;case 3search_id();break;cout-endl;cout请输入您要实现的功能:endl;cout(1)查询空房间;(2)按房间号查询;(3)按id查询;(4)退出endl;cout-i;system(cls);void search_empty() /按

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论