题目描述
定义计数器类,包含保护数据成员value,公有函数increment计数加1。
定义循环计算器继承计数器类,增加私有数据成员:最小值min_value,max_value,
重写公有函数increment,使得value在min_value~max_value区间内循环 1。
定义时钟类,数据成员是私有循环计数器对象小时hour、分钟minute、秒second,公有函数time(int s)计算当前时间经过s秒之后的时间,即hour,minute,second的新value值。
定义时钟类对象,输入当前时间和经过的秒数,调用time函数计算新时间。
根据题目要求,增加必要的构造函数、析构函数和其他所需函数。
因为clock是系统内置函数,为了避免重名,请不要使用clock作为类名或者函数名
输入
第一行测试次数n
2行一组,第一行为当前时间(小时 分钟 秒),第二行为经过的秒数。
输出
输出n行
每行对应每组当前时间和经过秒数后计算得到的新时间(小时:分钟:秒)。
输入样例1
2 8 19 20 20 23 30 0 1801
输出样例1
8:19:40 0:0:1
思路分析
这道题有点东西,总体看题目你会发现应该是要我们算多少秒之后的时间,但是细细品读题目要求,你就会一脸茫然,这里有三个类,这个循环计算器是干什么的,它的成员函数increment又是干什么的,value在min_value~max_value区间内循环 1是什么意思,注意到这句话:定义时钟类,数据成员是私有循环计数器对象小时hour、分钟minute、秒second,是说hour、minute和second这三个是循环计数器对象的,这就清楚了,increment函数就是实现加一的操作,循环加一就是在一个区间内加一,比如hour是0~24,24加一应该是0,这就叫循环。
所以这里应该还涉及到进位,当value加一之后为0,那么就应该进位了。
AC代码
代码语言:javascript复制#include"iostream"
using namespace std;
class Counter
{
protected:
int value;
public:
Counter(int v):value(v){}
void increment(){value ;}
int getvalue(){return value;}
};
class Cyclecounter:public Counter
{
private:
int min_value,max_value;
public:
Cyclecounter(int minv,int maxv,int v):min_value(minv),max_value(maxv),Counter(v){}
void increment()
{
if( value==max_value)
value=min_value;
}
};
class CLOCK
{
private:
Cyclecounter hour,minute,second;
public:
CLOCK(int h,int m,int s):hour(0,24,h),minute(0,60,m),second(0,60,s){}
void time(int s)
{
while(s--)
{
second.increment();
if(second.getvalue()==0)
{
minute.increment();
if(minute.getvalue()==0)
hour.increment();
}
}
}
void showoff(){cout<<hour.getvalue()<<':'<<minute.getvalue()<<':'<<second.getvalue()<<endl;}
};
int main()
{
int t,hour,min,sec,s;
cin>>t;
while(t--)
{
cin>>hour>>min>>sec>>s;
CLOCK Clock(hour,min,sec);
Clock.time(s);
Clock.showoff();
}
}