📄 sheji1.cpp
字号:
#include<iostream.h>
class date
{int year,month,day;
public:
date(int y,int m,int d) //日期参数int型的构造函数
{year=y;
month=m;
day=d;
}
date(char *s) //日期参数为字符串的构造函数
{
char y[4],m[2],d[2];
int i;
for(i=0;i<4;i++)
y[i]=s[i];
year=(int (y[0])-48)*1000+(int (y[1])-48)*100+(int (y[2])-48)*10
+(int (y[3])-48); //字符串中的年转化为数据成员
if(s[4]=='0')
{m[0]=s[5];
month=int (m[0])-48; //月份小于10,转化为数据成员
}
else
{m[0]=s[4];
m[1]=s[5];
month=(int (m[0])-48)*10+(int (m[1])-48);//月份大于等于10,转化为数据成员
}
if(s[6]=='0')
{d[0]=s[7];
day=int (d[0])-48; //号数小于10,转化为数据成员
}
else
{d[0]=s[6];
d[1]=s[7];
day=(int (d[0])-48)*10+(int (d[1])-48); //号数大于等于10,转化为数据成员
}
}
void input() //输入日期
{cin>>year;
cin>>month;
cin>>day;
}
void output() //输出日期
{cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
}
date nextdate() //计算下一日函数
{
int test[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每月的天数分布
int i=month;
if(i==2&&((year%4==0&&year%100!=0)||(year%400==0))) //月份为2月且是闰年
{
if(day==29)
{date a(year,3,1); return a; //刚好是最后一天,返回3月1日
}
else
{date a(year,2,day+1); return a; //否则返回日期加1
}
}
else if(i==12&&day==31) //若是最后一天就返回下年的第一天
{
date a(year+1,1,1);
return a;
}
else //其他情况
{
if(day==test[i])
{date a(year,i+1,1); return a; //刚好最后一天,返回下个月1日
}
else
{date a(year,i,day+1); return a; //否则返回日期加1
}
}
}
date pirrodate() //计算前一日函数
{
int test[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每月天数分布
int i=month;
if(i==3&&((year%4==0&&year%100!=0)||(year%400==0)))//月份为三月且是闰年
{
if(day==1)
{date a(year,2,29); return a; //刚好第一天,返回2月29日
}
else
{date a(year,3,day-1); return a; //否则返回日期减1
}
}
else if(i==1&&day==1) //若是第一天就返回上一年最后一天
{
date a(year-1,12,31);
return a;
}
else //不是闰年3月的情况
{
if(day==1)
{date a(year,i-1,test[i-1]); return a;//刚好第一天,返回前个月最后一天
}
else
{date a(year,i,day-1); return a; //否则返回日期减1
}
}
}
date dateafter(int d)
{int test[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每月天数分布
int m=month;
int y=year;
while(day+d>=28) //当日加上d日大于=28,要进行延伸分析
{if(m==2) //2月份情况
{
if((y%4==0&&y%100!=0)||(year%400==0)) //是闰年
{
if((day+d-29)>0) //日期加d减29天大于0,表明延伸到下个月
{d=d-29; //d减29
m++; //月份加1
}
else break;
}
else if((day+d-28)>0) //不是闰年
{d=d-28; //d减28
m++; //月份加1
}
else break;
}
else //其他月份情况
{
if(day+d-test[m]>0) //日期加d减当月天数大于0,表明延伸到下个月
{d=d-test[m]; //d循环减当月天数
m++; //月份加1
}
else break;
}
if(m>12) //月份超过12,表明延伸到下一年
{m=m-12;
y++;
}
}
date a(y,m,d+day); //返回d天后日期
return a;
}
date datebefore(int d)
{int test[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平面每月天数分布
int m=month;
int y=year;
while((day-d)<=0) //日期减d小于0,要进行延伸分析
{ if(m==3) //3月分情况
{
if((y%4==0&&y%100!=0)||(year%400==0)) //是闰年
{d=d-29; //d减29
m--; //月份减1
}
else
{d=d-28; //不是闰年,d减28
m--; //月份减1
}
}
else //其他月份情况
{d=d-test[m]; //d循环减当月天数
m--; //月份减1
}
if(m<=0) //月份小于0 ,表明要延伸到前一年
{m=m+12;
y--;
}
}
date a(y,m,day-d); //返回d天前日期
return a;
}
};
void main()
{date t(0,0,0);
date a("20071231"); //用字符串构造一个日期
a.output();
t=a.nextdate(); //下一日日期
cout<<"下一日:";
t.output();
date c("20080101");
c.output();
t=c.pirrodate(); //前一日日期
cout<<"前一日:";
t.output();
date b(0,0,0);
cout<<"输入一个日期:"<<endl; //输入一个日期
b.input();
t=b.dateafter(90); //90天后日期
cout<<"90天后的日期:";
t.output();
t=b.datebefore(130); //130天前日期
cout<<"130天前的日期:";
t.output();
cin.get();
cin.get();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -