微软的面试,没能参加啊,只好打听了下题目,其中一题是在20分钟内写出:计算两个日期之间天数的方法。昨天晚上想了一下,今天实现了一下,经过调试,差不多一个小时才弄好,惭愧啊
代码如下:
/********************************************************************
file name: CountDays
file ext: cpp
author: zoudh
created: 2012/04/18
purpose: 计算两个日期之间的天数
*********************************************************************/
#include <stdlib.h>
#include <string.h>
typedef struct _Date{
int year;
int month;
int day;
_Date(char* strDate);
}Date;
int CountDays(Date date1,Date date2);
int GetDaysFromThisYear(Date date);
int GetDaysToNextYear(Date date);
int GetDaysInYear(int year);
int GetDaysInMonth(int month,bool LeapYear);
bool IsLeapYear(int year);
_Date::_Date( char* strDate )
{
//初始化
year = 1;
month = 1;
day = 1;
const char* startpos=strDate;
const char* pos = startpos;
char buf[64];
//获取年份
memset(buf,0,64);
while( '-' != *pos && '\0' != *pos ) pos++;
memcpy_s(buf,64,startpos,pos-startpos);
year = atoi(buf);
startpos = ++pos;
//获取月份
memset(buf,0,64);
while( '-' != *pos && '\0' != *pos ) pos++;
memcpy_s(buf,64,startpos,pos-startpos);
month = atoi(buf);
startpos = ++pos;
//获取日期
memset(buf,0,64);
memcpy_s(buf,64,pos,strlen(pos));
day = atoi(buf);
}
int CountDays(Date date1,Date date2)
{
int iTotalDays = 0;
if( date1.year == date2.year)\
{
return GetDaysFromThisYear(date2) - GetDaysFromThisYear(date1) + 1;
}
iTotalDays = GetDaysToNextYear(date1);
iTotalDays += GetDaysFromThisYear(date2);
int year = date1.year + 1;
while(year < date2.year )
{
iTotalDays += GetDaysInYear(year);
}
return iTotalDays;
}
//计算从当年年初到当前日期的天数
int GetDaysFromThisYear( Date date )
{
bool bLeapYear = IsLeapYear(date.year);
int iTotalDays = date.day;
for( int month = 1; month < date.month ; month++)
{
iTotalDays += GetDaysInMonth(month,bLeapYear);
}
return iTotalDays;
}
//计算从当前日期到年底的天数
int GetDaysToNextYear( Date date )
{
bool bLeapYear = IsLeapYear(date.year);
//当月有多少天
int iDaysInMonth = GetDaysInMonth(date.month,bLeapYear);
//统计当月的天数
int iTotalDays = iDaysInMonth - date.day + 1;
for( int month = date.month + 1; month <= 12 ; month++)
{
iTotalDays += GetDaysInMonth(month,bLeapYear);
}
return iTotalDays;
}
//计算本年内的天数
int GetDaysInYear( int year )
{
bool bLeapYear = IsLeapYear(year);
if(bLeapYear)
return 366;
else
return 365;
}
//判断是否是闰年
bool IsLeapYear( int year )
{
if( year%100 == 0)
{
if( year%4 == 0)
return true;
else
return false;
}
else
{
if( year%4 == 0)
return true;
else
return false;
}
}
//获取一个月份中的天数
int GetDaysInMonth( int month,bool LeapYear )
{
switch (month)
{
case 1:
return 31;
case 2:
if(LeapYear)
return 29;
else
return 28;
case 3:
return 31;
case 4:
return 30;
case 5:
return 31;
case 6:
return 30;
case 7:
return 31;
case 8:
return 31;
case 9:
return 30;
case 10:
return 31;
case 11:
return 30;
case 12:
return 31;
default:
return 0;
}
}
int main()
{
char* szdate1 = "2011-3-1";
char* szdate2 = "2012-3-1";
Date date1(szdate1);
Date date2(szdate2);
int days = CountDays(date1,date2);
}