题目
创建一个名为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;
}