时钟模拟(继承)

题目描述

定义计数器类,包含保护数据成员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代码

#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();
	}
}
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaolinYe(叶茂林)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值