题目

创建一个名为Date(日期)的类,包括了数据成员的三部分信息:月(类型int)、日(类型int)、年(类型int)这个类必须包括一个具有三个形参的构造函数,它使用这些参数初始化前述的3个数据成员。假定提供给年和日的值是正确的,但是需要保证月的值在1~12的范围内;如果该值不在此范围,那么将月设置为1. 对每个数据成员都提供一个设置函数和一个获取函数。提供一个成员函数displayDate,显示用正斜线(/)分隔的月、日和年的值。编写一个测试程序,演示Date类的性能。

实现代码

#include <iostream>
using namespace std;
class Date
{
   
public:
	Date(int yy, int mm, int dd)
	{
   
		YY = yy;
		MM = (mm >= 1 && mm <= 12) ? mm : 1;
		if (2 == mm)
		{
   
			bool leapYear = false;
			if (yy % 4 == 0)
			{
   
				if (yy % 100 == 0)
				{
   
					if (yy % 400 == 0)
						leapYear = true;
				}
				else
					leapYear = true;
			}
			DD = (dd >= 1 && dd <= 28 + leapYear) ? dd : 1;
		}
		else
		{
   
			bool isBig = true;
			int small[] = {
    4,6,9,11 };
			for (int i : small)
			{
   
				if (i == mm)
				{
   
					isBig = false;
					break;
				}
			}
			DD = (dd >= 1 && dd <= 30 + isBig) ? dd : 1;
		}
	}
	void setYY(int yy)
	{
   
		YY = yy;
	}
	int getYY()
	{
   
		return YY;
	}
	void setMM(int mm)
	{
   
		MM = (mm >= 1 && mm <= 12) ? mm : 1;
	}
	int getMM()
	{
   
		return MM;
	}
	void setDD(int dd)
	{
   
		if (2 == MM)
		{
   
			bool leapYear = false;
			if (YY % 4 == 0)
			{
   
				if (YY % 100 == 0)
				{
   
					if (YY % 400 == 0)
						leapYear = true;
				}
				else
					leapYear = true;
			}
			DD = (dd >= 1 && dd <= 28 + leapYear) ? dd : 1;
		}
		else
		{
   
			bool isBig = true;
			int small[] = {
    4,6,9,11 };
			for (int i : small)
			{
   
				if (i == MM)
				{
   
					isBig = false;
					break;
				}
			}
			DD = (dd >= 1 && dd <= 30 + isBig) ? dd : 1;
		}
	}
	int getDD()
	{
   
		return DD;
	}
	void displayDate()
	{
   

		cout << MM << '/' << DD << '/' << YY << endl;
	}
private:
	int YY;
	int MM;
	int DD;
};
int main()
{
   
	Date date(2021, 12, 31);
	date.displayDate();
	date.setMM(date.getMM() + 1);
	date.displayDate();
	date.setDD(date.getDD() + 1);
	date.displayDate();
	date.setYY(date.getYY() + 1);
	date.displayDate();
}

网上代码参考

#ifndef HEADER_DATE
#define HEADER_DATE
#include<ctime>
#include<iostream>
#include<iomanip>
using namespace std;
 
class date{
   
int year,month,day;
void init();
public:
static const int tians[];
int age();
int getyear()
int getmonth()
int getday()
date();
date(const string& s);
date(const date& d)
date(int y=2000,int m=1,int d=1);
bool isleapyear()const;
friend ostream& operator<<(ostream& o,const date& d);
double xg();
double xiangge(date b);
friend  date operator+=(date& a,int n);
friend bool operator==(date& a,date & b);
void display();
string huanyuan();
};
 
#endif
#include"date.h"
 
//日期的计算
const int date::tians[]=;
const long int year4=1461;
const long int year100=36524;
const long int year400=146097;
using namespace std;
 
void date::init(){
   
if(year>5000||month>12||day>31||day<1||month<1||year<1)
{
   cout<<"年月日范围出错!"<<endl;
exit(1);
}
}
date::date(int y,int m, int d):year(y),month(m),day(d){
   
 
init();
}
date::date(const string& s):da(s){
   
year=atoi(s.substr(0,4).c_str());
month=atoi(s.substr(5,2).c_str());
day=atoi(s.substr(8,2).c_str());
}
bool date::isleapyear()const{
   
if(year%4==0&& year%100!=0 ||year%400==0)
return true;
return false;
}
ostream& operator<<(ostream& o,const date& d){
   
o<<setfill('0')<<setw(4)<<d.year<<"-"<<setw(2)<<d.month<<"-"<<setw(2)<<d.day<<endl;
return o;
}
date operator+=(date& a,int n){
   
switch(a.month){
   
case 4:
case 6:
case 9:
case 11:else a.day+=n;if(a.month>12) break;}
case 2:
 
if((a.year%4==0 && a.year%100!=0 )||a.year%400==0)
 else a.day+=n;if(a.month>12)break;}
else {
   
if(a.day+n>28)else a.day+=n;if(a.month>12)}break;
}
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:else a.day+=n; if(a.month>12)}break; }
return a;
}
 
double date::xg(){
   
int days1[12]=;
long int sum1;            //4年一共1461天
sum1=year/400*year400+year%400/100*year100+year%400%100/4*year4+year%400%100%4*365;  //年份转换为天数所得
for(int i=0;i<12;i++)
if(month-1==i) sum1+=days1[i]+day;
return sum1;
}
double date::xiangge(date b){
   
return (xg()-b.xg());
}
bool operator==(date& a,date & b){
   
if(a.year==b.year && a.month==b.month&& a.day==b.day) return 1;
else return 0;
}
void date::display(){
   
cout<<day<<"-"<<month<<"-"<<year<<endl;
}
date::date(){
     //无参为系统时间
 time_t timer;
 struct tm* t_tm;
 time(&timer);
 t_tm=localtime(&timer);
  year=t_tm->tm_year+1900,
  month=t_tm->tm_mon+1,
  day=t_tm->tm_mday;
  }
int date::age(){
              //计算当前时间差
 time_t timer;
 struct tm* t_tm;
 time(&timer);
 t_tm=localtime(&timer);
 int y=t_tm->tm_year+1900,
  m=t_tm->tm_mon+1,
  d=t_tm->tm_mday;
 if(m<month||m==month&&d<day)return (year-y-1);
 else return (y-year);
}
string date::huanyuan(){
   
string m; char a1[10],b1[10], c1[10];
itoa(year, a1, 10);
itoa(month,b1, 10);
itoa(day, c1, 10);
m+=a1;
m+='/';
m+=b1;
m+='/';
m+=c1;
return m;
}