快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

C++习题与解析(重载)

    05.设计一个日期类Date,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、一日期减去天数、两日期相差的天数等。
    解:
    在Date类中设计如下重载运算符函数:
    Date operator+(int days); 返回一日期加一天数得到的日期
    Date operator-(int days); 返回一日期减去天数得到的日期
    int operator-(Date &b); 返回两日期相差的天数
    在实现这些重载运算符函数调用以下私有成员函数:
    leap(int); 判断指定的年份是否为闰年
    dton(Date &); 将指定日期转换为从0年0月0日起的天数
    ntod(int); 将指定的0年0月0日起的天数转换为对应的日期
    本题程序如下:
    #include<iostream.h>
    int day_tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
    {31,29,31,30,31,31,30,31,30,31}};
    // day_tab 二维数组存放各月天数,第一行对应非闰年,第二行对应闰年
    class Date
    {
    int year,month,day;
    int leap(int);
    int dton(Date &);
    Date ntod(int);
    public:
    Date(){}
    Date(int y,int m,int d)
    {
    year=y;month=m;day=d;
    }
    void setday(int d){day=d;}
    void setmonth(int m){month=m;}
    void setyear(int y){year=y;}
    int getday(){return day;}
    int getmonth(){return month;}
    int getyear(){return year;}
    Date operator+(int days)
    {
    static Date date;
    int number=dton(*this)+days;
    date=ntod(number);
    return date;
    }
    Date operator-(int days)
    {
    static Date date;
    int number=dton(*this);
    number-=days;
    date=ntod(number);
    return date;
    }
    int operator-(Date &b)
    {
    int days=dton(*this)-dton(b)-1;
    return days;
    }
    void disp()
    {
    cout<<year<<"."<<month<<"."<<day<<endl;
    }
    };
    int Date::leap(int year)
    {
    if(year%4==0&&year%100!=0year%400==0) // 是闰年
    return 1;
    else // 不是闰年
    return 0;
    }

    int Date::dton(Date &d)
    {
    int y,m,days=0;
    for(y=1;y<=d.year;y++)
    if(leap(y))
    days+=366;
    else
    days+=365;
    for(m=0;m<d.month-1;m++)
    if(leap(d.year))
    days+=day_tab[1][m];
    else
    days+=day_tab[0][m];
    days+=d.day;
    return days;
    }
    Date Date::ntod(int n)
    {
    int y=1,m=1,d,rest=n,lp;
    while(1)
    {
    if(leap(y))
    {
    if(rest<=366)
    break;
    else
    rest-=366;
    }
    else
    {
    if(rest<=365)
    break;
    else
    rest-=365;
    }
    y++;
    }
    y--;
    lp=leap(y);
    while(1)
    {
    if(lp)
    {
    if(rest>day_tab[1][m-1])
    rest-=day_tab[1][m-1];
    else
    break;
    }
    else
    {
    if(rest>day_tab[0][m-1])
    rest-=day_tab[0][m-1];
    else
    break;
    }
    m++;
    }
    d=rest;
    return Date(y,m,d);
    }
    void main()
    {
    Date now(2002,6,12),then(2003,2,10);
    cout<<"now:"; now.disp();
    cout<<"then:"; then.disp();
    cout<<"相差天数:"<<(then-now)<<endl;
    Date d1=now+100,d2=now-100;
    cout<<"now+100:"; d1.disp();
    cout<<"now-100:"; d2.disp();
    }

    本程序的执行结果如下:
    now:2002.6.12
    then:2003.2.10
    相差天数:242
    now+100:2002.9.20
    now-100:2002.3.4

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论