目录
一、题目:
二、代码实现:
#include <iostream>
using namespace std;
class Count {
protected:
int value;
public:
Count(int v) {
value = v;
}
void increment() {
value++;
}
};
class forCount:public Count {
private:
int minValue = 0, maxValue = 0;
public:
forCount(int v,int min,int max):Count(v){
minValue = min;
maxValue = max;
}
int increment() {
value++;
if (value >= maxValue) {
value = minValue;
return 1;
}
return 0;
}
void print() {
cout << value;
}
};
class Clock {
private:
forCount hour, minute, second;
public:
Clock(int h, int m, int s) :hour(h,0,24), minute(m,0,60), second(s,0,60) {
}
void Time(int t) {
while (t--) {
if (second.increment() == 1) {
if (minute.increment() == 1) {
hour.increment();
}
}
}
}
void printt() {
hour.print();
cout << ':';
minute.print();
cout << ':';
second.print();
cout << endl;
}
};
int main()
{
int n;
cin >> n;
int h, m, s, t;
while (n--) {
cin >> h >> m >> s >> t;
Clock example(h,m,s);
example.Time(t);
example.printt();
}
return 0;
}
三、题目与代码分析:
1、代码概述:
代码首先导入头文件,接着按照题目要求定义了Count类。接下来定义了forCount类继承自Count类,按照题目要求增加了私有属性minValue,maxValue,以及定义了构造函数、重新定义了increment函数和增加了print函数。然后定义Clock类。Clock类的私有属性为三个forCount类:hour,montue,second。在Clock类的public中定义了构造函数和Time函数以及printt函数。最后是主函数的实现,输入的n为测试样例,输入的h,m,s,t分别是当前时间的小时、分钟、秒和经过的时间。
2、分析:
1、如果没有限制题目很简单。
如果本题那么多没有限制,那问题将会十分简单,30行以内的代码就能实现。
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--) {
int h, m, s, t;
cin >> h >> m >> s >> t;
int hcopy = h, mcopy = m, scopy = s;
s = (scopy + t) % 60;
m = (mcopy + t / 60) % 60;
h = (hcopy + (mcopy + t / 60) / 60) % 24;
cout << h << ":" << m << ":" << s << endl;
}
return 0;
}
2、让问题有意思的点恰恰在于题目要求类的实现
但题目却要求以类的形式实现,这使得问题变得有意思起来。
从main函数的while循环的主体说起:
while (n--) {
cin >> h >> m >> s >> t;
Clock example(h,m,s);
example.Time(t);
example.printt();
}
输入h,m,s,没有什么好说的·。接下来是创建一个Clock类对象,Clock类代码如下:
class Clock {
private:
forCount hour, minute, second;
public:
Clock(int h, int m, int s) :hour(h,0,24), minute(m,0,60), second(s,0,60) {
}
void Time(int t) {
while (t--) {
if (second.increment() == 1) {
if (minute.increment() == 1) {
hour.increment();
}
}
}
}
void printt() {
hour.print();
cout << ':';
minute.print();
cout << ':';
second.print();
cout << endl;
}
};
创建Clock类对象example,调用了Clock构造函数。在Clock构造函数的初始化列表中初始化三个forCount对象。forCount类构造函数第一个参数是初始化value。hour对象的value是当前小时,mintue对象的value是当前分钟,second对象的value是当前秒数。
3、time函数的实现
time函数的参数t是走过的时间,while(t--)使得时间一秒一秒的走,接下来是
if (second.increment() == 1)这个判断语句,second对象调用成员函数increment:
int increment() {
value++;
if (value >= maxValue) {
value = minValue;
return 1;
}
return 0;
}
实现秒数value加一,在increment中判断秒数value是否大于60(maxValue),如果大于60,返回1,秒数value变成0。那么在time函数中,if (second.increment() == 1)条件语句成立,执行
if (minute.increment() == 1)语句,实现分钟value加一,在increment中判断分钟value是否大于60(maxValue),如果大于60,返回1,分钟value变成0。那么在time函数中,由于返回值为1,if(second.increment() == 1)条件语句成立,执行语句hour.increment();。实现小时value加一,在increment中判断小时value是否大于60(maxValue),如果大于24,返回1,小时value变成0。
四、有意思的点,类的模拟
想象一个时钟,秒针转一圈(60s),分针转一刻度(1min),分针转一圈(60min),时针转一刻度(1h)。在代码中,对象second模拟的是秒针,对象mintue模拟的是分针,对象hour模拟的是时针。