【id:301】【20分】D. 拯救小明(多继承+友元)

题目描述

小明同学有着严重的拖延症,每次老师布置的作业都要到快要截止的时候才会开始动手完成,因此现在有着许许多多的作业完成。你是小明的好朋友,请帮小明找出最紧急的作业(即最早截止的作业)。

要求如下:

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的条件分析下犯不着头脑,除此之外,该段代码清晰明了,简单易懂。

如有代码问题或者错误,抑或是有更清晰明了的方法,请大家多多指教!!!!

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值