研究半天不知道哪里错了,求指点

时间:2022-11-24 14:43:43
long Date::operator-(Date d2){
long days1=0;
long days2=0;
int m,y;
Date d1=*this;
if(d1.year>d2.year){
swap(d1,d2);
}
else if(d1.year==d2.year){
        if(d1.month>d2.month){
swap(d1,d2);
}
else if(d1.month==d2.month){
if(d1.day>d2.day){
swap(d1,d2);
}
}
}
if(IsLeapYear(d1.year)){
for(m=1;m<d1.month;m++){
days1+=Month[1][m];
}
}
else{
for(m=1;m<d1.month;m++){
days1+=Month[0][m];
}
}
days1+=d1.day-1;
for(year=d1.year;y<d2.year;y++){
if(IsLeapYear(y))
days2+=366;
else
days2+=365;
}
if(IsLeapYear(d2.year)){
for(m=1;m<d2.month;m++)
days2+=Month[1][m];
}
else{
for(m=1;m<d2.month;m++)
days2+=Month[0][m];
}
days2+=d2.day-1;
return days2-days1;
}//计算两个日期相差的天数

这是实现重载运算符—的Date类里的成员函数,用来算两个日期间的天数days, days=end-begin;end,begin均为Date对象,结果一直不正确,挺大的,不知道咋回事,求指点

6 个解决方案

#1


设置断点调试一下 
看哪里的值不符合预期

#2


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#3


仅供参考:
#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;
}

#4


有timespan这样的计算日期差的函数为啥 还要自己造*。
你写的代码乱不说而且一看就是有问题,没考虑闺年什么的。
还有一种方法就是你把日期时间都转成时间戳,秒数,
再相减转成天。比你自己计算要靠谱得多

#5


static int MonthElaps[13] = {0,0,31,59,90,120,151,181,212,242,273,303,334};

int nMonthElaps1 = (date1.year%4==0 && date1.month > 2) ? MonthElaps[date1.month]+1 : MonthElaps[date1.month];

long d1 = date1.year*365 + date1.year/4 + nMonthElaps1 + date1.day;

int nMonthElaps2 = (date2.year%4==0  && date2.month > 2) ? MonthElaps[date2.month]+1 : MonthElaps[date2.month];

long d2 = date2.year*365 + date2.year/4 + nMonthElaps2 + date2.day;

int nDiff = abs(d1-d2);

#6


谢谢,我是一个初学者,之前还不会用断点调试,只会盲目找错,效率极低。真的是非常感谢,我已经找出了错误

#1


设置断点调试一下 
看哪里的值不符合预期

#2


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#3


仅供参考:
#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;
}

#4


有timespan这样的计算日期差的函数为啥 还要自己造*。
你写的代码乱不说而且一看就是有问题,没考虑闺年什么的。
还有一种方法就是你把日期时间都转成时间戳,秒数,
再相减转成天。比你自己计算要靠谱得多

#5


static int MonthElaps[13] = {0,0,31,59,90,120,151,181,212,242,273,303,334};

int nMonthElaps1 = (date1.year%4==0 && date1.month > 2) ? MonthElaps[date1.month]+1 : MonthElaps[date1.month];

long d1 = date1.year*365 + date1.year/4 + nMonthElaps1 + date1.day;

int nMonthElaps2 = (date2.year%4==0  && date2.month > 2) ? MonthElaps[date2.month]+1 : MonthElaps[date2.month];

long d2 = date2.year*365 + date2.year/4 + nMonthElaps2 + date2.day;

int nDiff = abs(d1-d2);

#6


谢谢,我是一个初学者,之前还不会用断点调试,只会盲目找错,效率极低。真的是非常感谢,我已经找出了错误