万年历的设计.docx
- 文档编号:9644844
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:29
- 大小:132.56KB
万年历的设计.docx
《万年历的设计.docx》由会员分享,可在线阅读,更多相关《万年历的设计.docx(29页珍藏版)》请在冰豆网上搜索。
万年历的设计
万年历的设计
一.系统概要
定义了包含实现系统功能的函数的类——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.调用头文件
使用
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;i mon1+=b[i]; for(i=0;i mon2+=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< "< < (2)< "< (2)< }//---------------------------------- 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历 设计