【C++OJ_单继承】时钟模拟(继承)

【C++OJ_单继承】时钟模拟(继承)

题目描述

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

每行对应每组当前时间和经过秒数后计算得到的新时间(小时:分钟:秒)。

输入样例

2
8 19 20
20
23 30 0
1801

输出样例

8:19:40
0:0:1

参考代码

#include <iostream>
using namespace std;

class calculate //定义计数器类
{
protected:
    int value; //包含保护数据成员value

public:
    calculate(int V = 0) : value(V) {} //构造函数
    void increment() { value++; }      //公有函数increment计数加1
    friend class cclock;               //友元函数
};

class cycle : public calculate //定义循环计算器,继承计数器类
{
private:
    int min_value, max_value; // 增加私有数据成员:最小值min_value,max_value,
public:
    cycle(int V = 0, int I = 0, int A = 60) : calculate(V), min_value(I), max_value(A) {}
    void getvalue(int v)
    {
        value = v;
    }
    void changemax()
    {
        max_value = 24;
    }

    int increment(int d) //重写公有函数increment,使得value在min_value~max_value区间内循环+1。
    {//d为增加的秒数
        int cnt = 0;
        for (int i = 0; i < d; i++) 
        {
            value++;
            if (value >= max_value)
            {
                value -= max_value;
                cnt++;
            }
        }
        return cnt;
    }
    friend class cclock;
};

class cclock //定义时钟类//因为clock是系统内置函数,为了避免重名,请不要使用clock作为类名或者函数名
{
private:                        //数据成员是私有循环计数器对象
    cycle hour, minute, second; //小时hour、分钟minute、秒second

public:
    cclock(int H, int M, int S)
    {
        hour.getvalue(H);
        hour.changemax();
        minute.getvalue(M);
        second.getvalue(S);
    }
    void time(int delta) //公有函数time(int s)计算当前时间经过s秒之后的时间
    {                    //即hour,minute,second的新value值。
        int cnt = 0;
        cnt = second.increment(delta);
        cnt = minute.increment(cnt);
        hour.increment(cnt);
        cout << hour.value << ":" << minute.value << ":" << second.value << endl;
    }
};

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int h, m, s;
        cin >> h >> m >> s;//当前时间(小时 分钟 秒)
        //定义时钟类对象,输入当前时间和经过的秒数,调用time函数计算新时间。
        cclock B(h, m, s);
        int d;
        cin >> d;//经过的秒数
        B.time(d);
    }
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
程序清 按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。 (1) 添加表示年、月、日、时、分、秒的变量。 int year; int month; int day; int hour; int minute; int second; (2) 添加秒表的计数变量。 int watch; (3) 添加时钟的画笔及画刷变量。 CPen m_HouPen, m_MinPen, m_SecPen; // 各种针的画笔 CBrush m_MarkBrush; // 表盘标记的画刷 (4) 添加时钟控制变量。 CPoint m_Center; // 表的中心 double m_Radius; // 表的半径 CPoint m_Hour [2], m_OldHour [2]; // 时针当前及前一次位置 CPoint m_Minute [2], m_OldMin [2]; // 分针当前及前一次位置 CPoint m_Second [2], m_OldSec [2]; // 秒针当前及前一次位置 (5) 添加秒表的两个按钮位置变量。 CRect m_WatchStart; CRect m_WatchStop; (6) 添加两个函数,计算时钟各指针位置。 void SetClock (int hour, int minute, int second); CPoint GetPoint (int nLenth, int nValue); (7) 在视图类构造函数中增加初始化语句: CClockView::~CClockView() { //设定时间 year=2010; month=11; day=22; hour=0; minute=0; second=0; //设定画笔画刷 m_HouPen.CreatePen(PS_SOLID,5,RGB(255,0,0));//时针画笔 m_MinPen.CreatePen(PS_SOLID,3,RGB(0,0,250));//分针画笔 m_SecPen.CreatePen(PS_SOLID,1,RGB(0,0,0));//秒针画笔 m_MarkBrush.CreateSolidBrush(RGB(250,250,0)); //设定表芯位置 m_Center.x=222; m_Center.y=222; //设定时钟半径 m_Radius=222; //计算指针位置 SetClock(hour,minute,second); //设定秒表计数器及按钮位置 watch=0; m_WatchStart=CRect(480,310,560,340);//启动按钮 m_WatchStop=CRect(590,310,670,340);//停止按钮 } 编写指针位置函数SetClock和GETpOINT。 首先在ClockView.cpp文件头部下添加下面两行代码,以便进行数学计算。 #define PI 3.14159265258 #include"math.h" 然后添加下列代码: //计算个指针位置的函数 void CClockView::SetClock(int hour,int minute,int second) { hour=hour*5; hour=hour+minute/12; //保存时针原位置 m_OldHour[0]=m_Hour[0]; m_OldHour[1]=m_Hour[1];

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ferry_xie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值