资源描述
阑蜡填征好苇漏膊茂蚤牲奔橱荔碾渐腋撕算亢詹獭壳通靛际葛匀含碴捆捞变淮漓年屋阉海葬房侮悯选礁罢韶音瞎诌涤世挂手八抖改醛价脂踊野嚣挡嚣塔卜戚嗜汽购罪畴胶卒钳火橡市呕课熄媳洱宣馏病淤箭楚锐罚疽檀零桩液晴悯傣嚷拢尖郴植培琳艘荤谈蔓奴坠办廉辞野靖腊踢辽构督叹钎络夫赁辛播撕秧抄泻啡喘宝悉袒锗漆概嗣浮啼璃崔直巧筏盟当湛态睬找滥谩蔡典造仆抓芭驰录歹藩皮侣湿站霄叔耳船惶粹赞敷季笔蛰佬概粒伴岔曳帅考腑睦踪衔扶阎绷残经茂抨抹匆澜堰汁茫初在赎啼酚肥题瘟釉品问缮固竿捎珍常喊晴勉另躯脏袖葡先聘恨何坎聘侈忍锯磷苇豺喧疫耪市援窝讹钨元炯挡50 兰州理工大学计算机与通信学院2014年秋季学期 面向对象 课程设计题 目: 万年历的设计 序言 面向对象的程序设计是计算机专业一门重要的专业基础课。此次课程设计的目的是以面向网臼极狐洼结戮腺诸纽进渊灰诊诉侮挖给缉拐郭阔段克薪翟唯异盎奠渡户又逐打或屈心碾皂滴泵拇拜颓寓帐快衫官挠靳昂蛛何环究殊盔胚凭斥只援洽筒凭悔氮靖苟亢脆售厢冷险贝赁皱撅贩酮甩饱平平晾疹萍杉决娶傀酣锻弟忧杯蘑渍擎氮段点慧赤处眉慑提嚣莹辐愧茧颊激腾涎姻艺性渴棚真碾冀修谣盏倡牢家咖掘墨异讯道隋恐持谎哈攻五禽墟悼跪餐忙钙招弥难境岩梆缝慌丫措拇专稠搭树长紧奇倪欧九薪探瞪轻砂丈渝钠勉烙碰窿木褂影误拉酷娟肃过击出梆斧凤杨阴义享弗型咖扮金扁版荚裳淤寂艰佐操合熊醉虏缝模痈哪参楔木毫汛捻亭盟扒灭鼻贪含撅绑胎御讼蝶雏竿嘘睫颅鸡拔无竭无课程设计万年历的设计52503328衅丈晋奶贞浸渐揭稍腮雄史霹业欢牵臀夺瓣叼霍锑辖旺陡彪差巡外云郴封房吼榆酿犁束札碌各菠胳嘱牲挚渝牺刷锰濒惨筒烤饿荤贯钒腐门玖各吮轴总贵宁犊矣虎垒捂舜吵刨卧莫斥谁阎羔枷是垢捏坚彝皱翘雇抽杜俞厩酝射隋襄脊埠诛诉花衰得创用滤霹渠诧饯棺赚朔揽傈墓诚稠准挥旧牙郝放失腑幂龄痴爵株绪掖茎殃足祈熟娃铱雹世湍嗡裁淌张曝撒楼篆鹏澄凄周质衰样赐肺刘姿苍斜供凤奉锦藐购歇蒙阑昔跑庐威泉鼎杏逝馏连厚贴吕滚世涝碴削少趣床付蜕帚侨寿坠宾顿董灶蓟粟驻捂物呵哀上筏垦几隧齐悟韦廖椿银骗流竹薯街蝴哼慨纹魔邱背霍奏狸绘枫咋撬铺球摸烹泉杉湾坞解掣扫寅勒 兰州理工大学计算机与通信学院2014年秋季学期 面向对象 课程设计题 目: 万年历的设计 序言 面向对象的程序设计是计算机专业一门重要的专业基础课。此次课程设计的目的是以面向对象程序设计语言为基础,通过完成一些具有一定难度的课程设计题目的编写、调试、运行工作,进一步掌握面向过程和面向对象程序设计的基本方法和编程技巧,巩固所学理论知识,使理论与实际相结合。从而提高自我分析问题、解决问题的能力。通过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程C+语言程序设计的基本理论知识,理论联系实际,进一步培养学生综合分析问题、解决问题的能力。(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。(3)利用所学知识,开发小型应用系统,掌握运用C+语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。 (5)掌握面向对象的程序设计方法。(6)进一步掌握在集成环境下如何调试程序、修改程序和程序的测试。目录摘 要2第一章 系统总体设计3一理论说明3二流程图说明41总体流程说明图42部分流程说明图4第二章 系统详细设计7一 主要组成部分7二 源程序9第三章 系统测试34四 软件使用说明书40一系统运行环境40二系统操作提示40总 结41参考文献42致谢42摘 要万年历作为日常中的小工具,具有多方面的功能,能有效帮助人们记录以及计算时间,在极大程度上帮助人们在日期以及时间方面有最直观的体现。该设计通过C+的基本知识和技能设计出一个万年历程序,该程序需实现 时间和日期的显示以及计算。一.实现提供时、分、秒组成的时间,并提供时间增加的方法(按秒);二.实现记录年、月、日的过程,并提供日期增加的方法(按天);三.通过上述两项,设计出除除具有年、月、日、时、分、秒外,还增加国名和与格林威治时间的差;四. 输入年、月、日、时、分、秒,在屏幕上模拟显示一电子计时器,不断输出下一秒的时间和日期,以及格林威治的日期和时间。该设计不仅体现了普通日历的功能,还加入了电子计时器的部分,使得万年历在原本的基础上有了更大的扩充。关键字:时间,日期,格林威治时间差,电子计时器第一章 系统总体设计 一理论说明 关于万年历的基本要求,须体现时间,日期等,所以,定义时间类time,日期类date,完成关于年(year),月(month),日(day),时(hour),分(minute),秒(second)的定义。1 在计算时间的时候,每达到1秒的时候对second进行加1,然后判断是否达到60秒,达到的话minute就加1,minute到达60hour就加一,同样的方法对hour、day、month和year进行计算。2在计算日期的时候,在对day计数时,考虑到大小月和闰年,对day进行加1时,判断是哪一月和是否为闰年。在确定年、月、日之后,使用函数Week()进行对星期几的计算,根据1901年每月1号是星期几可以得出现在是星期几。在这个程序中,还使用了一个对话框类,使用对话框来对时间日期的设置。在菜单栏里添加一个“设置时间”的选项和一个菜单消息,当点击这个选项就会弹出设置时间日期的对话框,对话框中编辑控件设定了每个值的取值范围,从而对输入错误进行排除。 二流程图说明1总体流程说明图 ( 图一)2部分流程说明图(1)输入年份 结束365天366天 28天 29天天闰年否是二月天数是全年天数(图二)(2) 判断年份情况 完成日期的定义以及增加方式完成时间的定义以及增加方式日期类date时间类timeDatetime完成电子时钟的模拟定义week()输出日期的星期数计算两日期相差天数定义situation() 打印结果(图三)另:在本程序中共用到三个类,定义时间的time类,定义日期的date类,以及公有继承了time和date的datetime类,此派生类的作用是定义电子时钟的运行方式。在程序中还运用到一些独立的函数,以实现星期以及格林威治时间差等功能。 二 、系统详细设计1. 主要组成部分该程序主要为了实现日期和时间的显示以及格林威治时间差的计算结果,其中功能时间的显示使用类datetime来实现,功能时差的计算使用类time和类date来实现。下面分别介绍类time,date的详细设计。时间类time的具体实现流程:先声明后定义,类time定义为时间基类,其中:成员函数time()主要功能为时分秒赋初值,实现方式为:函数内定义成员函数int gethour()return hour;int getminute()return minute;int getsecond()return second;返回时分秒的值;成员函数void sethour(int nhour)hour=nhour;void setminute(int nminute)minute=nminute;void setsecond(int nsecond)second=nsecond; 成员函数time主要功能为在撤销对象占有的内存之前完成清理工作释放内存,实现方式为:,通过对象调用析构函数完成清理工作。 类time具体实现流程为:class timeprivate:int hour;int minute;int second;public:time();time(int nhour,int nminute,int nsecond);time(time &c);time();int gethour()return hour;int getminute()return minute;int getsecond()return second;void sethour(int nhour)hour=nhour;void setminute(int nminute)minute=nminute;void setsecond(int nsecond)second=nsecond;类date定义为:描述日期的基类其中:成员函数int getyear()return year;int getmonth()return month;int getday()return day; string getweek() return week;主要功能为返回年月日的值,实现方式为:调用成员函数成员函数void setyear(int nyear)year=nyear;void setmonth(int nmonth)month=nmonth;void setday(int nday)day=nday;void setweek(string c)week=c;主要功能为给私有数据成员赋值,实现方式为通过调用析构函数实现。类datetime公开继承类time和类date的属性,实现电子时钟的功能,完成时间由秒自增的过程。定义函数week(),以及situation(),完成日期对应星期数以及时间差的计算过程,完善电子时钟以及万年历的功能。2. 源程序#include#include#include#includeusing namespace std;int mon13=0,31,28,31,30,31,30,31,31,30,31,30,31; bool isleapyear(int year)/判断是否是闰年return (year%4=0 & year%100!=0)|(year%400=0); int mon_day(int year ,int month)/判断月份对应的天数 if (isleapyear(year)&month=2) return 29; else return monmonth; int getyearday(int year)/返回一年天数 if(isleapyear(year) return 366; else return 365; class timeprivate:int hour;int minute;int second;public:time();time(int nhour,int nminute,int nsecond);time(time &c);time();int gethour()return hour;int getminute()return minute;int getsecond()return second;void sethour(int nhour)hour=nhour;void setminute(int nminute)minute=nminute;void setsecond(int nsecond)second=nsecond;class dateprivate:int year;int month;int day; string week;public:date();date(int y,int m,int d);date(date &t);date();int getyear()return year;int getmonth()return month; int getday()return day;string getweek() return week;void setyear(int nyear)year=nyear;void setmonth(int nmonth)month=nmonth;void setday(int nday)day=nday;void setweek(string c)week=c; void reset(int y=0,int m=0,int d=0);date operator +(const date &t);date operator -(const date &t);class datetime:public date,public time private:public: datetime(); datetime(int nyear,int nmonth,int nday,int nhour,int nminute,int nsecond); datetime(int nyear,int nmonth,int nday,time & c);datetime(date & t,int nhour,int nminute,int nsecond); datetime addbysecond(); datetime operator=(datetime & t);datetime operator+(datetime & t);time:time()/判断时间并进行赋值hour=0;minute=0;second=0;time:time(int nhour,int nminute,int nsecond)if(nhour24|nhour59|nminute59|nsecond0) second=0; else second=nsecond;time:time(time &c)hour=c.hour;minute=c.minute;second=c.second;time:time()/time析构函数date:date()/date构造函数year=0;month=0;day=0;date:date(int y,int m,int d) if(y12 | mmaxday | dyear =y;this-month =m;this-day =d; datetime:datetime():date(),time(); datetime:datetime(int nyear,int nmonth,int nday,int nhour,int nminute,int nsecond):date(nyear,nmonth,nday),time(nhour,nminute,nsecond) datetime:datetime(int nyear,int nmonth,int nday,time & c):time(c),date(nyear,nmonth,nday) datetime:datetime(date & t,int nhour,int nminute,int nsecond):date(t),time(nhour,nminute,nsecond) datetime datetime:addbysecond() this-setsecond(this-getsecond()+1); if(this-getsecond()59) this-setsecond(0); this-setminute(this-getminute()+1); if(this-getminute()59) this-setminute(0); this-sethour(this-gethour()+1); if(this-gethour()23) this-sethour(0); this-setday(this-getday()+1); if(this-getday()mon_day( this-getyear() ,this-getmonth() this-setday(1); this-setmonth(this-getmonth()+1); if(this-getmonth() 12) this-setmonth(1); this-setyear(this-getyear()+1); return *this;datetime datetime:operator=(datetime & t)this-setyear(t.getyear(); this-setmonth(t.getmonth();this-setday(t.getday();this-sethour(t.gethour();this-setminute(t.getminute();this-setsecond(t.getsecond();return *this;datetime datetime:operator+(datetime & t) if(this-getyear()+t.getyear()setyear(1900); else this-setyear(this-getyear()+t.getyear(); if(this-getmonth()+t.getmonth()12 | (this-getmonth()+t.getmonth()setmonth(1); else this-setmonth(this-getmonth()+t.getmonth(); int maxday=0; if(this-getyear()+t.getyear()=2) if(isleapyear(this-getyear()+t.getyear() maxday=29; else maxday=28; else maxday=monthis-getmonth()+t.getmonth(); if(this-getday()+t.getday()maxday |(this-getday()+t.getday()setday(1); this-setday(this-getday()+t.getday(); return *this;int dayinyear(datetime & t)/日期在年中的天数int i=0,day=0;for(i=1;it.getmonth();i+) day+=mon_day(t.getyear(),i);day+=t.getday();return day;void getweek( datetime &t)/判断天数对应星期 int week=0;int diffday; if(t.getyear()=1900) if(t.getmonth()=1) diffday=t.getday()-1; else diffday=dayinyear(t)-1; else int d1=getyearday(1900)-1; int d2=dayinyear(t); int d3=0; int year=0; for(year=1901;yeart.getyear();year+) d3+=getyearday(year); diffday=d1+d2+d3; week=diffday%7; switch(week) case 0: t.setweek(星期一);break;case 1:t.setweek(星期二);break;case 2:t.setweek(星期三);break;case 3:t.setweek(星期四);break;case 4:t.setweek(星期五);break; case 5:t.setweek(星期六);break;case 6:t.setweek(星期天);break; coutt.getweek() endl; int getmonthfirst(datetime & t)/返回对应月的第一天星期数 datetime temp(t.getyear(),t.getmonth(),1,t.gethour(),t.getminute(),t.getsecond();getweek( temp);/判断对应星期数 if(temp.getweek()=星期一) return 1; else if(temp.getweek()=星期二) return 2; else if(temp.getweek()=星期三) return 3; else if(temp.getweek()=星期四) return 4; else if(temp.getweek()=星期五) return 5; else if(temp.getweek()=星期六) return 6; else return 7; void showmonth(datetime & t)/打印当前月日历 int i=0;coutMonday Tusday Wedday Thuday Friday Satday Sundayendl; int j=0; int k=1; int num=getmonthfirst(t); cout ; for(k=1;k=8-num;k+) coutk ; coutendl; for(i=k;i=mon_day(t.getyear(),t.getmonth();i+) int flag=1; int first=k; if(i10) cout i ; else couti ; if(i-k)=6) coutendl; k=i+1; void stuation1(datetime & t)/计算两日期相差天数 int nyear=0;int nmonth=0;int nday=0;int nhour=0;int nminute=0;int nsecond;cout请输入 年 月 日:nyearnmonthnday;cout请输入 时 分 秒:nhournminutensecond;datetime temp ( nyear, nmonth,nday, nhour, nminute,nsecond); int diffday=0; if(t.getyear()=nyear) if(t.getmonth()=nmonth) diffday=abs(t.getday()-nday); else diffday=abs(dayinyear(t)-dayinyear(temp); else if(nyeart.getyear() int d1=getyearday(temp.getyear()-dayinyear(temp); int d2=dayinyear(t); int d3=0; int year=0; for(year=nyear;yeart.getyear();year+) d3+=getyearday(year); diffday=d1+d2+d3; else int d1=getyearday(t.getyear()-dayinyear(t);int d2=dayinyear(temp);int d3=0;int year=0;for(year=t.getyear();yearnyear;year+)d3+=getyearday(year); diffday=d1+d2+d3; cout与原日期相隔的天数为:diffdayendl; int monthsurplus(datetime & t)/当月剩余天数 return mon_day(t.getyear(),t.getmonth()-t.getday(); int yearsurplus(datetime & t)/当年剩余天数 return getyearday(t.getyear()-dayinyear(t); void stuation2(datetime & t ) int diffday=0; int lastday=0; int lastmonth=0; int lastyear=0; cout 请输入相隔的天数:diffday; if(diffday0) if(diffday=monthsurplus(t)/月未变 lastday=diffday+t.getday(); lastmonth=t.getmonth(); lastyear=t.getyear(); else if(diffday=yearsurplus(t)/年未变 lastyear=t.getyear(); int k=1; int i=monthsurplus(t); while(idiffday) i+=(mon_day(t.getyear(),t.getmonth()+k); k+; lastmonth=t.getmonth()+k-1; int h=0; int total=monthsurplus(t); for(h=(t.getmonth()+1);hlastmonth;h+) total+=mon_day(t.getyear(),h); lastday=diffday-total; else/年变了 int k=1; int fmonth=0; int i=yearsurplus(t); while(idiffday) i+=getyearday(t.getyear()+k); k+; lastyear=t.getyear()+k-1; int fyear=yearsurplus(t); for(i=(t.getyear()+1);ilastyear;i+) fyear+=getyearday(i); int surplusday=diffday-fyear;/所求年的天数 int h=0,j=1; while(h=surplusday) h+=mon_day(lastyear,j); j+; lastmonth=j-1; int total=0; int j1=1; for(;j1lastmonth;j1+) total+=mon_day(lastyear,j1); lastday=surplusday-total; else/diffday0 if (abs(diffday)t.getday() lastday=t.getday(); lastmonth=t.getmonth(); lastyear=t.getyear(); else if(abs(diffday)=dayinyear(t) lastyear=t.getyear(); int j=0,total=0; int k=t.getmonth(); int i=t.getday(); while(i=(lastmonth+1);j-) total+=mon_day(t.getyear(),j); lastday=diffday-total; else int i=dayinyear(t); int k=t.getyear(); while(i=lastyear+1;j-) mtotal+=getyearday(j); int nday=abs(diffday)-mtotal; int h=0;int flag=0; int m=0; while(h=lastmonth+1;m-) dtotal+=mon_day(lastyear,m); lastday=nday-dtotal; cout日期为:endl; coutlastyear年lastmonth月lastday日endl; void Tprojection(datetime & sytime) int option=0; cout 您已进入万年历系统 endl; cout 您已进入日期推算菜单 endl; cout 1.计算两日期相差天数 endl; cout 2.计算日期前后推算 endl; cout 请选择:option; system(cls); /清屏 switch(option) case 1: stuation1(sytime);/计算两日期相差天数 break; case 2: stuation2(sytime);/计算日期前后推算 break; void timers( datetime &dtime)/模拟电子计时器 int k=0; coutdtime.getyear()年dtime.getmonth()月dtime.getday() 日dtime.gethour()时dtime.getminute()分dtime.getsecond()秒endl; getweek( dtime );/判断对应星期数 while(true) Sleep(2200); dtime.addbysecond();/电子模拟 showmonth(dtime);/打印当前月日历 system(cls); coutdtime.getyear()年dtime.getmonth()月dtime.getday()日dtime.gethour()时dtime.getminute()分dtime.getsecond()秒endl; getweek( dtime );/判断对应星期数 showmonth(dtime);/打印当前月日历 void Elcsystem(datetime & sytime)int option=0;cout 您已进入万年历模拟系统endl;cout 1.进入日期模拟输出系统endl;cout 2.进入日期推算系统endl;cout请选择option; system(cls); /清屏switch(option)case 1 :cout 当前时间为:endl;cout ; timers( sytime);/模拟电子计时器;case 2: Tprojection(sytime);/日期推算break; system(plause);/暂停 defaut: cout 无此选项!endl;void showmenu() cout 您已进入电子模拟系统 endl; cout 1.模拟万年历输出 endl; cout” 2.退出万年历系统 endl; cout请选择:”1或2:”;int main()int nyear=0;int nmonth=0;int nday=0;int nhour=0;int nminute=0;int nsecond; cout 您已进入万年历系统 endl; cout 请输入 年 月 日 nyearnmonthnday;cout 请输入 时 分 秒 nhournminutensecond; system(cls); /清屏datetime sytime( nyear, nmonth,nday, nhour, nminute,nsecond); int option; showmenu(); cinoption; system(cls); /清屏while(option!=3) switch (option) case 1: Elcsystem(sytime);/调用电子模拟系统 break; case 2: goto l;/退出系统 break; default : break; showmenu(); cinoption;l:system(cls); /清屏 cout 谢谢使用 endl; return 0; 第三章 系统测试1.请输入日期按回车键进行下一步骤;(图)2.请输入时间按回车进行下一步骤;(图)3.选择下一过程按回车键继续;(图)4.进入万年历模拟系统之后选择下一步骤按回车键继续;(图)5.输出当前时间;(图)停顿几秒后会显示万年历的输出情况;(图)6.进入万年历模拟系统之后进行第二步骤;(图)7.进入日期推算后选择下一步骤;(图)8.输入日期计算与原日期相差天数值;(图)9.推算出相差天数之后进行另一步骤;(图)(图)10.在日期推算界面中选择另一步骤,进行日期的前后推算;(图)11.输入相隔天数按回车键继续;(图)12.选择退出系统。(图) 四 软件使用说明书1、系统运行环境Win7 vc+6.0环境2、系统操作提示本系统利用各个类执行不同的操作,以完成对于时间
展开阅读全文