C++ 自定義日期類實現日期的加減演算法
阿新 • • 發佈:2018-12-22
#include<iostream> using namespace std; class Date{ private: int m_year,m_month,m_day; int m_totalDaysYear; public: Date(int year=2001,int month=1,int day=1); ~Date(){}; Date(const Date & date); Date & operator=(const Date & date); int operator-(const Date &date); Date operator+(int days); int compare(const Date &date); void print(); int getDaysofYear(); int getRemainingDaysofYear(); friend ostream & operator<<(ostream & out, const Date & date); }; inline bool isLeapYear(int year ){ if(year%4==0&&year%100!=0||year%400==0) return true; else return false; } Date::Date(int year,int month,int day):m_year(year),m_month(month),m_day(day){ m_totalDaysYear=isLeapYear(m_year)?366:365; } Date::Date(const Date &date){ m_year=date.m_year; m_month=date.m_month; m_day=date.m_day; m_totalDaysYear=date.m_totalDaysYear; } Date & Date::operator=(const Date & date){ if(this==&date) return *this; m_year=date.m_year; m_month=date.m_month; m_day=date.m_day; m_totalDaysYear=date.m_totalDaysYear; return *this; } int Date::operator-(const Date &date){ int num=0; Date bigDate,smallDate; int value=compare(date); if(value==1){ bigDate=*this; smallDate=date; }else if(value==-1){ bigDate=date; smallDate=*this; }else return 0; int yearGap=bigDate.m_year-smallDate.m_year; if(yearGap>=2){ for(int i=smallDate.m_year+1;i<=bigDate.m_year-1;i++){ if(isLeapYear(i)) num+=366; else num+=365; } num+=bigDate.getDaysofYear(); num+=smallDate.getRemainingDaysofYear(); }else if(bigDate.m_year-smallDate.m_year==1){ num+=bigDate.getDaysofYear(); num+=smallDate.getRemainingDaysofYear(); }else{ num+=bigDate.getDaysofYear(); num-=smallDate.getDaysofYear(); } if(value==1) return num; else return -num; } Date Date::operator+(int days){ int year=m_year,month,day; int remainings=getRemainingDaysofYear(); if(days>remainings){ days-=remainings; year++; int num=isLeapYear(year)?366:365; while(days>num){ // 找到相應的年份 days-=num; year++; num=isLeapYear(year)?366:365; } } int months[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year)) months[1]=29; month=m_month; if(days-(months[m_month-1]-m_day)>0){ days-=months[m_month-1]-m_day; int i=m_month; for(;i<12;i++){// 找到相應的月份 if(days-months[i]<0) break; days-=months[i]; } month=i+1; } day=days; return Date(year,month,day); } int Date::compare(const Date &date){ if(m_year>date.m_year){ return 1; }else if(m_year<date.m_year){ return -1; }else{ if(m_month>date.m_month) return 1; else if(m_month<date.m_month) return -1; else{ if(m_day>date.m_day) return 1; else if(m_day<date.m_day) return -1; else return 0; } } } void Date::print(){ cout<<m_year<<'\\'<<m_month<<'\\'<<m_day<<endl; } int Date::getDaysofYear(){ int months[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(m_year)) months[1]=29; int num=0; for(int i=0;i<m_month-1;i++){ num+=months[i]; } return num+m_day; } int Date::getRemainingDaysofYear(){ return m_totalDaysYear-getDaysofYear(); } ostream & operator<<(ostream & out, const Date & date){ out<<date.m_year<<'\\'<<date.m_month<<'\\'<<date.m_day; return out; } int main(){ Date d1(2012,1,20),d2(2014,1,12); Date d3(d2),d4; d4=d1; cout<<d1; int days=50; cout<<d1<<" - "<<d2<<" = "<<d1-d2<<" days "<<endl; return 0; }