📄 +
字号:
/*22.自定义一个简单的日期类DateType,它具有数据成员y、m、d,用来表示当前日期的年、月、日。
而后设计该类欲实现(完成)的功能,进而设计出相应的类成员函数。
例如,下面给出的"雏形"可用来实现对天的增加,比较两个日期是否相等,
以及对日期的输出等操作。请完成各类成员函数,并编制主函数,说明DateType类对象,
对定义的各成员函数进行调用,以验证它们的正确性。
class DateType { //自定义的日期类DateType
int y,m,d; //数据成员,表示当前日期的年、月、日
public:
DateType(int y0=1, int m0=1, int d0=1);
//构造函数,设定年、月、日;并设置参数默认值
void incrementDay(); //增加1天
bool equal(DateType dt2); //判断二日期是否相等
void printDate(); //屏幕输出日期对象的有关数据(年、月、日)
};
注意,当对日期增加1天后,也会涉及所谓的"进位"问题:首先算出本"日"所在的月份具有的天数N,
若加1之后的"日"数值超过所在的月份具有的天数N时,"进位"到月,而月份若超过12时还要"进位"到年。
思考:可对该类增加你所考虑到的其他功能,如,对日期进行输入,计算二日期的间隔天数,
计算某日期为星期几,打印对象当前数据的y年m月的月历,一次增加若干天,对两个日期进行其他比较运算等。*/
#include<iostream.h>
#include<iomanip.h>
#include<stdlib.h>
class DateType //自定义的日期类DateType
{ //数据成员,表示当前日期的年、月、日
public:
DateType(){y=m=d=1;} //构造函数,设定年、月、日;并设置参数默认值
Init(int a,int b,int c)
{
y=a;m=b;d=c;
}
int IsLeapYear(int y)
{
return(y%4==0&&y%100!=0||y%400==0);
//判断是否为闰年
}
void incrementDay(); //增加1天
bool equal(DateType dt2)
{
if(dt2.d==d&&dt2.m==m&&dt2.y==y)
return true;
else return false; //判断二日期是否相等
}
void yueli(); // 打印月历
void printDate()
{
cout<<setw(4)<<y<<"年"<<setw(2)<<m<<"月"<<setw(2)<<d<<"日"<<endl;
} //屏幕输出日期对象的有关数据(年、月、日)
int isWrong(); //出错处理
private:
int y,m,d;
};
void DateType::incrementDay()
{
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(m==2&&IsLeapYear(y)==1)
{
if(d==29)
{d=1;m++;}
else
d++;
}
else
{
if(d<days[m-1])
d++;
else
{
if(m==12)
{d=1;m=1;y++;}
else
{d=1;m++;}
}
}
}
int DateType::isWrong()
{
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(IsLeapYear(y)) days[1]=29;
if(y<1||m<1||m>12||d<1||d>days[m-1])
return 1;
else
return 0;
}
//----------------------------------------------此程序段由第8题代码稍作改变即可得到,不再注释
void DateType::yueli()
{
int i,n;
int day;
int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
long int Year_days = 0;
int Year_Start = 1;
int Per_Year_Days;
while(Year_Start<y)
{
if(IsLeapYear(Year_Start))
Per_Year_Days=366;
else
Per_Year_Days=365;
Year_days=Year_days+Per_Year_Days;
Year_Start++;
}
for(int j=1;j<m;j++){
switch(j)
{
case 1:
Year_days=Year_days+days[0];
break;
case 2:
if(IsLeapYear(y))
Year_days=Year_days+29;
else
Year_days=Year_days+days[1];
break;
case 3:
Year_days=Year_days+days[2];
break;
case 4:
Year_days=Year_days+days[3];
break;
case 5:
Year_days=Year_days+days[4];
break;
case 6:
Year_days=Year_days+days[5];
break;
case 7:
Year_days=Year_days+days[6];
break;
case 8:
Year_days=Year_days+days[7];
break;
case 9:
Year_days=Year_days+days[8];
break;
case 10:
Year_days=Year_days+days[9];
break;
case 11:
Year_days=Year_days+days[10];
break;
}
}
i =Year_days%7;
cout<<endl;
cout<<"Mon Tue Wed Thu Fri Sat Sun"<<endl;
if(i!=0)
for(n=0;n<i;n++)
cout<<" ";
day=1;
if(IsLeapYear(y)&&m==2)
while(day<=29)
{
if(day>1)
if(Year_days%7==0)
cout<<endl;
if(day>=10)
cout<<day<<" ";
else
cout<<day<<" ";
Year_days++;
day++;
}
else
while(day<=days[m-1])
{
if(day>1)
if(Year_days%7==0)
cout<<endl;
if(day>=10)
cout<<day<<" ";
else
cout<<day<<" ";
Year_days++;
day++;
}
cout<<endl;
}
//---------------------------------------------------------------------
void main()
{
int y,m,d,n;
DateType date;
cout<<"输入年、月、日,设定为当前日期:"<<endl;
cin>>y>>m>>d;
date.Init(y,m,d);
while(date.isWrong())
{
cout<<"输入有误!请重新输入!"<<endl;
cin>>y>>m>>d;
date.Init(y,m,d);
}
DateType date2;
DateType date3;
while(!date.isWrong())
{
char op;int i;
cout<<"请选择操作:"<<endl;
cout<<"----------1.屏幕输出当前日期"<<endl;
cout<<"----------2.比较两日期是否相等"<<endl;
cout<<"----------3.屏幕输出n天之后的日期"<<endl;
cout<<"----------4.打印当月月历"<<endl;
cout<<"----------5.退出程序"<<endl;
cout<<"您选择的操作是:";
cin>>op;
switch(op)
{
case'1':
cout<<"屏幕输出当前日期:"<<endl;
date.printDate();
break;
case'2':
cout<<"输入待比较的日期:"<<endl;
cin>>y>>m>>d;
date2.Init(y,m,d);
while(date2.isWrong())
{
cout<<"输入有误!请重新输入!"<<endl;
cin>>y>>m>>d;
date2.Init(y,m,d);
}
cout<<"屏幕输出待比较的日期:"<<endl;
date2.printDate();
if(date.equal(date2))
cout<<"此日期与当前日期相等!"<<endl;
else
cout<<"此日期与当前日期不等!"<<endl;
break;
case'3':
date3=date;
cout<<"输入在当前日期之上要增加的天数:"<<endl;
cin>>n;
for(i=0;i<n;i++)
{
date3.incrementDay();
}
cout<<"增加"<<n<<"天后的日期是:"<<endl;
date3.printDate();
break;
case'4':
date.yueli();
break;
case'5':
exit(1);
break;
default:
cout<<"您的操作有误,请重新选择操作!"<<endl;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -