题目描述
小明同学有着严重的拖延症,每次老师布置的作业都要到快要截止的时候才会开始动手完成,因此现在有着许许多多的作业完成。你是小明的好朋友,请帮小明找出最紧急的作业(即最早截止的作业)。
要求如下:
1.定义一个日期类Date,包括三个protected成员数据year,month,day;
2.定义一个时间类Time,包括三个protected成员数据hour,minute,second(12小时制);
3.以Date类和Time类为基类,创建一个作业类Work,包括新增成员:int ID;作业的ID
4.定义一个友元函数bool before(const Work& w1,const Work& w2);//判断作业w1的时间是否早于作业w2的时间。
输入
输入若干作业,每个作业占一行(作业ID 年 月 日 时 分 秒)
当输入0时结束,相应的结果不要输出。
输出
时间最靠前的作业。
输入样例1
1 2021 9 25 4 5 6
2 2020 6 13 5 7 8
3 2021 8 21 6 7 9
5 2022 7 8 9 10 11
4 2021 7 26 5 25 30
0
输出样例1
The urgent Work is No.2: 2020/06/13 05:07:08
思路分析
根据输出我们可以知道,没有办法用数组排序的方法去做,因为不知道有多少个。
所以只能读取一个比较一个,我们把第一个读取的作为最早的作业的,然后后面每读取一个都与之做判断,用友元函数before去比较,发现更早的就把新的赋值给旧的,最后输出。
我们把友元函数before写成像sort函数排序规则那样,从年份开始判断,相等的再判断月份,依次到日、小时、分组、秒。
AC代码
#include<iostream>
#include"iomanip"
#include<string>
using namespace std;
class Date
{
protected:
int year,month,day;
public:
Date(int year,int month,int day):year(year),month(month),day(day){}
};
class Time
{
protected:
int hour,minute,second;
public:
Time(int hour,int minute,int second):hour(hour),minute(minute),second(second){}
};
class Work:public Date,public Time
{
protected:
int ID;
public:
Work(int ID,int year,int month,int day,int hour,int minute,int second):ID(ID),Date(year,month,day),Time(hour,minute,second){}
void print(){cout<<"The urgent Work is No."<<ID<<": "<<year<<"/"<<setw(2)<<setfill('0')<<month<<"/"<<setw(2)<<setfill('0')<<day<<' '<<setw(2)<<setfill('0')<<hour<<':'<<setw(2)<<setfill('0')<<minute<<':'<<setw(2)<<setfill('0')<<second<<endl;}
friend bool before(const Work&w1,const Work&w2);
};
bool before(const Work & w1,const Work & w2)
{
if(w1.year<w2.year)
return 1;
else if(w1.year>w2.year)
return 0;
if(w1.month<w2.month)
return 1;
else if(w1.month>w2.month)
return 0;
if(w1.day<w2.day)
return 1;
else if(w1.day>w2.day)
return 0;
if(w1.hour<w2.hour)
return 1;
else if(w1.hour>w2.hour)
return 0;
if(w1.minute<w2.minute)
return 1;
else if(w1.minute>w2.minute)
return 0;
if(w1.second<w2.second)
return 1;
else if(w1.second>w2.second)
return 0;
}
int main()
{
int ID,year,month,day,hour,minute,second;
cin>>ID>>year>>month>>day>>hour>>minute>>second;
Work w1(ID,year,month,day,hour,minute,second);
while(1)
{
cin>>ID;
if(ID==0)
break;
cin>>year>>month>>day>>hour>>minute>>second;
Work w2(ID,year,month,day,hour,minute,second);
if(before(w1,w2)==0)
w1=w2;
}
w1.print();
}