为什么先dtmp-=366;后面再加回来,最好能详细注释下,谢谢啦
Date Date::operator+(int dtmp){
int yy=year,mm=month,dd=day,ytmp,mtmp,m2;
bool flag;
while(dtmp>=0){
if(isLeapYear(yy)){
dtmp-=366;
flag=true;
}
else {
dtmp-=365;
flag=false;
}
yy++;
}
if(flag)
dtmp+=366;
else dtmp+=365;
yy–;
if(isLeapYear(yy)){
m2=29;
}
else {
m2=28;
}
mtmp=dtmp+dd;
int m_day[]={0,31,m2,31,30,31,30,31,31,30,31,30,31};
for(;mtmp>m_day[mm];){
mtmp-=m_day[mm];
if(mm==12){
mm=0;
yy++;
}
mm++;
}
dd=mtmp;
Date dt(yy,mm,dd);
return dt;
}
Date Date::operator+(int dtmp){
int yy=year,mm=month,dd=day,ytmp,mtmp,m2;
bool flag;
while(dtmp>=0){
if(isLeapYear(yy)){
dtmp-=366;
flag=true;
}
else {
dtmp-=365;
flag=false;
}
yy++;
}
if(flag)
dtmp+=366;
else dtmp+=365;
yy–;
if(isLeapYear(yy)){
m2=29;
}
else {
m2=28;
}
mtmp=dtmp+dd;
int m_day[]={0,31,m2,31,30,31,30,31,31,30,31,30,31};
for(;mtmp>m_day[mm];){
mtmp-=m_day[mm];
if(mm==12){
mm=0;
yy++;
}
mm++;
}
dd=mtmp;
Date dt(yy,mm,dd);
return dt;
}
解决方案
10
代码功能归根结底不是别人帮本人看或讲解或注释出来的;而是被本人静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
5
isLeapYear 返回能否闰年,闰年一年366天,二月29天
5
仅供参考:
#include <afxdisp.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, TCHAR* argv[]) {
COleDateTime t;
COleDateTimeSpan ts;
CString s,fmt;
int nYear;
int nMonth;
int nDay;
int nHour;
int nMin;
int nSec;
int lDays;
int nHours;
int nMins;
int nSecs;
int i,N;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
printf("Fatal Error: MFC initialization failed\n");
return 1;
}
if (argc<13) {
printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);
return 2;
}
if (stricmp(argv[12],"SQL")==0) fmt="%Y-%m-%d %H:%M:%S";
else if (stricmp(argv[12],"YYYY")==0) fmt="%Y%m%d %H%M%S";
else if (stricmp(argv[12],"YY")==0) fmt="%y%m%d %H%M%S";
else {
printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);
return 3;
}
nYear =atoi(argv[ 1]);
nMonth=atoi(argv[ 2]);
nDay =atoi(argv[ 3]);
nHour =atoi(argv[ 4]);
nMin =atoi(argv[ 5]);
nSec =atoi(argv[ 6]);
lDays =atoi(argv[ 7]);
nHours=atoi(argv[ 8]);
nMins =atoi(argv[ 9]);
nSecs =atoi(argv[10]);
N =atoi(argv[11]);
if (N<=0) {
printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);
return 4;
}
t=COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec);
ts=COleDateTimeSpan( lDays, nHours, nMins, nSecs );
for (i=1;i<=N;i++) {
s=t.Format(fmt);
printf("%08d %s\n",i,s);
t=t+ts;
}
return 0;
}
5
闰年、闰月、2月的天数