#include<iostream>
#include<iomanip>
#include<string>
#define error 0
using namespace std;
class Calendar
{
private:
int month;
int date;
string Day[7];//char Day[7][10];//私有成员不能初始化,而且字符数组要想赋值,要么就一个一个的赋值
int Month[13];
int sumday;
int year;
public:
Calendar(){}
Calendar(int y,int m,int d)
{
year=y;
month=m;
date=d;
Month[0]=0;Day[0]="日";
Month[1]=31;Day[1]="一";
Month[2]=28;Day[2]="二";
Month[3]=31;Day[3]="三";
Month[4]=30;Day[4]="四";
Month[5]=31;Day[5]="五";
Month[6]=30;Day[6]="六";
Month[7]=31;
Month[8]=31;
Month[9]=30;
Month[10]=31;
Month[11]=30;
Month[12]=31;
sumday=0;
}
bool Leapyear(int y)
{
if((y%400==0)||((y%4==0)&&(y%100!=0)))
{
Month[2]=29;
return true;
}
else
{
Month[2]=28;
return false;
}
}
int yearDay(int y)
{
if(Leapyear(y))return 366;
if(!Leapyear(y))return 365;
return error;
}
int Dateday()
{
return date;
}
int Monthday(int m)
{
return Month[m];
}
void Yearday(int y)
{
if(Leapyear(y))sumday=sumday+366;
else
sumday=sumday+365;
}
void Sumday() //返回从公元1年1月至今的天数一
{
int i=1;
for(;i!=year;i++)
{
Yearday(i);
}
Leapyear(year);
for(i=1;i<month;i++)
{
sumday+=Monthday(i);
}
sumday+=date;
}
int Return_sumday()
{
return sumday;
}
int Onedate1(int t) //返回这一年的第一天是星期几
{
t=sumday%7;
if(t==1) return 1;
if(t==2) return 2;
if(t==3) return 3;
if(t==4) return 4;
if(t==5) return 5;
if(t==6) return 6;
if(t==0) return 0;
return error;
}
/*int Onedate2(int t)
{
t=sumday%7;
if(t==1) return 0;
if(t==2) return 6;
if(t==3) return 5;
if(t==4) return 4;
if(t==5) return 3;
if(t==6) return 2;
if(t==0) return 1;
return error;
}*/
void Output1() //往前推得输出年,月,日
{
cout<<"year:"<<year<<endl;
cout<<"month:"<<month<<endl;
cout<<"date:"<<date<<endl;
int t;
cout<<"星期";
t=Onedate1(sumday);
if(t==7)cout<<Day[0]<<endl;
else
cout<<Day[t]<<endl;
}
/*void Output2() //往后推的年月日
{
cout<<"year:"<<year<<endl;
cout<<"month:"<<month<<endl;
cout<<"date:"<<date<<endl;
int t;
cout<<"星期";
t=Onedate2(sumday);
if(t==7)cout<<Day[0]<<endl;
else
cout<<Day[t]<<endl;
}*/
int One_Year() //返回本年一共是多少天
{
int i,s1=0;
for(i=1;i<month;i++)
s1=s1+Monthday(i);
s1=s1+date;
return s1;
}
void operator +(int n)
{
sumday+=n;
int s,s2,s3,s4,i,k1,k2,k3;
if(Leapyear(year))s=366;
else
s=365;
s3=One_Year();
s4=s3+n;
if(s>=s4) //在本年内
{
s2=n-Monthday(month)+date;
if(s2<=0)date=date+n; //本月内
else
{
i=month;
while(s2!=0)
{
i++;
k1=s2%Monthday(i);
s2=s2/Monthday(i);
}
month=i;
date=k1;
}
}
else //不在本年内
{
s2=n-s+s3;
while(s2!=0) //确定第几年
{
year++;
k2=s2%yearDay(year);
s2=s2/yearDay(year);
}
month=0;
while(k2!=0) //确定第几个月
{
month++;
k3=k2%Monthday(month);
k2=k2/Monthday(month);
}
date=k3; //第几日
}
}
void operator -(int n) //刚开始没有重载好减号运算符,应为是倒过来算的,所以日起赋值必须是用这个月份的全部天数-求模余下来的天数
{
sumday-=n;
if(sumday<0)
{
cout<<"超出了天数的范围!"<<endl;
return ;
}
else
{
if(sumday==0)
{
cout<<"超出了天数的范围!"<<endl;
return ;
}
else
{
int s1,s2,k1,k2;
s1=One_Year();
s1=s1-n;
if(s1>0) //在本年内
{
s2=date-n;
if(s2>0) //在本月内
date-=n;
else //不在本月内
{
// sumday++; //??不在本年和本月的时候就sumday要加一次
if(s2<0)
{
s2=-s2;
while(s2!=0)
{
month--;
k1=s2%Monthday(month);
s2=s2/Monthday(month);
}
date=Monthday(month)-k1;
}
else
{
month--;
date=Monthday(month);
}
}
}
else //不再本年内
{
s2=-s1;
if(s2!=0)
{
while(s2!=0) //确定第几年
{
year--;
k1=s2%yearDay(year);
s2=s2/yearDay(year);
}
month=13;
while(k1!=0) //确定第几个月
{
month--;
k2=k1%Monthday(month);
k1=k1/Monthday(month);
}
date=Monthday(month)-k2; //第几日
}
else
{
year--;
month=12;
date=Monthday(month);
}
}
}
}
}
int operator -(Calendar b)
{
int n;
Sumday();
b.Sumday();
n=Return_sumday()-b.Return_sumday();
if(n<0)n=n*(-1);
return n;
}
};
int main()
{
cout<<"Please input year,month,date:";
int y,m,d;
cin>>y>>m>>d;
cout<<"Please input add and reduce:";
int n1,n2;
cin>>n1>>n2;
Calendar a(y,m,d);
a.Sumday();
cout<<a.Return_sumday()<<endl;
a.Output1();
a+n1;
cout<<a.Return_sumday()<<endl;
a.Output1();
Calendar b(y,m,d);
b.Sumday();
cout<<b.Return_sumday()<<endl;
b-n2;
cout<<b.Return_sumday()<<endl;
b.Output1();
int x1,y1,z1;
cout<<"Please input add_date and reduce_date:";
cin>>x1>>y1>>z1;
Calendar a1(x1,y1,z1),a3(y,m,d);
//int s1,s2;
cout<<"The reduce_day is "<<a1-a3<<endl;
return 0;
}
c++课程设计 对日期的基本运算 使用重载
最新推荐文章于 2021-05-16 15:46:00 发布
本文介绍了一个简单的日期计算器类的实现,该类能够进行日期加减运算并返回指定日期是一周中的哪一天。通过重载加减运算符,可以方便地向前或向后推算日期,并计算两个日期之间的天数差。

644

被折叠的 条评论
为什么被折叠?



