用C++计算包括闰年在内的日期总数?
时间:2009-05-27
来源:互联网
{
if(mo < 1 || mo > 12 || yr<1)
{
ndays = 0; //invalid month or year or null date
return;
}
//Compute days thru last year
ndays = (yr-1)*365+(yr-1)/4-(yr-1)/1000;
for(int i = 0;i < mo;i++)
{
int dy = dys[i];
if(i == 1&&IsLeapYear(yr))
dy++;
if(i<mo-1)
ndays += dy;
else if(da > dy)
{
ndays = 0;
return;
}
}
ndays += da; //add in this month's days.
}
看不懂上面的ndays = (yr-1)*365+(yr-1)/4-(yr-1)/1000;这一句,闰年的计算是这样子的吗?
作者: zhce818 发布时间: 2009-05-27
作者: aaaa3105563 发布时间: 2009-05-27
好像是算一个总的天数
作者: coverallwangp 发布时间: 2009-05-27
作者: zhce818 发布时间: 2009-05-27
作者: zhce818 发布时间: 2009-05-27
ndays = (yr-1)*365+(yr-1)/4-(yr-1)/1000;看定义ndays应该是天数的计算,但是至于公式的具体意思,还是希望能知道你这里的yr在哪里定义的,是什么意思才好知道
作者: padiu01 发布时间: 2009-05-27
////////////////////////////////
//File Name:Data.h
////////////////////////////////
#ifndef DATA_H
#define DATA_H
class Date
{
protected:
static const int dys[];
long int ndays;
public:
Date(int mo = 0,int da = 0,int yr = 0)
{SetDate(mo,da,yr);}
Date(const Date& dt)
{*this = dt;}
//destructor.
virtual ~Date(){}
//overloaded assignment operator.
Date& operator=(const Date& dt)
{ndays = dt.ndays;return *this;}
//overloaded arithmetic operator.
Date& operator+(int n)const
{Date dt(*this);dt += n;return dt;}
Date& operator-(int n)const
{Date dt(*this);dt -= n;return dt;}
Date& operator+=(int n)
{ndays += n;return *this;}
Date& operator-=(int n)
{ndays -= n;return *this;}
Date& operator++() //prefix
{++ndays;return *this;}
Date& operator++(int) //postfix
{Date dt(*this);dt.ndays++;return dt;}
Date& operator--() //prefix
{--ndays;return *this;}
Date& operator--(int) //postfix
{Date dt(*this);dt.ndays--;return dt;}
long int operator-(const Date& dt)const
{return ndays-dt.ndays;}
//---overloaded relational operators
bool operator==(const Date& dt)const
{return ndays == dt.ndays;}
bool operator!=(const Date& dt)const
{return ndays != dt.ndays;}
bool operator<(const Date& dt)const
{return ndays < dt.ndays;}
bool operator>(const Date& dt)const
{return ndays > dt.ndays;}
bool operator<=(const Date& dt)const
{return ndays <= dt.ndays;}
bool operator>=(const Date& dt)const
{return ndays >= dt.ndays;}
//getter and setter functions.
void SetDate(int mo,int da,int yr);
void SetMonth(int mo)
{*this = Date(mo,GetDay(),GetYear());}
void SetDay(int da)
{*this = Date(GetMonth(),da,GetYear());}
void SetYear(int yr)
{*this = Date(GetMonth(),GetDay(),yr);}
void GetDate(int& mo,int& da,int& yr)const;
int GetMonth()const;
int GetDay()const;
int GetYear()const;
//display method
virtual void Display()const;
//Test for leap year.
bool IsLeapYear(int yr)const
{return ((yr%4)==0 && (yr%1000)!=0);}
bool IsLeapYear()const
{return IsLeapYear(GetYear());}
};
//Overloaded(int + Date)
inline Date operator+(int n,const Date& dt)
{
return dt + n;
}
#endif
上面是Date.h
///////////////////////////////
//File Name:Date.cpp
///////////////////////////////
#include <iostream>
#include "Date.h"
const int Date::dys[]={31,28,31,30,31,30,31,31,30,31,30,31};
//////////////////////////////////////////
//The SetDate() function implentation.
//////////////////////////////////////////
void Date::SetDate(int mo,int da,int yr)
{
if(mo < 1 || mo > 12 || yr<1)
{
ndays = 0; //invalid month or year or null date
return;
}
//Compute days thru last year
ndays = (yr-1)*365+(yr-1)/4-(yr-1)/1000;
for(int i = 0;i < mo;i++)
{
int dy = dys[i];
if(i == 1&&IsLeapYear(yr))
dy++;
if(i<mo-1)
ndays += dy;
else if(da > dy)
{
ndays = 0;
return;
}
}
ndays += da; //add in this month's days.
}
///////////////////////////////////////////////
//The GetDate()function implementation.
///////////////////////////////////////////////
void Date::GetDate(int& mo,int& da,int& yr)const
{
da = ndays;
if(ndays == 0)
{
yr = mo = 0;
return;
}
for(yr = 1;;yr++)
{
int daysthisyear = IsLeapYear(yr)?366:365;
if(da <= daysthisyear)
break;
da -= daysthisyear;
}
for(mo = 1;mo<13;mo++)
{
int dy = dys[mo-1];
if(mo == 2&&IsLeapYear(yr))
dy++; //make Feb's days 29 if leap year
if(da <= dy)
break;
da -= dy;
}
}
////////////////////////////////
//The GetMonth()function implementation.
////////////////////////////////
int Date::GetMonth()const
{
int mo,da,yr;
GetDate(mo,da,yr);
return mo;
}
///////////////////////////////
//The GetDay()function implementation.
///////////////////////////////
int Date::GetDay()const
{
int mo,da,yr;
GetDate(mo,da,yr);
return da;
}
///////////////////////////////
//The GetYear()function implementation.
///////////////////////////////
int Date::GetYear()const
{
int mo,da,yr;
GetDate(mo,da,yr);
return yr;
}
///////////////////////////////
//The Display()function implementation.
///////////////////////////////
void Date::Display()const
{
int mo,da,yr;
GetDate(mo,da,yr);
std::cout<<mo<<'/'<<da<<'/'<<yr;
}
上面是Date.cpp
////////////////////////////////
//file Name:DateMain()function
////////////////////////////////
#include <iostream>
#include "SpecialDate.h"
///////////////////////////////////
//The main()function.
///////////////////////////////////
int main()
{
for(;;)
{
std::cout<<"Enter dd mm yyyy(0 0 0 to quit):";
int da,mo,yr;
std::cin>>da>>mo>>yr;
if(da == 0)
break;
SpecialDate dt(da,mo,yr);
if(dt.IsNullDate())
std::cout<<"Try again";
else
dt.Display();
std::cout<<std::endl;
}
system("pause");
return 0;
/* SpecialDate dt(29,2,1996);
dt.Display();
std::cout<<std::endl;
dt.Date::Display();
std::cout<<std::endl;
system("pause");
return 0;×/
}
mian()函数
作者: zhce818 发布时间: 2009-05-27
这句话是怎么计算出上一年的天数?为什么要用+(yr-1)/4-(yr-1)/1000,其代表什么意思?
作者: freefly123 发布时间: 2011-12-02
作者: freefly123 发布时间: 2011-12-02
每4年一闰:
[365+365+365+(365+1)]/4=365.25
每100年少一闰:
(365*76+366*24)/100=365.24
每400年多一闰:
(365*303+366*97)/400=365.2425
作者: zhao4zhong1 发布时间: 2011-12-02
作者: zhao4zhong1 发布时间: 2011-12-02
我也见过这题...请问你看的啥书??
作者: kama225 发布时间: 2011-12-02
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28