一、问题及代码
- #include<iostream>
- #include<iomanip>
- #include<cstdlib>
- using namespace std;
- class Date; //对Date类的提前引用声明
- class Time
- {
- public:
- Time(int,int,int);
- void add_a_second(Date &); //增加1秒,1秒后可能会到了下一天,乃到下一月、下一年
- void display(Date &); //显示时间,格式:月/日/年 时:分:秒
- private:
- int hour;
- int minute;
- int sec;
- };
- class Date
- {
- public:
- Date(int,int,int);
- friend class Time; //Time为Date的友元类
- private:
- int month;
- int day;
- int year;
- };
- int main( )
- {
- Time t1(23,59,32);
- Date d1(12,31,2013); //测试时,再试试Date d1(2,28,2013)会如何
- for(int i=0; i<=100; i++)
- {
- t1.add_a_second(d1);
- t1.display(d1);
- }
- Time t2(23,59,30);
- Date d2(2,29,2012);
- for(i=0;i<=100;i++)
- {
- t2.add_a_second(d2);
- t2.display(d2);
- }
- return 0;
- }
- //下面定义两个类中的成员函数,要求不得再增加成员函数
- //注意体会在Time的成员函数中可以调用Date类的私有数据成员
- Time::Time(int x,int y,int z)
- {
- if(x<0||x>=24||y<0||y>=60||z<0||z>=60)
- {
- cout<<"设置时间错误!"<<endl;
- exit(0);
- }
- else
- {
- hour=x;
- minute=y;
- sec=z;
- }
- }
- Date::Date(int x,int y,int z)
- {
- if(x==4||x==6||x==9||x==11)
- {
- if(y<1||y>30)
- exit(0);
- else
- {
- month=x;
- day=y;
- year=z;
- }
- }
- else
- if(x==2)
- {
- if(z%400==0||z%4==0&&z%100!=0)
- {
- if(y<1||y>29)
- exit(0);
- else
- {
- month=x;
- day=y;
- year=z;
- }
- }
- else
- {
- if(y<1||y>28)
- exit(0);
- else
- {
- month=x;
- day=y;
- year=z;
- }
- }
- }
- else
- {
- if(y<1||y>31)
- exit(0);
- else
- {
- month=x;
- day=y;
- year=z;
- }
- }
- }
- void Time::add_a_second(Date &p) //增加1秒,1秒后可能会到了下一天,乃到下一月、下一年
- {
- sec++;
- if(sec==60)
- {
- sec=0;
- minute++;
- if(minute==60)
- {
- minute=0;
- hour++;
- }
- }
- if(hour==24)
- {
- hour=0;
- if(p.month==2)
- {
- if(p.year%400==0||p.year%4==0||p.year%100!=0)
- {
- if(p.day==29)
- {
- p.day=1;
- p.month++;
- }
- else
- p.day++;
- }
- else
- {
- if(p.day==28)
- {
- p.day=1;
- p.month++;
- }
- else
- p.day++;
- }
- }
- else
- if(p.month==4||p.month==6||p.month==9||p.month==11)
- {
- if(p.day==30)
- {
- p.day=1;
- p.month++;
- }
- else
- p.day++;
- }
- else
- if(p.month==12)
- {
- if(p.day==31)
- {
- p.day=1;
- p.month=1;
- p.year++;
- }
- else
- p.day++;
- }
- else
- {
- if(p.day==31)
- {
- p.day=1;
- p.month++;
- }
- else
- p.day++;
- }
- }
- }
- void Time::display(Date &p)
- {
- cout<<setfill('0')<<setw(2)<<p.month<<'/'<<setfill('0')<<setw(2)<<p.day<<'/'<<p.year;
- cout<<" "<<setfill('0')<<setw(2)<<hour<<':'<<setfill('0')<<setw(2)<<minute<<':'<<setfill('0')<<setw(2)<<sec<<endl;
- }
二、运行结果