万年历及日期查询工具教材.docx

上传人:b****6 文档编号:6000982 上传时间:2023-01-02 格式:DOCX 页数:32 大小:254.29KB
下载 相关 举报
万年历及日期查询工具教材.docx_第1页
第1页 / 共32页
万年历及日期查询工具教材.docx_第2页
第2页 / 共32页
万年历及日期查询工具教材.docx_第3页
第3页 / 共32页
万年历及日期查询工具教材.docx_第4页
第4页 / 共32页
万年历及日期查询工具教材.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

万年历及日期查询工具教材.docx

《万年历及日期查询工具教材.docx》由会员分享,可在线阅读,更多相关《万年历及日期查询工具教材.docx(32页珍藏版)》请在冰豆网上搜索。

万年历及日期查询工具教材.docx

万年历及日期查询工具教材

齐鲁工业大学

信息学院

 

课程设计报告

 

课程名称:

面向对象程序设计

题目名称:

日期查询工具

学生姓名:

刘胜军

学生学号:

201203014036

专业班级:

计科(高职)12-1

指导教师:

任晓强

完成日期:

2013年6月25日

一、课程设计目的与任务2

二、课程设计内容2

1本设计题目的主要内容2

2设计思想与程序构架3

3软件使用说明书14

4程序测试及分析15

5设计总结19

三、主要参考资料19

四、附录20

1程序源代码及基本注释20

一、课程设计目的与任务

本课程设计是针对面向对象程序设计课程的实践教学项目,为学生提供一个既动手又动脑,针对C++面向对象语言的独立实践的机会,将课本上的理论知识和实际有机的结合起来,通过接近实际项目的训练,锻炼的分析解决实际问题的能力。

提高学生面向应用的实践编程的能力。

二、课程设计内容

1本设计题目的主要内容

1.设计内容

编写一个可以查询任意年的日历,任意月的日历;可以查询某天的对应星期,查询当前时间;可以计算两日期差的工具《日期查询工具》。

2.具体功能及要求:

1).显示公元后任何年份的日历,日历以月份顺序排列,每月以星期顺序排列,类似于一般挂历上的格式。

2).显示公元后任何年份任何月份的日历,以星期顺序排列,类似于一般挂历上的格式。

3).可以查询某天的对应星期,查询当前时间。

4).可以计算指定的两日期间的时间(天数)差。

5).可以计算指定日期后,前后某天数对应的日期。

6).可以对年日历和月日历进行保存。

3.最终程序样式

4.运行环境

(1)WindowsXP/7/8系统

(2)MicrosoftVisualC++6.0编译环境

5.开发工具

C语言

6.实现方法

(1)定义一个Date类,使包含所有数据成员及函数,如数据成员年、月、日、星期,成员函数年份平润年的判断函数JudgeYear(inty),某日期到公元1年1月1日实有天数的计算函数GetYearDays(inty)等12个主要函数及主要函数中需要用到的12个辅助函数;

(2)在主函数中通过选择不同的功能,执行不同的模块,完成相应功能;

(3)画出所有模块的流程图;

(4)编写代码;

(5)程序分析与调试。

2设计思想与程序构架

㈠.程序类中主要成员函数的定义方式及解释(原代码详见附录>1)

1.先分析一个实验所要完成的功能,发现中间需要有平润年的判断;任意年份的实有天数判断;任意月的实有天数判断;任意年到1年1月1日的实有天数;由到1年1月1日的实有天数计算对应日期;判断任意日期对应的星期;显示年日历,保存年日历;显示月日历,保存月日历等。

2.根据分析定义一Date类,拥有Year,Month,Day,Week四个私有整形数据成员,然后根据分析分别声明相应类型的成员函数,又因为数据成员为私有成员,若要调用或修改只能调用函数,所以另直接定义八个成员函数以实现这部分获取、修改功能。

最后还要定义构造函数以实现对数据成员的快速赋值,包括没有参数,年月日皆为1,只一个参数对年赋值,月日为1,两个参数对年月赋值,日为1,三个参数对年月日赋值,星期直接通过函数计算可得。

成员函数累计24个,基本如下:

classDate//定义日期类

{

private:

intYear;

intMonth;

intDay;

intWeek;

public:

Date(){Year=1;Month=1;Day=1;}//构造函数,经初始化数据成员

Date(inty){Year=y;Month=1;Day=1;}

Date(inty,intm){Year=y;Month=m;Day=1;}

Date(inty,intm,intd){Year=y;Month=m;Day=d;}

voidSetYear(inty){Year=y;}//设置年份

voidSetMonth(intm){Month=m;}//设置月份

voidSetDay(intd){Day=d;}//设置日份

voidSetWeek(intw){Week=w;}//设置星期

intGetYear()const{returnYear;}//获取年份

intGetMonth()const{returnMonth;}//获取月份

intGetDay()const{returnDay;}//获取日份

intGetWeek()const{returnWeek;}//设置星期

staticboolJudgeYear(inty)//判断某年是否为润年(平年)

{

if(y%4==0&&y%100!

=0||y%400==0)

returntrue;

else

returnfalse;

}

intGetMonthDays(intm);//判断某年某月实有天数

intGetYearDays(inty);//判断某年实有天数

intDateToNum();//判断某年到1年1月1日实有天数

DateNumToDate(int);//由1年1月1日至指定日期实有天数返回日期

voidOutMonth(intr);//月份输出

voidOutWeek(intr);//星期输出

voidAllShow();//输出某年全年日历

voidWAllShow();//文件输出某年全年日历

voidMonthShow();//输出某年某月日历

voidWMonthShow();//输出某年某月日历

voidWeekShow();//输出某年某月某日星期日历

};

3.定义平润年的判断,只需要获取指定的年份,能过“能被4整除不能被100整除是润年和能被400整除是润年”判断即可,是润年返回True,否则返回False,直接在类内定义。

staticboolJudgeYear(inty)//判断某年是否为润年(平年)

{

if(y%4==0&&y%100!

=0||y%400==0)

returntrue;

else

returnfalse;

}

4.定义任意年份的实有天数判断,只需要判断指定年份是否为润年,是则返回366,否则365。

intDate:

:

GetYearDays(inty)//判断某年实有天数

{

if(JudgeYear(y))//调用JudgeYear(inty)判断平润年

return366;

else

return365;

};

5.定义任意月的实有天数判断,需要获取指定的年份与月份,能过判断月份,大月返回31天,小月返回30天,2月还需要通过判断年份是否为润年返回相应值,润年返回29天,平年返回28天。

intDate:

:

GetMonthDays(intm)//判断某年某月实有天数

{

intn;

switch(m)//判断月份

{

case1:

case3:

case5:

case7:

case8:

case10:

case12:

n=31;break;

case4:

case6:

case9:

case11:

n=30;break;

case2:

if(JudgeYear(GetYear()))//调用JudgeYear(inty)判断平润年

n=29;//是润年返回29年

else

n=28;//不是润年返回28年

break;

}

returnn;

};

6.定义任意年到1年1月1日的实有天数,定义一个用于存放总天数的n,赋初值为0,通过循环先与指定年份前1年到公元1年所有年份的总天数相加,每次循环都需要调用任意年份的实有天数判断函数获取某年的总天数;指定年份前x年所有年份总天数相加完成后,再通过循环与指定月份前1月到1月所有月份总天数相加,期间也要计算个个月的总天数;最后与指定日期的天数相加,返回n的值即可。

intDate:

:

DateToNum()//判断某年到1年1月1日实有天数

{

inty,n=0;

for(y=1;y

n+=GetYearDays(y);

for(intm=1;m

n+=GetMonthDays(m);

n+=Day;

returnn;

};

7.定义由到1年1月1日的实有天数计算对应日期,此过程与定义任意年到1年1月1日的实有天数类似,只不过是一个反向过程。

也需要能过年份天数判断,月份天数判断,判断总天数中最多含有多少年,多少月,最后还剩多少日,以Date类型返回。

DateDate:

:

NumToDate(intda)//由实有天数返回日期

{

inty,m,d,rest=da;

for(y=1,rest;rest>GetYearDays(y);y++)

rest-=GetYearDays(y);

for(m=1,rest;rest>GetMonthDays(m);m++)

rest-=GetMonthDays(m);

d=rest;

returnDate(y,m,d);

};

8.定义判断任意日期对应的星期,此过程只需要计算出指定日期到公元1年1月1日的实有天数,然后除7取余即可,其余数就是对应的星期。

9.定义显示年日历,此函数目的在于输入全年日历。

具体实现如下:

定义4个变量,分别存放指定年份的1月1日到公元1年1月1日的实有天数,可调用函数实现,此年份中某月1号对应的星期,可调用函数计算此年某月1号到公元1年1月1日的实有天数除7取余实现,另两个用于循环。

共有两层循环,第一层循环共计12次,一年只有12个月,第二层循环次数由当前要输出的月份的总天数判断。

第二层循环内又嵌套二个循环,第一个条件为某月1号是星期几则输出几个tab空格,第二层循环用于输出日历,能过输出的日期加上之前的空格数除7余0作为换行条件,以实现以星期布局。

主要部分也就如此,另外日历前后的横线、星期、年月份直接输出,或调用函数输出即可。

此次编写,也把月份的输出重定义了一个函数,由获取一个月份,输出大写月份,由switch语句实现。

voidDate:

:

AllShow()//输出某年全年日历

{

intn,morday,wek,j;

morday=DateToNum();

cout<<""<

for(n=1;n<=12;n++)

{

cout<<"-------------------------------------------------------------------"<<'\n';

cout<<"";

OutMonth(n);

cout<<"星期日星期一星期二星期三星期四星期五星期六"<<'\n';

wek=morday%7;

for(j=1;j<=wek;j++)

cout<<'\t';

for(j=1;j<=GetMonthDays(n);j++)

{

cout<<'\t'<

if((wek+j)%7==0)

cout<<'\n';

morday++;

if(j==GetMonthDays(n))

cout<<'\n';

}

cout<<"-------------------------------------------------------------------"<<'\n';

}

};

10.定义保存年日历,前面定义了在屏幕上显示的函数,这里和上面差不多,只需要打开或新建一文件,判断文件打开与否,打开了,则把所有输出到屏幕的内容,改为输入到文件即可。

最后关闭文件,提示用户保存成功。

voidDate:

:

WAllShow()//文件输出某年全年日历

{

intn,morday,wek,j;

morday=DateToNum();

ofstreamoutfile("年日历.txt",ios:

:

trunc);

if(!

outfile){cerr<<"Openerror!

"<

(1);}

outfile<<""<

for(n=1;n<=12;n++)

{

outfile<<"-------------------------------------------------------------------"<<'\n';

outfile<<"";

switch(n)

{

case1:

outfile<<"一月份"<<'\n';break;

case2:

outfile<<"二月份"<<'\n';break;

case3:

outfile<<"三月份"<<'\n';break;

case4:

outfile<<"四月份"<<'\n';break;

case5:

outfile<<"五月份"<<'\n';break;

case6:

outfile<<"六月份"<<'\n';break;

case7:

outfile<<"七月份"<<'\n';break;

case8:

outfile<<"八月份"<<'\n';break;

case9:

outfile<<"九月份"<<'\n';break;

case10:

outfile<<"十月份"<<'\n';break;

case11:

outfile<<"十一月份"<<'\n';break;

default:

outfile<<"十二月份"<<'\n';

}

outfile<<"星期日星期一星期二星期三星期四星期五星期六"<<'\n';

wek=morday%7;

for(j=1;j<=wek;j++)

outfile<<'\t';

for(j=1;j<=GetMonthDays(n);j++)

{

outfile<<'\t'<

if((wek+j)%7==0)

outfile<<'\n';

morday++;

if(j==GetMonthDays(n))

outfile<<'\n';

}

outfile<<"-------------------------------------------------------------------"<<'\n';

}

outfile.close();

cout<<"保存成功"<

};

11.定义显示月日历,此函数与定义显示年日历函数相似,只是不需要外循环而以,比起定义显示年日历函数相对简单。

能过显示年日历函数略微修改即可。

voidDate:

:

MonthShow()//输出某年某月日历

{

intmorday,wek,j;

morday=DateToNum();

cout<<""<

cout<<"-------------------------------------------------------------------"<<'\n';

cout<<"星期日星期一星期二星期三星期四星期五星期六"<<'\n';

wek=morday%7;

for(j=1;j<=wek;j++)

cout<<'\t';

for(j=1;j<=GetMonthDays(GetMonth());j++)

{

cout<<'\t'<

if((wek+j)%7==0)

cout<<'\n';

morday++;

if(j==GetMonthDays(GetMonth()))

cout<<'\n';

}

cout<<"-------------------------------------------------------------------"<<'\n';

};

12.定义保存月日历,与定义保存年日历相似,通过显示月日历函数修改即可。

voidDate:

:

WMonthShow()//输出某年某月日历

{

intmorday,wek,j;

morday=DateToNum();

ofstreamoutfile("月日历.txt",ios:

:

trunc);

if(!

outfile){cerr<<"Openerror!

"<

(1);}

outfile<<""<

outfile<<"-------------------------------------------------------------------"<<'\n';

outfile<<"星期日星期一星期二星期三星期四星期五星期六"<<'\n';

wek=morday%7;

for(j=1;j<=wek;j++)

outfile<<'\t';

for(j=1;j<=GetMonthDays(GetMonth());j++)

{

outfile<<'\t'<

if((wek+j)%7==0)

outfile<<'\n';

morday++;

if(j==GetMonthDays(GetMonth()))

outfile<<'\n';

}

outfile<<"-------------------------------------------------------------------"<<'\n';

outfile.close();

cout<<"保存成功"<

};

13.考虑到用户输入日期时输入错误日期,再定义一个判断函数,此函数并不是Date类的成员函数,其引用Date类型变量,通过do…while语句判断里面的年月日是否合格,不合格要求用户重新输入,条件为不满足月份不大于12,不小于1,天数不小于1,不大于当年当月的实有天数,合格则不做任何处理。

voidDatejudge(Date&d)//输入日期判断

{

intm=d.GetMonth();

intda=d.GetDay();

inty=d.GetYear();

for(;m>12||m<1||da>d.GetMonthDays(m)||da<1;)

{

cout<<"对应日期有误,请重新输入:

";

cin>>y>>m>>da;

d.SetYear(y);

d.SetMonth(m);

d.SetDay(da);

y=d.GetYear();

m=d.GetMonth();

da=d.GetDay();

}

};

㈡.程序主函数中主要功能的实现方式及解释(代码详见附录>1)

1.为实现循环,调用do…while语句。

2.提示部分直接在do…while语句内最前面输出即可,如选择几,是什么功能。

cout<<"-------------------------------------------------------------------\n";

cout<<"选择1:

查看X年日历\n";

cout<<"选择2:

查看X年X月日历\n";

cout<<"选择3:

查看X年X月X日对应星期\n";

cout<<"选择4:

计算两日期间的天数差\n";

cout<<"选择5:

计算指定日期后X天的日期\n";

cout<<"选择6:

查看系统时间\n";

cout<<"选择7:

清屏并继续\n";

cout<<"选择8:

退出\n";

cout<<"-------------------------------------------------------------------\n";

3.定义一整形变量jud,并赋初值为可满足do…while语句循环的值,这里为7.

do

{

……

}while(jud==7);

4.通过if判断jud的值,执行不同的功能,前5个功能都是依靠Date类及里面的函数实现的,这里就不多说了,主要说一下第6个,显示当前系统时间,需要用到函数库,定义time_t变量now,使用time(&now)实现给now赋当前系统时间,定义tm型指针*tim=localtime(&now),然后按指定格式依次输出tim中对应的年月日时分秒。

if(jud==6)

{

time_tnow;

time(&now);

tm*tim=localtime(&now);

cout<<"当前时间:

"<tm_year+1900<<"-"<tm_mon+1<<"-"<tm_mday<<""<tm_hour<<":

"<tm_min<<":

"<tm_sec<

jud=7;continue;

}

5.当jud=7时,运行continue调出此次循环;jud=8时,运行exit(0)退出。

if(jud==7)

system("cls");

continue;

if(jud==8)

exit(0);

㈢.各模块实现流程图

 

㈣.程序主流程图

 

3软件使用说明书

运行程序后,会出现主菜单,如下图,根据菜单选择相应的功能,每部分功能如下:

1.第一项,用于查询任意指定年份的全年日历。

选择第1项后,输入想要查询的年份,回车确认后,屏幕上会以一星期为周期显示全年日历,在第十二月份显示完毕后,会提示用户是否保存当前所查询的年份日历到文本文档,用户输入y或Y,即可保存,输入其他任意字符则不保存,不输入则不做任何反应。

判断结束,若保存,程序自动将本年份日历保存到程序所在位置,并命名为《年日历.txt》,然后回到主菜单,若不保存,直接返回主菜单。

2.第二项,用于查询任意指定年份与月份的全月日历。

选择第2项后,输入想要查询的年份,月份,年月中间用空

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1