万年历的设计.docx
《万年历的设计.docx》由会员分享,可在线阅读,更多相关《万年历的设计.docx(29页珍藏版)》请在冰点文库上搜索。
![万年历的设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/1935a184-a819-4579-b32c-06e2d704d5d4/1935a184-a819-4579-b32c-06e2d704d5d41.gif)
万年历的设计
万年历的设计
一.系统概要
定义了包含实现系统功能的函数的类——Calendar,用来说明系统结构,对函数进行封装。
在类系统体外使用域运算符定义函数,程序具较强的可读性。
系统包含了大量的文字提醒,便于用户进行人机交互;同时采用了系统主菜单,提高了程序的可操作性。
系统可实现显示一年的日历,计算任意两天间隔天数,查询当前时间和日期具体信息的功能。
二界面参考
图1.主界面
图2.选择年历的三种输出方式
图三.逐行输出的2012年日历
用 行两月输出
图5.计算天数
显示某天是星期几
三设计思路与算法
1.定义日历的类
将系统函数作为类的公有成员,构成可访问的函数结构。
类的说明部分对数据成员和函数成员进行说明。
私有部分对无需访问部分进行封装和隐藏。
类的定义如下:
classCalendar
{
public:
Calendar(){b[0]=31,b[1]=28,b[2]=31,b[3]=30,b[4]=31,b[5]=30,b[6]=
31,b[7]=31,b[8]=30,b[9]=31,b[10]=30,b[11]=31;}//初始化每月天数
voiddisplay();//主页面显示
voidshiyong_cal();//实用日历主页
voidthr_mon_print(intyear);//三个月输出
voidtwe_mon_print(intyear);//两个月输出
voidone_mon_ptint(intyear);//一个月输出
voidcount_data();//计算日期
voidnow_time_show();//显示当前时间
voidday_info();//具体日期信息
private:
intleapyear(intyear);//判断与2012之间的闰年数
booljudge(intyear);//判断闰年
voidfmprint3(inta,intb,intc,intd,inte,intf);//三个月输出调用函数
voidfmprint2(inta,intb,intc,intd);//两个月输出调用函数
voidinitalize(intyear);//初始化a,b数组
voidshiyong_cal_show();//实用日历主页
boolif_continue();//是否继续
inta[12];//每个月1号前空格数
intb[12];//月分天数
};
2.定义类的函数,包含程序中的所有重要算法。
运用域运算符“:
:
”定义,将程序中的重要算法作为函数体,使布局合理,易于维护。
a.判断某天是星期几:
t=((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7;
b.判断该年是否为闰年:
(year%100!
=0&&year%4==0)||year%400==0;
c.通过计算该年与2012年间闰年天数计算由于闰年引起的相差天数:
if(year>=2012)
{
year=year-2012;
return(year/4-(year+12)/100+(year+12)/400+1);
}
else
{
year=2012-year;
return(year/4-(year-12)/100+(year-12)/400);
}
4年的个数减去100年的个数在加上400年的个数就是其中闰年的个数。
3.主函数中用case语句调用类的函数
定义switch(i),从主菜单中输入i,进行函数调用,实现功能的选择。
4.调用头文件中与日期和时间相关的数据结构
使用中的localtime函数获得当前时间,并利用指针实现当前时间的正确输出。
time_tnowtime;
nowtime=time(NULL);
structtm*t;
t=localtime(&nowtime);
三.源程序代码
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
classCalendar
{
public:
Calendar(){b[0]=31,b[1]=28,b[2]=31,b[3]=30,b[4]=31,b[5]=30,b[6]=
31,b[7]=31,b[8]=30,b[9]=31,b[10]=30,b[11]=31;}//初始化每月天数
voiddisplay();//主页面显示
voidshiyong_cal();//实用日历主页
voidthr_mon_print(intyear);//三个月输出
voidtwe_mon_print(intyear);//两个月输出
voidone_mon_ptint(intyear);//一个月输出
voidcount_data();//计算日期
voidnow_time_show();//显示当前时间
voidday_info();//具体日期信息
private:
intleapyear(intyear);//判断与2012之间的闰年数
booljudge(intyear);//判断闰年
voidfmprint3(inta,intb,intc,intd,inte,intf);//三个月输出调用函数
voidfmprint2(inta,intb,intc,intd);//两个月输出调用函数
voidinitalize(intyear);//初始化a,b数组
voidshiyong_cal_show();//实用日历主页
boolif_continue();//是否继续
inta[12];//每个月1号前空格数
intb[12];//月分天数
};//----------------------------------
boolCalendar:
:
judge(intyear)//判断闰年
{
return(year%100!
=0&&year%4==0)||year%400==0;
}//----------------------------------
voidCalendar:
:
display()//主页面显示
{cout<<"═─═─═─═─═─═"<cout<<"☆☆"<cout<<"欢迎进入万年历查询系统"<cout<<"☆☆"<cout<<"═─═─═─═─═─═"<cout<cout<cout<cout<<"\t\t**\t\t1、实用日历\t\t**"<cout<<"\t\t**\t\t2、计算日期\t\t**"<cout<<"\t\t**\t\t3、当前时间\t\t**"<cout<<"\t\t**\t\t4、具体日期信息\t\t**"<cout<<"\t\t**\t\t0、退出系统\t\t**"<cout<<"\t\t*********************************************"<}//----------------------------------
voidCalendar:
:
shiyong_cal_show()//实用日历主页
{
cout<cout<<"\t\t**\t\t1、逐行输出\t\t**"<cout<<"\t\t**\t\t2、每行两个月输出\t**"<cout<<"\t\t**\t\t3、每行三个月输出\t**"<cout<<"\t\t*********************************************"<}//----------------------------------
voidCalendar:
:
initalize(intyear)//初始化a,b数组
{
if(judge(year))
b[1]=29;
if(!
judge(year))
b[1]=28;
inti1,j1;
i1=leapyear(year);
if(year>2012)
{
j1=year-2012;
j1=j1-i1;
a[0]=(6+366*i1+j1*365)%7;
}
if(year==2012)
a[0]=6;
if(year<2012)
{
j1=2012-year;
j1=j1-i1;
a[0]=6-(365*j1+366*i1)%7;
}
a[1]=(b[0]+a[0])%7;
a[2]=(b[1]+a[1])%7;
a[3]=(b[2]+a[2])%7;
a[4]=(b[3]+a[3])%7;
a[5]=(b[4]+a[4])%7;
a[6]=(b[5]+a[5])%7;
a[7]=(b[6]+a[6])%7;
a[8]=(b[7]+a[7])%7;
a[9]=(b[8]+a[8])%7;
a[10]=(b[9]+a[9])%7;
a[11]=(b[10]+a[10])%7;
}//----------------------------------
voidCalendar:
:
shiyong_cal()//实用日历
{
do
{
shiyong_cal_show();
cout<<"\t请选择操作:
";
inti;
while(cin>>i)
{
if(!
(i==1||i==2||i==3))
cout<<"输入有误,请重新输入:
";
else
break;
}
cout<<"\t请输入年分:
";
intyear;
while(cin>>year)
{
if(year<1||year>10000)
cout<<"输入年分有误,请重新输入:
";
else
break;
}
switch(i)
{
case1:
one_mon_ptint(year);break;
case2:
twe_mon_print(year);break;
case3:
thr_mon_print(year);
}
}while(if_continue());
}//----------------------------------
voidCalendar:
:
thr_mon_print(intyear)//三个月输出
{
initalize(year);
for(inti=0;i<12;i+=3)
{
cout<cout<<"一二三四五六日一二三四五六日一二三四五六日"<fmprint3(a[i],a[i+1],a[i+2],b[i],b[i+1],b[i+2]);
}
cout<}//----------------------------------
voidCalendar:
:
twe_mon_print(intyear)//两个月输出
{
initalize(year);
for(inti=0;i<12;i+=2)
{
cout<cout<<"一二三四五六日一二三四五六日"<fmprint2(a[i],a[i+1],b[i],b[i+1]);
}
cout<}//----------------------------------
voidCalendar:
:
one_mon_ptint(intyear)//一个月输出
{
initalize(year);
for(inti=0;i<12;i++)
{
cout<cout<<"一二三四五六日"<if(a[i]!
=0)
cout<<""<else
cout<<"";
intj;
for(j=1;j<=7-a[i];j++)
cout<for(intk=1;k<=5;k++)
{
cout<for(intl=1;l<=7;l++)
{
if(j>b[i])
cout<else
cout<}
}
}
}//----------------------------------
voidCalendar:
:
fmprint3(inta,intb,intc,intd,inte,intf)//三个月输出调用函数a,b,c为每个月空格数,d,e,f为月份天数
{
intk,i[3],j;
intg[3]={a,b,c};
for(j=0;j<3;j++)
{
if(g[j]!
=0)
cout<<""<else
cout<<"";
for(i[j]=1;i[j]<=7-g[j];i[j]++)
{
cout<}
}
for(intl=1;l<=5;l++)
{
cout<for(intj=0;j<3;j++)
{
cout<<"";
for(k=1;k<=7;k++)
{
if(j==0&&i[0]>d)
cout<elseif(j==1&&i[1]>e)
cout<elseif(j==2&&i[2]>f)
cout<else
cout<}
}
}
}//----------------------------------
voidCalendar:
:
fmprint2(inta,intb,intc,intd)//两个月输出调用函数
{
intk,i[2],j;
intg[2]={a,b};
for(j=0;j<2;j++)
{
if(g[j]!
=0)
cout<<""<else
cout<<"";
for(i[j]=1;i[j]<=7-g[j];i[j]++)
{
cout<}
}
for(intl=1;l<=5;l++)
{
cout<for(intj=0;j<2;j++)
{
cout<<"";
for(k=1;k<=7;k++)
{
if(j==0&&i[0]>c)
cout<elseif(j==1&&i[1]>d)
cout<else
cout<}
}
}
}//----------------------------------
intCalendar:
:
leapyear(intyear)//判断与2012之间的闰年数
{
if(year>=2012)
{
year=year-2012;
return(year/4-(year+12)/100+(year+12)/400+1);
}
else
{
year=2012-year;
return(year/4-(year-12)/100+(year-12)/400);
}
}//----------------------------------
voidCalendar:
:
count_data()//计算日期
{
do
{
inty1,y2,m1,m2,d1,d2;
cout<201268):
";
do
{
cin>>y1>>m1>>d1;
initalize(y1);
if(y1<1||y1>10000||m1<1||m1>12||d1<1||d1>b[m1-1])
cout<<"输入日期不在计算范围之内,请重新输入:
";
else
break;
}while
(1);
cout<201268):
";
do
{
cin>>y2>>m2>>d2;
initalize(y2);
if(y2<1||y2>10000||m2<1||m2>12||d2<1||d2>b[m2-1])
{cout<<"输入日期不在计算范围之内,请重新输入:
";continue;}
elseif(y1>y2||(y1==y2&&m1>m2)||(y1==y2&&m1==m2&&d1>d2))
cout<<"输入错误,终止日期应在开始日期之后,请重新输入:
";
else
break;
}while
(1);
inti1,i2,leap1,leap2,mon1=0,mon2=0;
y1--;
y2--;
leap1=y1/4-y1/100+y1+12/400;
leap2=y2/4-y2/100+y2+12/400;
for(inti=0;imon1+=b[i];
for(i=0;imon2+=b[i];
i1=(y1-leap1)*365+leap1*366+mon1+d1;
i2=(y2-leap2)*365+leap2*366+mon2+d2;
intx=0;
if(judge(y1+1)&&m1>2)
x=1;
cout<}while(if_continue());
}//----------------------------------
voidCalendar:
:
now_time_show()//显示当前时间
{
time_tnowtime;
nowtime=time(NULL);
structtm*t;
t=localtime(&nowtime);
cout<"<tm_year+1900<<"年"<tm_mon+1<<"月"<tm_mday<<"日"
<(2)<tm_hour<<":
"<(2)<tm_min<}//----------------------------------
voidCalendar:
:
day_info()//具体日期信息
{
do
{
inty,m,d;
cout<201268):
";
do
{
cin>>y>>m>>d;
initalize(y);
if(y<1||y>10000||m<1||m>12||d<1||d>b[m-1])
cout<<"输入日期有误,请重新输入:
";
else
break;
}while
(1);
cout<<"这一年:
"<if(judge(y))
cout<<"\t闰年"<<"";
else
cout<<"\t非闰年"<<"";
intk,j;
if(y>=2012)
{
k=(y-2012)%10;
j=(y-2012)%12;
}
else
{
k=10-(2012-y)%10;
if(k==10)
k=0;
j=12-(2012-y)%12;
if(j==12)
j