C++课程设计日历的实现.docx

上传人:b****3 文档编号:27169251 上传时间:2023-06-27 格式:DOCX 页数:15 大小:46.36KB
下载 相关 举报
C++课程设计日历的实现.docx_第1页
第1页 / 共15页
C++课程设计日历的实现.docx_第2页
第2页 / 共15页
C++课程设计日历的实现.docx_第3页
第3页 / 共15页
C++课程设计日历的实现.docx_第4页
第4页 / 共15页
C++课程设计日历的实现.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

C++课程设计日历的实现.docx

《C++课程设计日历的实现.docx》由会员分享,可在线阅读,更多相关《C++课程设计日历的实现.docx(15页珍藏版)》请在冰豆网上搜索。

C++课程设计日历的实现.docx

C++课程设计日历的实现

万年历的C++实现

1、课程设计目的

编写具有以下功能的C++程序:

(1)、输入一个年份,输出是在屏幕上显示该年的日历。

假定输入的年份在1940-2040年之间。

(2)、输入年月,输出该月的日历。

(3)、输入年月日,输出距今天还有多少天,星期几,是否是公历节日。

要求该程序能提供日历的一些基本功能,且方便管理和操作,易于扩充

2、需求分析

现在的软件市场的确有各种各样的日历软件可供我们选择,这些软件大多含有其他的一些的功能,真正方便快捷的日历软件却并不多,因此设计一个能真正服务大家的日历程序是有必要的。

3、设计思路

(1)、在屏幕上输出某一年的日历。

考虑到程序有三个主要功能模块,于是运用了类的相关知识,建立一个calendar.h的头文件。

由于程序提供1940年以后年份的服务,因此首先要确定1940年1月1号为星期几,然后以此为基准点确定该天以后的日历,对于功能

(1),需要推出一个算法,如下:

k的初值为2,

test=((year-1940)/4*5+((year-1940)%4==0?

0:

((year-1940)%4+1)))%7+2;

k=test%7==0?

7:

test%7;//k=0表示星期天,test为一中间变量,

用来确定1940年以后每一年的1月1号为星期几,这样更方便输出每一年的日历,而且在程序中的循环过程也大大提供程序运行的效率。

因为在日历里面,星期是连续不断地,七天一循环,所以在整个程序里面需要定义一个变量代表星期,更加方便月与月之间的联系,由于需要用到函数,所以又把该变量定义指针变量,这样更加方便操作,在后面的程序,有许多的变量都需要通过指针来达到更加高效的操作,具体见程序源代码。

(2)、输入年月,在屏幕上输出该月的日历。

同上面一样,为了要方便输出某一月份的日历,就要先确定该月的第一天为星期几,这样才比较方便,这样有需要一个算法,如下:

for(intm=1;m<*ymonth;m++)

for(intj=1;j<=(m!

=2?

month_numble[m-1]:

(*year%4==0?

29:

28));j++)

{

*k=*k%7;

*k+=1;

}

for(inth=1;h<*k;h++)

cout<<"\t";

以上算法是用在自定义函数里面,因此有些地方用到指针,而且在确定月份时,还要注意区别是否为闰年二月。

(3)、输入年月日,输出距今天还有多少天,星期几,是否是公历节日。

通过上面两个子程序就可以实现输入的这一天为星期几,至于是否为公历节日,只需事先录入一些公历节日的具体日期,然后再程序里通过if语句就可以实现。

输出距离今天有多少天,这就需要这就需要程序能够读取系统时间,因此要用到windows.h头文件,而且这同样需要一个算法,如下:

intyear_num,ymonth_num=0,day_num=0,tyear_num,tmonth_num=0,tday_num=0,fomer_num,today_num;

year_num=(*year-1940)/4*(366+365*3)+((*year-1940)%4==0?

0:

((*year-1940)%4*365+1));

for(inti=0;i<*month1-1;i++)

for(intj=1;j<=(i!

=1?

month_numble[i]:

(*year%4==0?

29:

28));j++)

ymonth_num+=1;

for(inti=1;i<*day1;i++)

day_num+=1;

fomer_num=year_num+ymonth_num+day_num;//从1940年1月1号到这一天的天数

tyear_num=(sys.wYear-1940)/4*(366+365*3)+((sys.wYear-1940)%4==0?

0:

((sys.wYear-1940)%4*365+1));

for(inti=0;i

for(intj=1;j<=(i!

=1?

month_numble[i]:

(sys.wYear%4==0?

29:

28));j++)

tmonth_num+=1;

for(inti=1;i

tday_num+=1;

today_num=tyear_num+tmonth_num+tday_num;//从1940年1月1号到今天的天数

(具体请见程序源代码)。

在源里面为了满足功能模块的需要,选择了switch—case语句,并且采用可库函数exit(0),退出程序,是的程序更加方便操作。

为了使程序在错误输入时不会崩溃,因此在功能模块选择时采用了ASCII码。

 

4、运行流程

进入程序

 

5、程序源代码

Calendar.h

#include"iostream"

#include"windows.h"//获取系统时间

#include"string"

voidyear();

voidymonth();

voidday();

万年历.cpp

#include"calendar.h"

usingnamespacestd;

voidmain()

{

charmenu_choose();

while

(1)

{

intchoice=menu_choose()-48;

switch(choice)

{

case1:

year();break;

case2:

ymonth();break;

case3:

day();break;

case4:

exit(0);//退出程序

}

}

}

charmenu_choose()

{

charchoice;

cout<<"1.输出该年日历\n";

cout<<"2.输出该年该月的日历\n";

cout<<"3.输出距离今天还有多少天,为星期几,是否为公历节日\n";

cout<<"4.退出程序\n";

cout<<"请选择功能模块,选择数字1——4:

";

while

(1)

{

cin>>choice;

if((choice+0)>=49&&(choice+0)<=52)

break;

else

cout<<"输入的数字有误,请重新输入1——4:

";

}

returnchoice;

}

Year.cpp

#include"calendar.h"

//#include

usingnamespacestd;

voidyue(inti,int*k,int*month_numble,int*year);

voidyear()

{

intyear;

while

(1)

{

cout<<"请输入要查看的年份:

";

cin>>year;

if(year>=1940)

{

intmonth_numble[12]={31,29,31,30,31,30,31,31,30,31,30,31};

intmonth=1,k=2,test;

//k=2表示对应的天为星期一,1940年1月1号为星期一,以这一天为基准确定之后的日历

test=((year-1940)/4*5+((year-1940)%4==0?

0:

((year-1940)%4+1)))%7+2;

k=test%7==0?

7:

test%7;//确定每年的第一天为星期几

for(inti=0;i<12;i++)

{

switch(month+i)

{

case1:

yue(i,&k,month_numble,&year);break;

case2:

yue(i,&k,month_numble,&year);break;

case3:

yue(i,&k,month_numble,&year);break;

case4:

yue(i,&k,month_numble,&year);break;

case5:

yue(i,&k,month_numble,&year);break;

case6:

yue(i,&k,month_numble,&year);break;

case7:

yue(i,&k,month_numble,&year);break;

case8:

yue(i,&k,month_numble,&year);break;

case9:

yue(i,&k,month_numble,&year);break;

case10:

yue(i,&k,month_numble,&year);break;

case11:

yue(i,&k,month_numble,&year);break;

case12:

yue(i,&k,month_numble,&year);break;

}

}break;

}

else

cout<<"输入的年份不在范围之内,请输入1940及以后的年份。

"<

}

}

voidyue(inti,int*k,int*month_numble,int*year)//函数实现输出每月的日历

{

cout<<"======================="<

cout<<"日"<<"\t"<<"一"<<"\t"<<"二"<<"\t"<<"三"<<"\t"<<"四"<<"\t"<<"五"<<"\t"<<"六"<

for(inth=1;h<*k;h++)

cout<<"\t";//控制每月1号从对应的星期几开始输出

for(intj=1;j<=(i!

=1?

month_numble[i]:

(*year%4==0?

29:

28));j++)//区分平年和闰年

{

if(j%7!

=(8-*k)%7)

cout<

else

cout<

}

for(intj=1;j<=(i!

=1?

month_numble[i]:

(*year%4==0?

29:

28));j++)

{

*k=*k%7;

*k+=1;

}

cout<

}

Ymonth.cpp

#include"calendar.h"

voidyue1(int*k,int*month_numble,int*year,int*ymonth);

usingnamespacestd;

voidymonth()

{

intyear,ymonth,k=2,test;

while

(1)

{

cout<<"请输入要查看的年份:

";

cin>>year;

if(year>=1940)

{

intmonth_numble[12]={31,29,31,30,31,30,31,31,30,31,30,31};

//k=2表示对应的天为星期一,1940年1月1号为星期一,以这一天为基准确定之后的日历

test=((year-1940)/4*5+((year-1940)%4==0?

0:

((year-1940)%4+1)))%7+2;

k=test%7==0?

7:

test%7;//确定每年的第一天为星期几

while

(1)

{

cout<<"请输入要查看的月份:

";

cin>>ymonth;

if(ymonth>=1&&ymonth<=12)

{

yue1(&k,month_numble,&year,&ymonth);break;

}

else

cout<<"输入的月份不在范围之内,请输入正确的月份。

"<

}break;

}

else

cout<<"输入的年份不在范围之内,请输入1940及以后的年份。

"<

}

}

voidyue1(int*k,int*month_numble,int*year,int*ymonth)//函数实现输出每月的日历

{

cout<<"======================="<<*ymonth<<"月======================="<

cout<<"日"<<"\t"<<"一"<<"\t"<<"二"<<"\t"<<"三"<<"\t"<<"四"<<"\t"<<"五"<<"\t"<<"六"<

for(intm=1;m<*ymonth;m++)

for(intj=1;j<=(m!

=2?

month_numble[m-1]:

(*year%4==0?

29:

28));j++)

{

*k=*k%7;

*k+=1;

}

for(inth=1;h<*k;h++)

cout<<"\t";//控制每月1号从对应的星期几开始输出

for(intj=1;j<=month_numble[*ymonth-1];j++)//区分平年和闰年

{

if(j%7!

=(8-*k)%7)

cout<

else

cout<

}

cout<

}

Day.cpp

#include"calendar.h"

voidday2(int*k,int*month_numble,int*year,int*month1,int*day1);

usingnamespacestd;

voidday()

{

intyear,month1,day1;

intmonth_numble[12]={31,29,31,30,31,30,31,31,30,31,30,31};

intmonth=1,k=2,test;

while

(1)

{

cout<<"请输入要查看的年份:

";

cin>>year;

//k=2表示对应的天为星期一,1940年1月1号为星期一,以这一天为基准确定之后的日历

test=((year-1940)/4*5+((year-1940)%4==0?

0:

((year-1940)%4+1)))%7+2;

k=test%7==0?

7:

test%7;//确定每年的第一天为星期几

if(year>=1940)

{

while

(1)

{

cout<<"请输入要查看的月份:

";

cin>>month1;

if(month1>=1&&month1<=12)

{

while

(1)

{

cout<<"请输入要查看的天数:

";

cin>>day1;

if(day1>=1&&day1<=(month1!

=2?

month_numble[month1-1]:

(year%4==0?

29:

28)))

{

day2(&k,month_numble,&year,&month1,&day1);break;

}

else

cout<<"输入的天数不在范围之内,请输入正确的天数:

"<

}break;

}

else

cout<<"输入的月份不在范围之内,请输入正确的月份:

"<

}break;

}

else

cout<<"输入的年份不在范围之内,请输入1940及以后的年份:

"<

}

}

voidday2(int*k,int*month_numble,int*year,int*month1,int*day1)

{

for(intm=1;m<*month1;m++)

for(intj=1;j<=(m!

=2?

month_numble[m-1]:

(*year%4==0?

29:

28));j++)

{

*k=*k%7;

*k+=1;

}

for(intj=2;j<=*day1;j++)

{

*k=*k%7;

*k+=1;

}

cout<<"这一天为星期";//输出这一天为星期几

switch(*k-1)

{

case0:

cout<<"天"<

case1:

cout<<"一"<

case2:

cout<<"二"<

case3:

cout<<"三"<

case4:

cout<<"四"<

case5:

cout<<"五"<

case6:

cout<<"六"<

}

if(*month1==1&&*day1==1)

cout<<"这一天为元旦"<

if(*month1==4&&*day1==4)

cout<<"这一天为清明节"<

if(*month1==5&&*day1==1)

cout<<"这一天五一国际劳动节"<

if(*month1==6&&*day1==1)

cout<<"这一天为儿童节"<

if(*month1==10&&*day1==1)

cout<<"这一天为国庆节"<

if(*month1==12&&*day1==25)

cout<<"这一天为圣诞节"<

SYSTEMTIMEsys;

GetLocalTime(&sys);//获取系统时间

intyear_num,ymonth_num=0,day_num=0,tyear_num,tmonth_num=0,tday_num=0,fomer_num,today_num;

year_num=(*year-1940)/4*(366+365*3)+((*year-1940)%4==0?

0:

((*year-1940)%4*365+1));

for(inti=0;i<*month1-1;i++)

for(intj=1;j<=(i!

=1?

month_numble[i]:

(*year%4==0?

29:

28));j++)

ymonth_num+=1;

for(inti=1;i<*day1;i++)

day_num+=1;

fomer_num=year_num+ymonth_num+day_num;//从1940年1月1号到这一天的天数

tyear_num=(sys.wYear-1940)/4*(366+365*3)+((sys.wYear-1940)%4==0?

0:

((sys.wYear-1940)%4*365+1));

for(inti=0;i

for(intj=1;j<=(i!

=1?

month_numble[i]:

(sys.wYear%4==0?

29:

28));j++)

tmonth_num+=1;

for(inti=1;i

tday_num+=1;

today_num=tyear_num+tmonth_num+tday_num;//从1940年1月1号到今天的天数

cout<<"这一天与今天相距的天数为:

"<

}

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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