《编程珠玑第二版》第三章第4题
代码如下:
#include<iostream>
using namespace std;
int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
struct Date
{
intyear;
intmonth;
intday;
Date(int_year,int _month,int_day)
{
year=_year;
month=_month;
day=_day;
}
};
bool operator<(Datefirst,Date second)
{
if(first.year<second.year)
returntrue;
else if(first.year==second.year &&first.month<second.month)
return true;
else if(first.year==second.year &&first.month==second.month && first.day<second.day)
returntrue;
else
returnfalse;
}
bool isLeapYear(Date date)
{
if(date.year%4==0&& date.year%400!=0)
returntrue;
if(date.year%400==0)
returntrue;
return false;
}
int intervalOfDays(Date first,Date second)
{
if(second<first)
returnintervalOfDays(second,first);
intdays=0;
boolflag=0;
days+=month[first.month]-first.day;
if(first.month<=2&& isLeapYear(first))
{//如果first是闰年且恰好包含2月
days++;
flag=1;
}
if(second.month>2&& isLeapYear(second))
{//如果second是闰年且恰好包含2月
days++;
flag=1;
}
for(int i=first.month+1;i<=12;i++)
days+=month[i];
days+=second.day;
for(int i=1;i<second.month;i++)
days+=month[i];
intfirstyear=first.year+1;
while(firstyear<second.year)
{
if(isLeapYear(Date(firstyear,1,1)))
days+=366;
else
days+=365;
firstyear++;
}
if(first.year==second.year)//如果是同一年,则前面多算了一年,需要减去
days-=((isLeapYear(first)&& flag==1)?366:365);
returndays;
}
int weekday(Date date)
{
Date now(2014,10,7);
intweek=2;
intinterval=intervalOfDays(date,now);
if(date<now)
return(week-interval%7+7)%7;//返回值为0表示周日
else
return(week+interval%7)%7;//比now的日期大时,需要加上week
}
void calendar(Date date)
{
cout<<"日一二三四五六"<<endl;
intweek=weekday(Date(date.year,date.month,1));
for(int i=0;i<week;i++)
cout<<" ";
intdays;
if(isLeapYear(date)&& date.month==2)
days=29;
else
days=month[date.month];
for(int i=1;i<=days;i++,week++)
{
if(week%7==0&& week!=0)//如果这个月第一天是周日,则不需要再第一行处添加回车
cout<<endl;
if(i<10)
cout<<i<<" ";
else
cout<<i<<" ";
}
}
int main()
{
Date date(2013,9,1);
calendar(date);
system("pause");
return0;
}