课程设计万年历的设计说明.docx
- 文档编号:11501913
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:44
- 大小:107.40KB
课程设计万年历的设计说明.docx
《课程设计万年历的设计说明.docx》由会员分享,可在线阅读,更多相关《课程设计万年历的设计说明.docx(44页珍藏版)》请在冰点文库上搜索。
课程设计万年历的设计说明
理工大学
计算机与通信学院
2014年秋季学期
面向对象课程设计
题目:
万年历的设计
序言
《面向对象的程序设计》是计算机专业一门重要的专业基础课。
此次课程设计的目的是以面向对象程序设计语言为基础,通过完成一些具有一定难度的课程设计题目的编写、调试、运行工作,进一步掌握面向过程和面向对象程序设计的基本方法和编程技巧,巩固所学理论知识,使理论与实际相结合。
从而提高自我分析问题、解决问题的能力。
通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《C++语言程序设计》的基本理论知识,理论联系实际,进一步培养学生综合分析问题、解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象的程序设计方法。
(6)进一步掌握在集成环境下如何调试程序、修改程序和程序的测试。
目录
摘要2
第一章系统总体设计3
一.理论说明3
二.流程图说明4
1.总体流程说明图4
2.部分流程说明图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)
否
是
二月天数是
全年天数
(图二)
(2)
判断年份情况
时间类time
日期类date
Datetime
定义week()
输出日期的星期数
完成电子时钟的模拟
完成日期的定义以及增加方式
完成时间的定义以及增加方式
定义situation()
打印结果
计算两日期相差天数
(图三)
另:
在本程序中共用到三个类,定义时间的time类,定义日期的date类,以及公有继承了time和date的datetime类,此派生类的作用是定义电子时钟的运行方式。
在程序中还运用到一些独立的函数,以实现星期以及格林威治时间差等功能。
二、系统详细设计
1.主要组成部分
该程序主要为了实现日期和时间的显示以及格林威治时间差的计算结果,
其中功能时间的显示使用类datetime来实现,功能时差的计算使用类time和类date来实现。
下面分别介绍类time,date的详细设计。
时间类time的具体实现流程:
先声明后定义,类time定义为时间基类,其中:
成员函数time()主要功能为时分秒赋初值,实现方式为:
函数定义成员函数
intgethour(){returnhour;};
intgetminute(){returnminute;};
intgetsecond(){returnsecond;}返回时分秒的值;
成员函数
voidsethour(intnhour){hour=nhour;};
voidsetminute(intnminute){minute=nminute;};
voidsetsecond(intnsecond){second=nsecond;};
成员函数~time主要功能为在撤销对象占有的存之前完成清理工作释放存,实现方式为:
,通过对象调用析构函数完成清理工作。
类time具体实现流程为:
classtime{
private:
inthour;
intminute;
intsecond;
public:
time();
time(intnhour,intnminute,intnsecond);
time(time&c);
~time();
intgethour(){returnhour;};
intgetminute(){returnminute;};
intgetsecond(){returnsecond;};
voidsethour(intnhour){hour=nhour;};
voidsetminute(intnminute){minute=nminute;};
voidsetsecond(intnsecond){second=nsecond;};
};
类date定义为:
描述日期的基类
其中:
成员函数
intgetyear(){returnyear;};
intgetmonth(){returnmonth;};
intgetday(){returnday;};
stringgetweek(){returnweek;};主要功能为返回年月日的值,实现方式为:
调用成员函数
成员函数
voidsetyear(intnyear){year=nyear;};
voidsetmonth(intnmonth){month=nmonth;};
voidsetday(intnday){day=nday;};
voidsetweek(stringc){week=c;};主要功能为给私有数据成员赋值,实现方式为通过调用析构函数实现。
类datetime公开继承类time和类date的属性,实现电子时钟的功能,完成时间由秒自增的过程。
定义函数week(),以及situation(),完成日期对应星期数以及时间差的计算过程,完善电子时钟以及万年历的功能。
2.源程序
#include
#include
#include
#include
usingnamespacestd;
intmon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
boolisleapyear(intyear)//判断是否是闰年
{
return(year%4==0&&year%100!
=0)||(year%400==0);
}
intmon_day(intyear,intmonth)//判断月份对应的天数
{
if(isleapyear(year)&&month==2)
{
return29;
}
elsereturnmon[month];
}
intgetyearday(intyear)//返回一年天数
{
if(isleapyear(year))
return366;
elsereturn365;
}
classtime
{
private:
inthour;
intminute;
intsecond;
public:
time();
time(intnhour,intnminute,intnsecond);
time(time&c);
~time();
intgethour(){returnhour;};
intgetminute(){returnminute;};
intgetsecond(){returnsecond;};
voidsethour(intnhour){hour=nhour;};
voidsetminute(intnminute){minute=nminute;};
voidsetsecond(intnsecond){second=nsecond;};
};
classdate
{
private:
intyear;
intmonth;
intday;
stringweek;
public:
date();
date(inty,intm,intd);
date(date&t);
~date();
intgetyear(){returnyear;};
intgetmonth(){returnmonth;};
intgetday(){returnday;};
stringgetweek(){returnweek;};
voidsetyear(intnyear){year=nyear;};
voidsetmonth(intnmonth){month=nmonth;};
voidsetday(intnday){day=nday;};
voidsetweek(stringc){week=c;};
voidreset(inty=0,intm=0,intd=0);
dateoperator+(constdate&t);
dateoperator-(constdate&t);
};
classdatetime:
publicdate,publictime
{
private:
public:
datetime();
datetime(intnyear,intnmonth,intnday,intnhour,intnminute,intnsecond);
datetime(intnyear,intnmonth,intnday,time&c);
datetime(date&t,intnhour,intnminute,intnsecond);
datetimeaddbysecond();
datetimeoperator=(datetime&t);
datetimeoperator+(datetime&t);
};
time:
:
time()//判断时间并进行赋值
{
hour=0;
minute=0;
second=0;
}
time:
:
time(intnhour,intnminute,intnsecond)
{
if(nhour>24||nhour<0)
{hour=0;
}
elsehour=nhour;
if(nminute>59||nminute<0)
{
minute=0;}
elseminute=nminute;
if(nsecond>59||nsecond<0)
{
second=0;}
elsesecond=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(inty,intm,intd)
{
if(y<1900)
{
y=1900;
}
elseyear=y;
if(m>12||m<=0)
{
m=1;
}
elsemonth=m;
intmaxday=0;
if(m==2)
{
if(isleapyear(year))
{
maxday=29;
}
else
{
maxday=28;
}
}
else
{
maxday=mon[m];
}
if(d>maxday||d<=0)
{
d=1;
}
day=d;
}
date:
:
date(date&t)
{
year=t.year;
month=t.year;
day=t.day;
}
date:
:
~date(){};
voiddate:
:
reset(inty,intm,intd)
{
this->year=y;
this->month=m;
this->day=d;
}
datetime:
:
datetime():
date(),time(){};
datetime:
:
datetime(intnyear,intnmonth,intnday,intnhour,intnminute,intnsecond):
date(nyear,nmonth,nday),time(nhour,nminute,nsecond)
{}
datetime:
:
datetime(intnyear,intnmonth,intnday,time&c):
time(c),date(nyear,nmonth,nday)
{}
datetime:
:
datetime(date&t,intnhour,intnminute,intnsecond):
date(t),time(nhour,nminute,nsecond)
{}
datetimedatetime:
:
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;
}
datetimedatetime:
:
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;
}
datetimedatetime:
:
operator+(datetime&t)
{
if((this->getyear()+t.getyear())<1900)
{
this->setyear(1900);
}
elsethis->setyear((this->getyear()+t.getyear()));
if((this->getmonth()+t.getmonth())>12||(this->getmonth()+t.getmonth())<=0)
{
this->setmonth
(1);
}
elsethis->setmonth((this->getmonth()+t.getmonth()));
intmaxday=0;
if((this->getyear()+t.getyear())==2)
{
if(isleapyear((this->getyear()+t.getyear())))
{
maxday=29;
}
else
{
maxday=28;
}
}
else
{
maxday=mon[this->getmonth()+t.getmonth()];
}
if((this->getday()+t.getday())>maxday||(this->getday()+t.getday())<=0)
{
this->setday
(1);
}
this->setday((this->getday()+t.getday()));
return*this;
}
intdayinyear(datetime&t)//日期在年中的天数
{
inti=0,day=0;
for(i=1;i { day+=mon_day(t.getyear(),i); } day+=t.getday(); returnday; } voidgetweek(datetime&t)//判断天数对应星期 { intweek=0; intdiffday; if(t.getyear()==1900) { if(t.getmonth()==1) { diffday=t.getday()-1; } else { diffday=dayinyear(t)-1; } } else { intd1=getyearday(1900)-1; intd2=dayinyear(t); intd3=0; intyear=0; for(year=1901;year { d3+=getyearday(year); } diffday=d1+d2+d3; } week=diffday%7; switch(week) { case0: t.setweek("星期一");break; case1: t.setweek("星期二");break; case2: t.setweek("星期三");break; case3: t.setweek("星期四");break; case4: t.setweek("星期五");break; case5: t.setweek("星期六");break; case6: t.setweek("星期天");break; } cout< } intgetmonthfirst(datetime&t)//返回对应月的第一天星期数 { datetimetemp(t.getyear(),t.getmonth(),1,t.gethour(),t.getminute(),t.getsecond()); getweek(temp);//判断对应星期数 if(temp.getweek()=="星期一") return1; elseif(temp.getweek()=="星期二") return2; elseif(temp.getweek()=="星期三") return3; elseif(temp.getweek()=="星期四") return4; elseif(temp.getweek()=="星期五") return5; elseif(temp.getweek()=="星期六") return6; else return7; } voidshowmonth(datetime&t)//打印当前月日历 { inti=0; cout<<"Monday"<<""<<"Tusday"<<""<<"Wedday"<<""<<"Thuday"<<""<<"Friday"<<""<<"Satday"<<""<<"Sunday"< intj=0; intk=1; intnum=getmonthfirst(t); cout<<""; for(k=1;k<=8-num;k++) cout< cout< for(i=k;i<=mon_day(t.getyear(),t.getmonth());i++) { intflag=1; intfirst=k; if(i<10) { cout<<""< } els
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 万年历 设计 说明
![提示](https://static.bingdoc.com/images/bang_tan.gif)