【C++】日付クラス減算およびその「+=」、「-=」演算子のリロード

45690 ワード

今日はC++の授業の宿題をしました.問題はよく理解できますが、プログラムを書く過程は想像していたほど簡単ではありません.主にアルゴリズムの解決が難しい(私自身にとって).数時間かかりましたが、最後にAcceptedの瞬間も本当に気持ちがいいです.
タイトル:日付クラスdateを実装し、2つのdateクラス間の「-」演算とdateクラスの「+=」、「-=」演算を再ロードします.要求:1.それぞれ2つの日付(年月日はスペースで区切られ、最初の日付の時間は2番目の日付より前)を入力し、2つの日付の差の日数を出力します.2.もう一度正の整数(単位:日)を入力し、最初の日付にこの正の整数を加えた日付と2番目の日付からこの正の整数を減算した日付を出力します.
サンプル入力1:
1975 3 4
1980 4 29
15

サンプル出力1:
1883
1975 3 19
1980 4 14

サンプル入力2:
1980 2 28
2000 1 2
5

サンプル出力2:
7248
1980 3 4
1999 12 28

プログラムコード:
#include 
using namespace std;
const int n1[12]={31,29,31,30,31,30,31,31,30,31,30,31};  //              
const int n2[12]={31,28,31,30,31,30,31,31,30,31,30,31};  //              
class date
{
	public:
		int y,m,d;
		date(int yy=0,int mm=0,int dd=0){y=yy;m=mm;d=dd;} //     
		
		int year()  {return y;}  //  year  
		int month() {return m;}  //  month   
		int day()   {return d;}  //  day   

	    int operator - (const date &z) ;        //      :      -    ——    ( )
		date operator += (const int i) ;        //      :     +=    ——    ( ) 
		date operator -= (const int i) ;        //      :     -=    ——    ( )
		  
		friend int frontday(int y,int m,int d);                    //      :                             ——    (1)
		friend int backday(int y,int m,int d);                     //      :                               ——    (2) 
		friend int yearmod(int y);                                 //      :         ,              ——    (3)
		friend int monthmod(int y,int m);                          //      :         2 ,           ——    (4)
		friend int daymod(int y,int m1,int m2,int d1,int d2);      //      :                        ——    (5)

	private:
};

int frontday(int y,int m,int d)  //                (1) 
{
	int sum=0;
	int i;
	if((y%100!=0&&y%4==0)||y%400==0) //      
	{
		for(i=0;i<m-1;i++)
		{
			sum+=n1[i];
		}
		return sum+d;
	}
	else                             //      
	{
		for(i=0;i<m-1;i++)
		{
			sum+=n2[i];
		}
		return sum+d;
	}
}

int backday(int y,int m,int d)  //              (2) 
{
	int sum=0;
	int i;
	if((y%100!=0&&y%4==0)||y%400==0)  //      
	{
		for(i=0;i<m-1;i++)
		{
			sum+=n1[i];
		}
		return 366-(sum+d);
	}
	else                              //      
	{
		for(i=0;i<m-1;i++)
		{
			sum+=n2[i];
		}
		return 365-(sum+d);
	}
}

int yearmod(int y)  //         ,           (3) 
{
	if((y%100!=0&&y%4==0)||y%400==0)  //      
	return 366;
	else                              //      
	return 365;
}

int monthmod(int y,int m)  //         2 ,          (4) 
{
	if((m==2)&&(y%4==0&&y%100!=0)||(y%400==0))
	return 29;
	else
	return n2[m-1];
}

int daymod(int y,int m1,int m2,int d1,int d2)  //                     (5) 
{
	int sum=0;
	int i;
	if((y%100!=0&&y%4==0)||y%400==0)                //      
	{
		if(m1==m2)           //          
		{
			return d2-d1; 
		}
		else if((m2-m1)==1)  //          
		{
			return (n1[m1-1]-d1+d2); 
		}
		else if((m2-m1)>1)   //             
		{
			sum=n1[m1-1]-d1+d2;
			for(i=m1+1;i<=m2-1;i++)
			{
				sum+=n1[i-1];
			}
			return sum;
		} 
	}
	else                                            //      
	{
		if(m1==m2)           //          
		{
			return d2-d1; 
		}
		else if((m2-m1)==1)  //          
		{
			return (n2[m1-1]-d1+d2); 
		}
		else if((m2-m1)>1)   //             
		{
			sum=n2[m1-1]-d1+d2;
			for(i=m1+1;i<=m2-1;i++)
			{
				sum+=n2[i-1];
			}
			return sum;
		} 
	}
}

int date::operator - (const date &z) //       ,        ——    ( ) 
{
    int t;
    if((y-z.y)<0)
    {
    	cout<<"data error!"<<endl;
	}
	else if((y-z.y)==0)  //       
	{
		t=daymod(z.y,z.m,m,z.d,d);
		return t;
	}
	else if((y-z.y)==1)  //        
	{
		t=backday(z.y,z.m,z.d)+frontday(y,m,d);
		return t;
	}
    else if((y-z.y)>1)  //        
	{
		int sum,i;
		sum=backday(z.y,z.m,z.d)+frontday(y,m,d);
		for(i=z.y+1;i<=y-1;i++)
		{
			sum+=yearmod(i);
		}
		return sum;
	}
}

date date::operator += (const int i)  //     +=   ——    ( ) 
{
	date t;
	if(i<0)
	{
		cout<<"data error!"<<endl;
	}
	else
	{
		d+=i;
		while(d>monthmod(y,m))
		{
			d-=monthmod(y,m);
			m++;
			if(m==13)
			{
				y++;
				m=1;
			}
		}
		t.y=y;
		t.m=m;
		t.d=d;
		return t;
	}
	
}

date date::operator -= (const int i)  //     -=   ——    ( ) 
{
	date t;
	if(i<0)
	{
		cout<<"data error!"<<endl;
	}
	else
	{
		d-=i;
		while(d<1)
		{
			m--;
			if(m==0)
			{
				y--;
				m=12;
			}
			d+=monthmod(y,m);
		}
		t.y=y;
		t.m=m;
		t.d=d;
		return t;
	}
}

int main() 
{
    using std::cin;
    using std::cout;
    using std::endl;
    date D1,D2;
    int year;
    int month;
    int day;
    cin>>year>>month>>day; //        
    D1=date(year,month,day);
    cin>>year>>month>>day;  //        
    D2=date(year,month,day);
    cout<<D2-D1<<endl; 
    cin>>day;  //        
    D1+=day;
    D2-=day;
    cout<<D1.year()<<" "<<D1.month()<<" "<<D1.day()<<endl;
    cout<<D2.year()<<" "<<D2.month()<<" "<<D2.day()<<endl;
    return 0;
}