#pragma once //头文件 class Date{ private: int _year; int _month; int _day; public: Date(int year=1990,int month=1,int day=1); Date(const Date& tmp); ~Date(); int operator-(const Date& tmp);//日期相减 Date operator+(int day);//日期与天数相加 Date& operator++();//日期与天数相加 Date& operator+=(int day);//日期与天数相加 Date operator-(int day);//日期与天数相减 bool operator>(const Date& tmp);//日期比较 bool operator==(const Date& tmp);//日期是否相等 void PrintDate();//打印日期 bool IsleapYear(const Date& tmp);//是否闰年 bool IsOverDay(const Date& tmp);//是否超过1个月的天数 bool IsOverMonth(const Date& tmp);//是否超过1年的月数 }; #include<iostream>//函数文件 #include "date.h" using namespace std; Date::Date(int year,int month,int day) { _year=year; _month=month; _day=day; if(year<1990||month<1||IsOverMonth(*this)||day<1||IsOverDay(*this)) { cout<<"无效的日期"<<endl; exit(-1); } } Date::Date(const Date& tmp) { _year=tmp._year; _month=tmp._month; _day=tmp._day; } Date::~Date() { } int Date::operator-(const Date& tmp)//基本实现日期相减 (复杂逻辑) { Date dateTmp; int count=0 ; int tmpCount=0; if(tmp._year-_year==0) { dateTmp._month=(_month<tmp._month)? _month:tmp._month; dateTmp._day=0; int maxDay=_month>tmp._month?_day:tmp._day; while(dateTmp._month!=(_month>tmp._month? _month:tmp._month)|| dateTmp._day!=maxDay) { if(dateTmp._month!=(_month>tmp._month? _month:tmp._month)) { if(dateTmp._month==1||dateTmp._month==3||dateTmp._month==5 ||dateTmp._month==7 ||dateTmp._month==8||dateTmp._month==10||dateTmp._month==12) { count+=31; ++dateTmp._month; } else if(dateTmp._month==2) { if(IsleapYear(tmp)) { count+=29; ++dateTmp._month; } else { count+=28; ++dateTmp._month; } } else { count+=30; ++dateTmp._month; } } else { ++dateTmp._day; ++count ; } } return count-(_month>tmp._month?_day:tmp._day); } else { dateTmp._year=(_year<dateTmp._year)? _year:tmp._year; dateTmp._month=1; dateTmp._day=0; int maxDay=(_year>tmp._year?_day:tmp._day); int tmpCount=0; while((dateTmp._year!=(_year>tmp._year? _year:tmp._year))|| (dateTmp._month!=(_year>tmp._year? _month:tmp._month))|| (dateTmp._day!=maxDay)) { if(dateTmp._year!=(_year>tmp._year? _year:tmp._year)) { if(IsleapYear(dateTmp)) { count+=366; ++dateTmp._year; } else { count+=365; ++dateTmp._year; } } else if(dateTmp._month!=(_year>tmp._year? _month:tmp._month)) { if(dateTmp._month==1||dateTmp._month==3||dateTmp._month==5 ||dateTmp._month==7 ||dateTmp._month==8||dateTmp._month==10||dateTmp._month==12) { count+=31; ++dateTmp._month; } else if(dateTmp._month==2) { if(IsleapYear(tmp)) { count+=29; ++dateTmp._month; } else { count+=28; ++dateTmp._month; } } else { count+=30; ++dateTmp._month; } } else { ++count ; ++dateTmp._day; } } dateTmp._month=1; dateTmp._day=0; maxDay=_year<tmp._year?_day:tmp._day; while(dateTmp._month!=(_year<tmp._year? _month:tmp._month)|| dateTmp._day!=maxDay) { if(dateTmp._month!=(_year<tmp._year? _month:tmp._month)) { if(dateTmp._month==1||dateTmp._month==3||dateTmp._month==5 ||dateTmp._month==7 ||dateTmp._month==8||dateTmp._month==10||dateTmp._month==12) { tmpCount+=31; ++dateTmp._month; } else if(dateTmp._month==2) { if(IsleapYear(dateTmp)) { tmpCount+=29; ++dateTmp._month; } else { tmpCount+=28; ++dateTmp._month; } } else { tmpCount+=30; ++dateTmp._month; } } else { ++dateTmp._day; ++tmpCount ; } } return count-tmpCount; } } int Date::operator-(const Date& tmp)//日期相减 (与上个函数体 重复) { //利用其它 类的成员函数 简单实现日期相减 int count=0; if(*this>tmp) { Date dateTmp(tmp); while(1) { if (dateTmp == *this) return count; if ((++dateTmp) == *this) { count++; return count; } count++; } } else { Date dateTmp(*this); while(1) { if (dateTmp == *this) return count; if ((++dateTmp) == *this) { count++; return count; } count++; } } } Date Date::operator+(int day)//日期与天数相加 { Date tmp(*this); int count=0; while(count!=day) { ++tmp._day; if(IsOverDay(tmp)) { ++tmp._month; if(IsOverMonth(tmp)) { ++tmp._year; tmp._month=1; } tmp._day=1; } count++; } return tmp; } Date Date::operator-(int day)//日期与天数相减 { Date tmp(*this); int count=0; while(count!=day) { --tmp._day; if(tmp._day==0) { --tmp._month; if(tmp._month==0) { --tmp._year; tmp._month=12; } if(tmp._month==1||tmp._month==3||tmp._month==5||tmp._month==7 ||tmp._month==8||tmp._month==10||tmp._month==12) { tmp._day=31; } else if(tmp._month==2) { if(IsleapYear(tmp)) tmp._day=29; else tmp._day=28; } else tmp._day=30; } count++; } return tmp; } bool Date::IsleapYear(const Date& tmp)//是否闰年 { return ((tmp._year%4==0&&tmp._year%100!=0)||(tmp._year%400==0)); } bool Date::IsOverDay(const Date& tmp)//是否超过1个月的天数 { if(tmp._month==1||tmp._month==3||tmp._month==5||tmp._month==7 ||tmp._month==8||tmp._month==10||tmp._month==12) { return tmp._day>31; } else if(tmp._month==2) { if(IsleapYear(tmp)) return tmp._day>29; else return tmp._day>28; } else return tmp._day>30; } bool Date::IsOverMonth(const Date& tmp)//是否超过12个月的 { return tmp._month>12; } void Date::PrintDate() { cout<<_year<<"年"<<_month<<"月"<<_day<<"日"<<endl; } bool Date::operator>(const Date& tmp)//日期比较 { return (_year>=tmp._year)&&(_month)>=(tmp._month)&&(_day>=tmp._day); } bool Date::operator==(const Date& tmp) { return ((_year==tmp._year)&&(_month==tmp._month)&&(_day==tmp._day)); } Date& Date::operator++()//日期与天数相加 前置++ { int count = 0; while (count != 1) { ++(this->_day); if (IsOverDay(*this)) { ++(this->_month); if (IsOverMonth(*this)) { ++(this->_year); this->_month = 1; } this->_day = 1; } count++; } return *this; } Date& Date::operator+=(int day)//日期与天数相加 { int count = 0; while (count != day) { ++(this->_day); if (IsOverDay(*this)) { ++(this->_month); if (IsOverMonth(*this)) { ++(this->_year); this->_month = 1; } this->_day = 1; } count++; } return *this; } //主函数测试文件 #include<iostream> #include "date.h" using namespace std; void test() { Date d1(2010,1,1); Date d2(2010,1,1); //(d2-35).PrintDate(); //(d2 +1).PrintDate(); //(++d2).PrintDate(); //(d1 += 100).PrintDate(); //cout<<(d2>d1)<<endl; cout<<d1-d2<<endl; } int main() { test(); return 0; }
时间: 2024-11-05 12:35:37