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