题目描述
小明同学有着严重的拖延症,每次老师布置的作业都要到快要截止的时候才会开始动手完成,因此现在有着许许多多的作业完成。你是小明的好朋友,请帮小明找出最紧急的作业(即最早截止的作业)。
要求如下:
1.定义一个日期类Date,包括三个protected成员数据year, month, day;
2.定义一个时间类Time,包括三个protected成员数据hour, minute, second(24小时制);
3.以Date类和Time类为基类,创建一个作业类Work,包括新增成员:int id; // 作业的id
4.定义一个友元函数bool before(const Work& w1,const Work& w2); // 判断作业w1的时间是否早于作业w2的时间。
输入
输入若干作业,每个作业占一行(作业id 年 月 日 时 分 秒)
当输入0时结束,相应的结果不要输出。
输出
时间最靠前的作业。
灵感来源
我曾经在做这道题目是也是为日期的比较犯不着头脑,(实在不想用if,else if去分情况讨论),而后在编程老师的指点下,我发现可以将年月日转换为一个具体的数值进行比较。如2024/05/25可转换为2024*10000+5*100+25*1;这一步为解题的关键所在。
接下来直接亮出我们关于年月日时分秒比较的题目的相关代码:
#include <iostream>
#include<cmath>
#include<iomanip>
using namespace std;
class Date {
protected:
int year;
int month;
int day;
public:
Date(int y, int m, int d) {
year = y;
month = m;
day = d;
}
};
class Time {
protected:
int hour;
int minute;
int second;
public:
Time(int h, int m, int s) {
hour = h;
minute = m;
second = s;
}
};
class Work :public Date, public Time {
int id;
public:
Work(int i, int y, int m, int d, int h, int mm, int s) :id(i),Date(y, m, d), Time(h, mm, s) {
}
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;
}
friend bool before(const Work& w1, const Work& w2);
};
bool before(const Work& w1, const Work& w2) {
long long a, b;//用long long,因字节数过长
a = w1.year * pow(10, 10) + w1.month * pow(10, 8) + w1.day * pow(10, 6) + w1.hour * pow(10, 4) + w1.minute * 100 + w1.second;
b= w2.year * pow(10, 10) + w2.month * pow(10, 8) + w2.day * pow(10, 6) + w2.hour * pow(10, 4) + w2.minute * 100 + w2.second;//直接将两个时间点转换为数字进行比较
return (a<b);
}//解出该题的关键代码
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();
}
在此,我将一个时间节点转换为一个数值=year*10的10次方+month*10的8次方+day*10的6次方+hour*10的4此方+minute*10的2次方+second。通过此方法,相较于else if的方法,可以节约不少代码行数,且不需要为elseif的条件分析下犯不着头脑,除此之外,该段代码清晰明了,简单易懂。
如有代码问题或者错误,抑或是有更清晰明了的方法,请大家多多指教!!!!