题目描述
定义计数器类,包含保护数据成员value,公有函数increment计数加1。
定义循环计算器继承计数器类,增加私有数据成员:最小值minValue,maxValue,
重写公有函数increment,使得value在minValue~maxValue区间内循环+1。
定义时钟类,数据成员是私有循环计数器对象小时hour、分钟minute、秒second,公有函数time(int s)计算当前时间经过s秒之后的时间,即hour,minute,second的新value值。
定义时钟类对象,输入当前时间和经过的秒数,调用time函数计算新时间。
根据题目要求,增加必要的构造函数、析构函数和其他所需函数。
因为clock和time是系统内置函数,为了避免重名,请不要使用clock或者time作为类名或者函数名
输入
第一行测试次数n
2行一组,第一行为当前时间(小时 分钟 秒),第二行为经过的秒数。
输出
输出n行
每行对应每组当前时间和经过秒数后计算得到的新时间(小时:分钟:秒)。
输入样例
2
8 19 20
20
23 30 0
1801
输出样例
8:19:40
0:0:1
参考代码
#include<iostream>
using namespace std;
//计数器类
class Counter {
protected:
int value;
public:
Counter(int v=0):value(v){}
virtual void increment() {
value++;
}
int getValue() { return value; }
};
//循环计数器继承计数器类,设定范围
class CyclicCounter :public Counter {
private:
int minValue;
int maxValue;
public:
CyclicCounter(int min, int max, int v = 0)
:Counter(v),minValue(min),maxValue(max){}
void increment() {
value++;
if (value > maxValue) {
value = minValue;
}
}
};
//时钟类,成员是循环计数器对象
class MyClock {
private:
CyclicCounter hour;
CyclicCounter minute;
CyclicCounter second;
public:
MyClock(int h,int m,int s)
:hour(0,23,h),minute(0,59,m),second(0,59,s){}
void advance(int s) {
for (int i = 0; i < s; ++i) {
second.increment();
if (second.getValue() == 0) {
minute.increment();
if (minute.getValue() == 0) {
hour.increment();
}
}
}
}
void print() {
cout << hour.getValue() << ":"
<< minute.getValue() << ":"
<< second.getValue() << endl;
}
};
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int h, m, s, duration;
cin >> h >> m >> s;
MyClock clock(h, m, s);
cin >> duration;
clock.advance(duration);
clock.print();
}
return 0;
}
笔记
时间计算的边界条件处理(如秒钟从59跳到0)
void increment() {
value++;
if (value > maxValue) {
value = minValue;
}
}
void advance(int s) {
for (int i = 0; i < s; ++i) {
second.increment();
if (second.getValue() == 0) {
minute.increment();
if (minute.getValue() == 0) {
hour.increment();
}
}
}
}