设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期
日期类的编制设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等(假定输入日期数据是合法的,...
日期类的编制
设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等(假定输入日期数据是合法的,考虑闰年的情况)。
用C++写,加一下注释
拜托了,谢谢 展开
设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等(假定输入日期数据是合法的,考虑闰年的情况)。
用C++写,加一下注释
拜托了,谢谢 展开
展开全部
#include "stdio.h"
class Date
{
private:
int year,month,day;
public:
Date(){year=0;month=0;day=0;}//默认构造函数
Date(int x,int y,int z){year=x;month=y;day=z;}//重载构造函数
void add(int m);//加天数
void del(int m);//减天数
int diff(Date& q);//日期差
void display();//显示
};
void Date::add(int m)
{
int d[12]={31,28,31,30,31,30,31,31,30,31,30,31},temp,f;//d为12个月每个月天数的数组
f=0;
while (m>0)
{
if (year%100==0)
d[1] = (year%400==0?29:28);//如果是闰年,2月天数为29
else
d[1] = (year%4==0?29:28);//如果是闰年,2月天数为29
temp=d[month-1]-day;
if (temp>=m)//如果所加天数未超过当月剩余天数
{
day=day+m;
break;
}
m-=temp;
day=0;
month++;
for (;month<=12;month++)//开始月遍历进行日期计算
{
if (d[month-1]>=m)
{
day+=m;
break;
}
else
{
m-=d[month-1];
}
}
if (month<=12)//若所加天数在本年12月内
break;
month=1;//所加天数超过今天剩余天数,月初始化为1月,即从下年一月继续算
year++;//加一年
}
}
void Date::del(int m)//本函数注释与add基本相同
{
int d[12]={31,28,31,30,31,30,31,31,30,31,30,31},f;
f=0;
while (m>0)
{
if (year%100==0)
d[1] = (year%400==0?29:28);
else
d[1] = (year%4==0?29:28);
if (day>=m)
{
day=day-m;
break;
}
m-=day;
month--;
for (;month>=1;month--)
{
if (d[month-1]>=m)
{
day=d[month-1]-m;
break;
}
else
{
m-=d[month-1];
}
}
if (month>=1)
break;
month=12;
year--;
day=31;
}
}
int Date::diff(Date& q)
{
int differece;
int d[12]={31,28,31,30,31,30,31,31,30,31,30,31},m,i;
Date temp;
Date *pSmall,*pBig;
if (year==q.year)//如果年相同
{
if (month==q.month)//若月相同
{
differece = q.day-day;
}
else//月不同
{
if (month>q.month)//让pSmall指针指向小日期,pBig指针指向大日期
{
pSmall = &q;
pBig = this;
}
else
{
pSmall = this;
pBig = &q;
}
temp.month=pSmall->month;
temp.day=pSmall->day;
for (i=1;i<=366;i++)//每次加一天,看看加多少次,两个日期相同,加的次数即为相差的天数
{//由于年份相同,相差的天数必然不会大于366,实际循环次数不大于366
temp.add(1);
if (temp.month==pBig->month && temp.day==pBig->day)
{
differece=i;
break;
}
}
differece=(month>q.month?-differece:differece);
}
}
else//年份不同
{
if (year>q.year)//让pSmall指针指向小日期,pBig指针指向大日期
{
pSmall = &q;
pBig = this;
}
else
{
pSmall = this;
pBig = &q;
}
temp.year=pSmall->year;
temp.month=pSmall->month;
temp.day=pSmall->day;
m=pBig->year-pSmall->year;
for (i=(m-1)*365;i<=(m+1)*366;i++)//每次加一天,看看加多少次,两个日期相同,加的次数即为相差的天数
{//计算出年份差m后,两个日期的天数差必定在[(m-1)*365,(m+1)*366]范围内,实际循环的次数不大于2*366
temp.add(1);
if (temp.month==pBig->month && temp.day==pBig->day)
{
differece=i-(m-1)*365+1;
break;
}
}
differece=(year>q.year?-differece:differece);
}
return differece;
}
void Date::display()
{
printf("%d-%d-%d\n",year,month,day);
}
//主函数演示
void main()
{
Date d(2013,5,21);
printf("原日期t1:");
d.display();
d.add(73);
printf("t2=t1+73:");
d.display();
d.del(73);
printf("t3=t2-73:");
d.display();
printf("2013-5-21与2014-5-21日相差%d天\n",d.diff(Date(2014,5,21)));
}
主函数演示结果
写了挺久,里面也用到一些比较巧妙的处理办法,程序里也作了适当的注释,有问题可以问我,没问题的话望采纳!
更多追问追答
追问
奇怪为什么会报错
追答
报什么错,给出来哦,我这里运行完全没问题的,vc6.0平台
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询