这个程序为什么到了这个函数就不能输出了

时间:2022-09-29 13:56:34
 

Date.h
#ifndef DATE_H_
#define DATE_H_

#include <iostream>
class Date
{
private:
int year,month,day;
static int DaysofMonth[13];
static int DaysofEvery4Year[4];
public:
Date(){}
Date(int y,int m,int d):year(y),month(m),day(d)
{}

void InputDate();
bool IsLeapYear()const;
void LeapYearEnable()const;
int DateGoThough(Date d);
int Datedays(Date a,Date b);
Date Datebefore(int n,Date da);
Date Dateafter(int n,Date da);

Date& operator=(const Date& rhs);
friend std::ostream &operator<<(std::ostream &os,const Date& d);
};
#endif



Date.cpp
#include "Date.h"

int Date::DaysofEvery4Year[4]={366,365,365,365};
int Date::DaysofMonth[13]={0,31,30,31,30,31,30,31,31,30,31,30,31};
void Date::InputDate()
{
int y,m,d;
std::cout<<"Please input year:\n";
std::cin>>y;year=y;
std::cout<<"Please input month:\n";
std::cin>>m;month=m;
std::cout<<"Please input day:\n";
std::cin>>d;day=d;
}
bool Date::IsLeapYear()const
{
return (year%4==0&&year%100!=0)||(year%400==0);
}
void Date::LeapYearEnable()const
{
if (IsLeapYear())
DaysofMonth[2]=29;
else
DaysofMonth[2]=28;
}
int Date::DateGoThough(Date d)
{
LeapYearEnable();
int n=0;
n+=d.day;
--d.month;
while (d.month>=1)
{
n+=DaysofMonth[d.month];
--d.month;
}
return n;
}

Date Date::Datebefore(int n,Date da)
{
Date d;
n=da.DateGoThough(da)-n;
if (n>0)
{
int y=0;
while (n>=DaysofEvery4Year[y%4])
{
n-=DaysofEvery4Year[y%4];
++y;
if (n==DaysofEvery4Year[y%4])
break;
}

d.year=da.year+y;
d.LeapYearEnable();
int m=1;
while (n>=DaysofMonth[m])
{
n-=DaysofMonth[m];
++m;
if (n==DaysofMonth[m])
break;
}
d.month=m;
d.day=n;
}
else
{
int y=0;
n=-n;
while (n>=DaysofEvery4Year[y%4])
{
n-=DaysofEvery4Year[y%4];
++y;
if (n==DaysofEvery4Year[y%4])
break;
}
d.year=da.year-1-y;
if (da.IsLeapYear())
{
n=366-n;
d.LeapYearEnable();
int m=1;
while (n>=DaysofMonth[m])
{
n-=DaysofMonth[m];
++m;
if (n==DaysofMonth[m])
break;
}
d.month=m;
d.day=n;
}
else
{
n=365-n;
d.LeapYearEnable();
int m=1;
while (n>=DaysofMonth[m])
{
n-=DaysofMonth[m];
++m;
if (n==DaysofMonth[m])
break;
}
d.month=m;
d.day=n;
}
if (n==0)
{
d.year-=1;
d.month=12;
d.day=31;
}
}
return d;
}
Date Date::Dateafter(int n,Date da)
{
Date d;
n=n+da.DateGoThough(da);
int y=0;
while (n>=DaysofEvery4Year[y%4])
{
n-=DaysofEvery4Year[y%4];
++y;
if (n==DaysofEvery4Year[y%4])
break;
}
d.year=da.year+y;
d.LeapYearEnable();
int m=1;
while (n>=DaysofMonth[m])
{
n-=DaysofMonth[m];
++m;
if (n==DaysofMonth[m])
break;
}
d.month=m;
d.day=n;
if (d.day==0)
++d.day;
return d;
}
Date&Date::operator=(const Date& rhs)
{
if (this!=&rhs)
{
year=rhs.year;
month=rhs.month;
day=rhs.day;
}
return *this;
}

int Date::Datedays(Date a,Date b)//这里是计算两个日期所隔的天数
{
int n1=a.DateGoThough(a);//计算日期是当年的多少天
int n2=b.DateGoThough(b);//计算日期是当年的多少天
int n=0;
if (n1>=n2)
{
n=n1-n2;
}
else
{
n=n2-n1;
}
if (a.year>b.year)//我把这里改成大于号却可以运行
{
for (int i=b.year;i<a.year;++b.year)
{
if (b.IsLeapYear())//判断是否为闰年
n+=366;
else
n+=365;
}
}
else
{
for (int i=a.year;i<b.year;++a.year)
{
if (a.IsLeapYear())
n+=366;
else
n+=365;
}
}
return n;
}
std::ostream& operator <<(std::ostream& os,const Date &d)
{
os<<d.year<<"\t"<<d.month<<"\t"<<d.day<<"\n";
return os;
}



main.cpp
#include "Date.h"

int main()
{
Date d1(2009,11,23),d2;
int n;
std::cout<<d1;
d1.InputDate();
std::cout<<d1;
std::cout<<d1.DateGoThough(d1)<<" days go through this year.\n";
std::cout<<"Please input days before or after:\n";
std::cin>>n;
std::cout<<n<<" days before "<<d1<<"is "<<d1.Datebefore(n,d1)<<std::endl;
std::cout<<n<<" days after "<<d1<<"is "<<d1.Dateafter(n,d1)<<std::endl;
std::cout<<"Please input another year:\n";
d2.InputDate();
std::cout<<d2;
std::cout<<"There are "<<d2.Datedays(d1,d2)<<" between "<<d1<<"and "<<d2;//函数到这里就不能输出了
return 0;
}




这是一个关于日期类的函数,要写出1从该年的第一天到当前日期过了多少天2当前日期的前一个日期和后一个日期3任意两人个日期之间相隔的天数


这是我写的程序,觉得有些复杂,不知道各位有没有什么更好的算法
我看到教材上有一个是设定了一个基准日期,比如1900年1月1日,但我觉得有些限制,要1900年以后的才能计算,我想要一个没有时间限制的....

6 个解决方案

#1


d2.Datedays(d1,d2) -------->Datedays不是成员函数,你怎么能这么用?

#2


引用 1 楼 thefirstz 的回复:
d2.Datedays(d1,d2) -------->Datedays不是成员函数,你怎么能这么用?

什么叫不是成员函数,我的头文件里面有啊,我运行过编译器说没有错误,但就到那个计算任意两个日期相隔的天数的函数出了问题,我把这个函数改为友元函数也不行.....

#3


d2.Datedays(d1,d2)应该与参数的传递有关系,前一个d2变为this指针,后一个则是复制的方式传参,函数完成后,d2仍是前一个,而里面改变的是第二个

#4


int Date::Datedays(Date a,Date b)//这里是计算两个日期所隔的天数
{
int n1=a.DateGoThough(a);//计算日期是当年的多少天
int n2=b.DateGoThough(b);//计算日期是当年的多少天
int n=0;
if (n1>=n2)
{
n=n1-n2;
}
else
{
n=n2-n1;
}
if (a.year>b.year)//我把这里改成大于号却可以运行
{
for (int i=b.year;b.year <a.year;b.year++) 循环条件的问题
{
if (b.IsLeapYear())//判断是否为闰年
n+=366;
else
n+=365;
}
}
else
{
for (int i=a.year;a.year <b.year;++a.year) 同理
{
if (a.IsLeapYear())
n+=366;
else
n+=365;
}
}
return n;
}

你对比看看,你的循环条件的问题,导致进那个函数 就出不来循环

#5


找到错误了 你在判断2个日期差几天那个函数Datedays2个for循环里都是对a.year或者b.year递增 应该对你的i进行++的 

#6


呃 有人先了

#1


d2.Datedays(d1,d2) -------->Datedays不是成员函数,你怎么能这么用?

#2


引用 1 楼 thefirstz 的回复:
d2.Datedays(d1,d2) -------->Datedays不是成员函数,你怎么能这么用?

什么叫不是成员函数,我的头文件里面有啊,我运行过编译器说没有错误,但就到那个计算任意两个日期相隔的天数的函数出了问题,我把这个函数改为友元函数也不行.....

#3


d2.Datedays(d1,d2)应该与参数的传递有关系,前一个d2变为this指针,后一个则是复制的方式传参,函数完成后,d2仍是前一个,而里面改变的是第二个

#4


int Date::Datedays(Date a,Date b)//这里是计算两个日期所隔的天数
{
int n1=a.DateGoThough(a);//计算日期是当年的多少天
int n2=b.DateGoThough(b);//计算日期是当年的多少天
int n=0;
if (n1>=n2)
{
n=n1-n2;
}
else
{
n=n2-n1;
}
if (a.year>b.year)//我把这里改成大于号却可以运行
{
for (int i=b.year;b.year <a.year;b.year++) 循环条件的问题
{
if (b.IsLeapYear())//判断是否为闰年
n+=366;
else
n+=365;
}
}
else
{
for (int i=a.year;a.year <b.year;++a.year) 同理
{
if (a.IsLeapYear())
n+=366;
else
n+=365;
}
}
return n;
}

你对比看看,你的循环条件的问题,导致进那个函数 就出不来循环

#5


找到错误了 你在判断2个日期差几天那个函数Datedays2个for循环里都是对a.year或者b.year递增 应该对你的i进行++的 

#6


呃 有人先了