C++实现时钟一秒一秒走,第一次觉得题目那么有意思。

目录

一、题目:

 二、代码实现:

三、题目与代码分析:

1、代码概述:

2、分析:

1、如果没有限制题目很简单。

 2、让问题有意思的点恰恰在于题目要求类的实现

3、time函数的实现

四、有意思的点,类的模拟


一、题目:

e826a2bb6d9a4e36b7341ad41dba2424.png

4b23cf4a077149f083d73f73b7608e62.png

 二、代码实现:

#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模拟的是时针。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代码别跑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值