设计符合下述要求的日期类(Date),使得下述代码可以正常运行。
- 拥有数据成员year、month和day,分别存储年、月、日;
- 构造函数接受年、月、日参数并初始化全部数据成员;
- 公有成员函数toText()返回一个string对象,该字符串为该日期对象的文字表达,比如“2022-5-20”;
- 公有成员函数nextDay()返回一个Date对象,表示该日期的后一天;
- 公有成员函数prevDay()返回一个Date对象,表示该日期的前一天。
输入样例:
2000 3 1
说明:依次是年-月-日。
输出样例:
Date: 2000-3-1, Next Day: 2000-3-2, Prev Day: 2000-2-29
#include<iostream>
#include<string>
#include<assert.h>
using namespace std;
//在此定义Date类
int main(){
int year=2000,month=1,day=1;
cin>> year>>month>>day;
Date d(year,month,day);
cout<<"Date: "<<d.toText();
cout<<", Next Day: "<<d.nextDay().toText();
cout<<", Prev Day: "<<d.prevDay().toText();
return 0;
}
上为裁判测试程序样例。
class Date{
private:
//private可加可不加
int year,month,day;
public:
Date(int y=2000,int m=3,int d=1):year(y),month(m),day(d){}
//声明有默认参数的构造函数
bool leap(int y){
if(!(y%400)||!(y%4)&&y%100){
return true;
}
else return false;
}
//判断平或闰
Date nextDay();
Date prevDay();
//后一天和前一天
string toText();
};
先创建一个Date类。
string Date::toText(){
char t[32];
sprintf(t,"%d-%d-%d",year,month,day);
//输出到字符数组中
return t;
}
Date Date::nextDay(){
Date N;
int md[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//平年每月的天数
if(leap(year)) md[2]=29;
/*
三种情况
1 后一天仍然在同一月内
2 后一天是下个月第一天
3 后一天是下一年第一天
*/
if(day+1<=md[month]){
N.day=day+1;
N.month=month;
N.year=year;
}
else if(month<12){
N.day=1;
N.month=month+1;
N.year=year;
}
else if(month==12){
N.day=1;
N.month=1;
N.year=year+1;
}
return N;
}
Date Date::prevDay(){
Date P;
int md[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(leap(year)) md[2]=29;
//判断是否是闰年
/*
三种情况
1 前一天仍然在同一月内
2 前一天是上个月最后一天
3 前一天是上一年最后一天
*/
if(day-1>1){
P.day=day-1;
P.month=month;
P.year=year;
}
else if(month>1){
P.day=md[month-1];
P.month=month-1;
P.year=year;
}
else if(month==1){
P.day=31;
P.month=12;
P.year=year-1;
}
return P;
}
将函数补充完整即可。