02_日付の累加


タイトルの説明
1つのプログラムを設計して、1つの日付に数日を加えた後に何の日付があるかを計算することができます.
  • 入力説明:最初の行がサンプル個数mを表し、次にm行の4つの整数がそれぞれ年月日と累積日数を表す.
  • 出力記述:m行を出力し、各行をyyyy-mm-ddの個数で出力する.

  • 問題解
    1.静的配列が12ヶ月の月に対応する日数を定義します.2月のデフォルトは28日です.閏年であれば2月は29日です.
    2.累積日、当月に対応する日数より大きい場合、月に進級する.月が13に増えれば、別の月は1で、年に進級します.
    3.タイトル要求の入出力方式に注意する.
    #include
    using namespace std;
    
    class Date
    {
         
    private:
        int _year;
        int _month;
        int _day;
    public:
        int _n;
        
        //      
        int GetMonthDay(int year,int month){
         
            static int arr[13]={
         0,31,28,31,30,31,30,31,31,30,31,30,31};
            //     :    ,    ;     
            if(month==2 &&((year%4==0 && year%100!=0) || (year%400==0)))
                return 29;
            return arr[month];
        }
        
        // +=     
         Date& operator+=(int n){
         
             _day+=n;
             while(_day > GetMonthDay(_year, _month)){
         
                 _day-=GetMonthDay(_year, _month);
                 ++_month;
                 if(_month==13){
         
                     ++_year;
                     _month=1;
                 }
             }
             return *this;
         }
         
        //    
        void Input(){
         
            int year,month,day,n=0;
            cin>>year>>month>>day>>n;
            //          
            if (year >= 0 && month >= 1 && month <= 12 && day >= 1 && day <= GetMonthDay(year, month)){
         
                _year=year;
                _month=month;
                _day=day;
                _n=n;
            }
        }
        
        //  
        void Print(){
         
                printf("%d-%02d-%02d
    "
    ,_year,_month,_day); } }; int main(){ int count=0; int year,month,day,n=0; cin>>count; Date d[count]; for(int i=0;i<count;++i) d[i].Input(); for(int j=0;j<count;++j){ d[j]+=d[j]._n; d[j].Print(); } return 0; }