#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

// 声明遥控器类
class Remote;

// 定义电视类
class Television
{
    friend class Remote;

public:
    enum
    {
        On, // 电视开关状态
        Off
    };
    enum
    {
        minVol,
        maxVol = 100 // 音量从 0 到 100
    };
    enum
    {
        minChannel = 1,
        maxChannel = 255 // 频道范围 1 到 255
    };

    Television()
    {
        mStatus = Off;         // 状态
        mVolume = minVol;      // 声音
        mChannel = minChannel; // 频道
    }

public:
    void power() // 开关机
    {
        this->mStatus = (this->mStatus == On ? Off : On);
    }

    void VolumeUp() // 调高音量
    {
        if (this->mVolume >= maxVol)
            return;
        this->mVolume++;
    }

    void VolumeDown() // 调低音量
    {
        if (this->mVolume <= minVol)
            return;
        this->mVolume--;
    }

    void ChannelUp() // 向上更换电视频道
    {
        if (this->mChannel >= maxChannel)
            return;
        this->mChannel++;
    }

    void ChannelDown() // 向下更换电视频道
    {
        if (this->mChannel <= minChannel)
            return;
        this->mChannel--;
    }

    void ShowTeleState() // 展示当前电视状态信息
    {
        cout << "开机状态: " << (mStatus == On ? "已开机" : "已关机") << endl;
        if (mStatus == On)
        {
            cout << "当前音量: " << mVolume << endl;
            cout << "当前频道: " << mChannel << endl;
        }
        cout << "----------------------" << endl;
    }

private:
    int mStatus;  // 电视状态
    int mVolume;  // 声音
    int mChannel; // 频道
};

// 定义遥控器
class Remote
{
public:
    Remote(Television *tv) // 构造函数
    {
        pTV = tv;
    }

public:
    void power() // 开关机
    {
        pTV->power();
    }

    void VolumeUp() // 调高音量
    {
        pTV->VolumeUp();
    }

    void VolumeDown() // 调低音量
    {
        pTV->VolumeDown();
    }

    void ChannelUp() // 向上更换电视频道
    {
        pTV->ChannelUp();
    }

    void ChannelDown() // 向下更换电视频道
    {
        pTV->ChannelDown();
    }

    // 设置频道，遥控器新增功能
    void SetChannel(int channel)
    {
        if (channel < Television::minChannel || channel > Television::maxChannel)
            return;
        pTV->mChannel = channel;
    }

    void ShowTeleState() // 展示当前电视状态信息
    {
        pTV->ShowTeleState();
    }

private:
    Television *pTV;
};

// 直接操作电视
void test01()
{
    Television tv;
    tv.ShowTeleState();
    tv.power();    // 开机
    tv.VolumeUp(); // 音量 +1
    tv.VolumeUp();
    tv.VolumeUp();
    tv.VolumeUp();
    tv.ChannelUp(); // 频道 +1
    tv.ChannelUp();
    tv.ShowTeleState();
}

// 通过遥控器操作电视
void test02()
{
    // 创建电视
    Television tv;

    // 创建遥控器
    Remote rmt(&tv);

    rmt.ShowTeleState();
    rmt.power();    // 开机
    rmt.VolumeUp(); // 音量 +1
    rmt.VolumeUp();
    rmt.VolumeUp();
    rmt.VolumeUp();
    rmt.ChannelUp(); // 频道 +1
    rmt.ChannelUp();
    rmt.SetChannel(100);
    rmt.ShowTeleState();
}

int main()
{
    // test01();
    test02();
    return 0;
}
