日期问题函数(编程珠玑第三章)

《编程珠玑第二版》第三章第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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值