您好,欢迎访问三七文档
C++实现控制台日历/*思路是1800年1月1日是星期三当然你也可以自己定义某一天为起始日期然后求从某一天到1800.1.1的天数然后与7求余就是星期数*/#includeiostream#includeiomanipusingnamespacestd;classCalen{private:intSpaceSize;//输出长度setw()大小boolIsLeapYear(intyear){//判断是否是闰年return((0==year%4&&0!=year%100)||(0==year%400));}intGetMonthDayNumber(intyear,intmonth){//返回某一年某一月天数intdaynumber;if(2==month){//二月单独处理if(IsLeapYear(year))daynumber=29;elsedaynumber=28;}else{if((month8&&1==month%2)||(month=8&&0==month%2))//八月前奇数月为31天八月后偶数为31天daynumber=31;if((month8&&0==month%2)||(month=8&&1==month%2))//八月前偶数月30天八月后奇数月30天daynumber=30;}returndaynumber;}public:intNowToDay(intyear,intmonth,intday);//从某一天到1800年1月1日有多少天boolInputDayIsTrue(intyear,intmonth,intday);//判断输入的日期是否合法intFindDayWeekend(intyear,intmonth,intday);//查找某一天是星期几intDisplayMonth(intyear,intmonth);//显示某一年的某一月的日历intDisplayYear(intyear);//显示某一年的日历};intmain(){Calencalener;intyear,month,day;cout输入某一天输出当是星期几格式\年月日\endl;cinyearmonthday;if(true==calener.InputDayIsTrue(year,month,day)){calener.FindDayWeekend(year,month,day);}else{coutTheInputDayIsErrorendl;}cout输入某一年输入出某一年的日历endl;cinyear;if(true==calener.InputDayIsTrue(year,1,1)){calener.DisplayYear(year);}else{coutTheInputDayIsErrorendl;}cout输入某一年的某一月打印该月的日历endl;cinyearmonth;if(true==calener.InputDayIsTrue(year,month,1)){calener.DisplayMonth(year,month);}else{coutTheInputDayIsErrorendl;}return0;}intCalen::NowToDay(intyear,intmonth,intday){intDiDay,i;for(i=1800,DiDay=0;iyear;i++)//闰年单独+366天if(IsLeapYear(i))DiDay+=366;elseDiDay+=365;for(i=1;imonth;i++)DiDay+=GetMonthDayNumber(year,i);DiDay+=day-1;returnDiDay;}boolCalen::InputDayIsTrue(intyear,intmonth,intday){intTureDayNumber;if(year1800||month13||day31){//如果输入的日期小于1800年大于13月大于31天返回假returnfalse;}else{TureDayNumber=GetMonthDayNumber(year,month);//如果输入的day比该月的实际day大返回错误if(dayTureDayNumber)returnfalse;}returntrue;}intCalen::DisplayMonth(intyear,intmonth){intExcur,i,TotalDay;SpaceSize=4;Excur=(NowToDay(year,month,1)+3)%7;//首先计算这个月的1日是星期几然后在这个基础上自加天数coutyear年month月endl;coutsetw(SpaceSize)日setw(SpaceSize)一setw(SpaceSize)二;coutsetw(SpaceSize)三setw(SpaceSize)四setw(SpaceSize)五;coutsetw(SpaceSize)六endl;for(i=1;i=Excur;i++)coutsetw(SpaceSize);//首先输出多余的空格TotalDay=GetMonthDayNumber(year,month);for(i=1;i=TotalDay;i++){//然后自加,当然长度大于七的时候换行coutsetw(SpaceSize)i;if(0==(i+Excur)%7)//换行条件coutendl;}coutendl;return0;}intCalen::FindDayWeekend(intyear,intmonth,intday){//查找某一天是星期几intTotalDay;charWeekend[7][3]={{日},{一},{二},{三},{四},{五},{六}};TotalDay=NowToDay(year,month,day);coutyear年month月day日是星期Weekend[(TotalDay+3)%7]endl;return0;}intCalen::DisplayYear(intyear){inti,j,k,n,month1,month2,month3;//按照一个季度输出日历month1month2month3是该月应该有天数intExcur1,Excur2,Excur3;//i,j,k分别表示三个月的天数值Excur1,Excur2,Excur3表示偏移量intsea;charMonths[12][10]={{一月},{二月},{三月},{四月},{五月},{六月},{七月},{八月},{九月},{十月},{十一月},{十二月}};SpaceSize=3;coutyear年endl;for(sea=1;sea=12;sea+=3){//分四个季度显示Excur1=(NowToDay(year,sea,1)+3)%7;//分别计算3个月的偏移量Excur2=(NowToDay(year,sea+1,1)+3)%7;Excur3=(NowToDay(year,sea+2,1)+3)%7;month1=GetMonthDayNumber(year,sea);//分别计算3个月的天数month2=GetMonthDayNumber(year,sea+1);month3=GetMonthDayNumber(year,sea+2);//显示三个月的星期coutMonths[sea-1]setw(21)Months[sea]setw(20)Months[sea+1]endl;coutsetw(SpaceSize)日setw(SpaceSize)一setw(SpaceSize)二;coutsetw(SpaceSize)三setw(SpaceSize)四setw(SpaceSize)五;coutsetw(SpaceSize)六setw(SpaceSize);coutsetw(SpaceSize)日setw(SpaceSize)一setw(SpaceSize)二;coutsetw(SpaceSize)三setw(SpaceSize)四setw(SpaceSize)五;coutsetw(SpaceSize)六setw(SpaceSize);coutsetw(SpaceSize)日setw(SpaceSize)一setw(SpaceSize)二;coutsetw(SpaceSize)三setw(SpaceSize)四setw(SpaceSize)五;coutsetw(SpaceSize)六endl;for(n=1;n=Excur1;n++)//第一行单独处理首先输出多余的空格然后在输出天数coutsetw(SpaceSize);//i,j,k单独保存当前的日期for(n;n=7;n++)coutsetw(SpaceSize)n-Excur1;coutsetw(SpaceSize);i=n-Excur1;for(n=1;n=Excur2;n++)coutsetw(SpaceSize);for(n;n=7;n++)coutsetw(SpaceSize)n-Excur2;coutsetw(SpaceSize);j=n-Excur2;for(n=1;n=Excur3;n++)coutsetw(SpaceSize);for(n;n=7;n++)coutsetw(SpaceSize)n-Excur3;coutendl;k=n-Excur3;while(i=month1||j=month2||k=month3){//当三个月的日期都大于应有的天数后循环结束for(n=i;in+7;i++)//接下来的7天输出一次。但是大于天数的部分输出空格if(i=month1)coutsetw(SpaceSize)i;elsecoutsetw(SpaceSize);coutsetw(SpaceSize);for(n=j;jn+7;j++)if(j=month2)coutsetw(SpaceSize)j;elsecoutsetw(SpaceSize);coutsetw(SpaceSize);for(n=k;kn+7;k++)if(k=month3)coutsetw(SpaceSize)k;elsecoutsetw(SpaceSize);coutendl;}coutendl;}coutendl;return0;}
本文标题:C++ 日历
链接地址:https://www.777doc.com/doc-4194939 .html