时钟模拟(继承)

2023-07-30 09:53:30 浏览数 (1)

题目描述

定义计数器类,包含保护数据成员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();
	}
}

0 人点赞