日期操作(面向物件)具體實現
阿新 • • 發佈:2019-01-26
將專欄中上一篇文章用面向物件的方式實現程式碼如下:
#include <bits/stdc++.h> using namespace std; class Date { private: int year,month,day; public: Date(int year=0,int month=0,int day=0) { this->year=year,this->month=month,this->day=day; } void AddDays(int days) { for(int i=days; i; --i) { if(day==31) { if(month-12) { month++; day=1; } else { year++; month=1; day=1; } continue; } if(day==30) { if(month==4||month==6||month==9||month==11) { month++; day=1; } else day++; continue; } if(day==29&&month==2) { month++; day=1; continue; } if(day==28&&month==2) { if(((year%4==0)&&(year%100!=0))||(year%400==0)) day++; else { month++; day=1; } continue; } day++; } } void AddMonth(int months) { year+=(month+months)/12; month=(month+months)%12; if(day==31) { if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) return; if(month==4||month==6||month==9||month==11) { day=30; return; } if(((year%4==0)&&(year%100!=0))||(year%400==0)) { day=29; return; } day=28; return; } if(day==30&&month==2) { if(((year%4==0)&&(year%100!=0))||(year%400==0)) { day=29; return; } day=28; return; } if(day==29&&month==2) { if(((year%4==0)&&(year%100!=0))||(year%400==0)) return; day=28; return; } } void AddYear(int years) { year+=years; if(day==29&&month==2) { if(((year%4==0)&&(year%100!=0))||(year%400==0)) return; day=28; return; } } int DayInYear(int Year,int Month) { int Long=0; int DAY[12]= {31,28,31,30,31,30,31,31,30,31,30,31}; if(((Year%4==0)&&(Year%100!=0))||(Year%400==0)) DAY[1]=29; for(int i=0; i<Month-1; ++i) { Long+=DAY[i]; } return Long; } int Subtract(Date d) { if(year==d.year&&month==d.month) { return day-d.day; } else if(year==d.year) { return DayInYear(year,month) - DayInYear(d.year,d.month); } else { int a,b,c=0; int temp1,temp2,temp3; int flag=0; if(year>d.year) { temp1=year; year=d.year; d.year=temp1; temp2=month; month=d.month; d.month=temp2; temp3=day; day=d.day; d.day=temp3; flag=1; } if(((year%4==0)&&(year%100!=0))||(year%400==0)) a=366-DayInYear(year,month); else a=365-DayInYear(year,month); b=DayInYear(d.year,d.month); for(int i=year+1; i<d.year; ++i) { if(((i%4==0)&&(i%100!=0))||(i%400==0)) c+=366; else c+=365; } return flag?(a+b+c):(-a-b-c); } } int GetYear() { return year; } int GetMonth() { return month; } int GetDay() { return day; } }; int main() { int op; while(cin>>op) { int n; int year1,month1,day1,year2,month2,day2; if(op!=4) { cin>>year1>>month1>>day1>>n; Date d1(year1,month1,day1); if(op==1) { d1.AddDays(n); cout<<d1.GetYear()<<" "<<d1.GetMonth()<<" " <<d1.GetDay()<<endl; } if(op==2) { d1.AddMonth(n); cout<<d1.GetYear()<<" "<<d1.GetMonth()<<" " <<d1.GetDay()<<endl; } if(op==3) { d1.AddYear(n); cout<<d1.GetYear()<<" "<<d1.GetMonth()<<" " <<d1.GetDay()<<endl; } } else { cin>>year1>>month1>>day1>>year2>>month2>>day2; Date d1(year1,month1,day1); Date d2(year2,month2,day2); n=d1.Subtract(d2); cout<<n<<endl; } } return 0; }