C++课程设计日历的实现.docx
- 文档编号:27169251
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:15
- 大小:46.36KB
C++课程设计日历的实现.docx
《C++课程设计日历的实现.docx》由会员分享,可在线阅读,更多相关《C++课程设计日历的实现.docx(15页珍藏版)》请在冰豆网上搜索。
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<<"这一天与今天相距的天数为: "< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 日历 实现