设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期

日期类的编制设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等(假定输入日期数据是合法的,... 日期类的编制
设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等(假定输入日期数据是合法的,考虑闰年的情况)。
用C++写,加一下注释
拜托了,谢谢
展开
 我来答
缪立军
2013-05-22 · TA获得超过384个赞
知道小有建树答主
回答量:257
采纳率:100%
帮助的人:172万
展开全部
#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平台
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式