C++课程设计日历的实现.docx
《C++课程设计日历的实现.docx》由会员分享,可在线阅读,更多相关《C++课程设计日历的实现.docx(15页珍藏版)》请在冰豆网上搜索。
![C++课程设计日历的实现.docx](https://file1.bdocx.com/fileroot1/2023-6/27/638c2078-d224-4e84-84a7-65f93d34bb92/638c2078-d224-4e84-84a7-65f93d34bb921.gif)
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;ifor(intj=1;j<=(i!
=1?
month_numble[i]:
(sys.wYear%4==0?
29:
28));j++)
tmonth_num+=1;
for(inti=1;itday_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;ifor(intj=1;j<=(i!
=1?
month_numble[i]:
(sys.wYear%4==0?
29:
28));j++)
tmonth_num+=1;
for(inti=1;itday_num+=1;
today_num=tyear_num+tmonth_num+tday_num;//从1940年1月1号到今天的天数
cout<<"这一天与今天相距的天数为:
"<}