请设计编写一个表示时间的类Time。要求如下:
1)类内有三个私有成员,分别表示时、分、秒。注意取值范围分别是0..23,0..59,0..59。
2)编写默认构造函数,构造一个表示0:0:0的时间。
3)编写一个带参数的构造函数,通过参数初始化三个成员变量。
4)编写一个只有一个参数的构造函数,参数表示从0点开始计时的秒数,根据这个秒数初始化成员变量。比如:34412s对应的时间为9:33:32。
5)编写拷贝构造函数。
6)重载拷贝赋值运算。
7)为三个私有成员分别编写setter和getter函数。
8)编写三个函数adjustHour, adjustMinute, adjustSecond,用于调节时分秒。三个函数的参数分别代表时分秒的调节量,正数表示增加,负数表示减少。比如Time t(1,0,0);表示1:0:0,t.adjustHour(3);得到的t为4:0:0。t.adjustMinute(-10);得到的t为3:50:0。
9)编写一个公有成员函数toSeconds,返回当前时分秒换算为距离0点的秒数。
10)重载减法运算符operator-,计算两个时间相差的秒数。
11)重载关系运算符operator>,比较两个时间的先后。
12)编写一个显式时间的公有成员函数show(bool pm);其中pm=true,表示按照上午下午时间显式,否则按照24小时时间显示。比如13:25:36,用PM模式显示为:PM 1:25:36.
13)编写main函数测试你编写的类。
#include <iostream>
using namespace std;
class Time
{
private:
int hour, minute, second;
public:
Time() : hour(0), minute(0), second(0) {}
Time(int h, int m, int s) : hour(h), minute(m), second(s) {}
Time(int s)
{
hour = s / 3600;
minute = (s % 3600) / 60;
second = (s % 3600) % 60;
}
Time(const Time &t) : hour(t.hour), minute(t.minute), second(t.second) {}
Time &operator=(const Time &t)
{
if (this != &t)
{
this->hour = t.hour;
this->minute = t.minute;
this->second = t.second;
}
return *this;
}
void setHour(int h) { hour = h; }
void setMinute(int m) { minute = m; }
void setSecond(int s) { second = s; }
int getHour() { return hour; }
int getMinute() { return minute; }
int getSecond() { return second; }
void adjustHour(int h)
{
if (hour + h > 24)
hour = hour - 24 + h;
else if (hour + h < 0)
hour = hour + 24 + h;
else
hour += h;
}
void adjustMinute(int m)
{
if (minute + m < 0)
{
hour--;
minute = minute + 60 + m;
return;
}
else if (minute + m >= 60)
{
hour++;
minute = minute - 60 + m;
return;
}
else
minute += m;
}
void adjustSecond(int s)
{
if (second + s < 0)
{
minute--;
second = second + 60 + s;
return;
}
else if (second + s >= 60)
{
minute++;
second = second - 60 + s;
return;
}
else
second += s;
}
int toSeconds() { return hour * 3600 + minute * 60 + second; }
void show(bool pm = false)
{
if (!pm)
cout << getHour() << ":" << getMinute() << ":" << getSecond() << endl;
else if (getHour() > 12)
cout << "PM " << getHour() - 12 << ":" << getMinute() << ":" << getSecond() << endl;
else
cout << "AM " << getHour() << ":" << getMinute() << ":" << getSecond() << endl;
}
};
int operator-(Time &t1, Time &t2)
{
int s1 = t1.toSeconds();
int s2 = t2.toSeconds();
return s1 - s2 > 0 ? s1 - s2 : s2 - s1;
}
bool operator>(Time &t1, Time &t2)
{
if (t1.getHour() > t2.getHour())
return true;
else if (t1.getHour() == t2.getHour() && t1.getMinute() > t2.getMinute())
return true;
else if (t1.getHour() == t2.getHour() && t1.getMinute() == t2.getMinute() && t1.getSecond() > t2.getSecond())
return true;
return false;
}
int main()
{
Time t(17, 23, 35);
t.show();
t.adjustHour(16);
t.adjustMinute(10);
t.adjustSecond(-3);
t.show(true);
int s = t.toSeconds();
Time t1(s);
t1.show();
Time t2(t);
t2.adjustHour(1);
t2.show();
int elapsed = t2 - t1;
cout << "t2-t1=" << elapsed << "s" << endl;
cout << (t2 > t1 ? "t2>t1" : "t2<t1") << endl;
return 0;
}