📜  门| GATE-CS-2017(Set 1)|第52章(1)

📅  最后修改于: 2023-12-03 15:12:43.870000             🧑  作者: Mango

门 - GATE-CS-2017(Set 1)

本文介绍了GATE-CS-2017(Set 1)考试中的题目 - 门。这是一道编程问题,需要编写一个程序来解决它。

问题描述

你需要编写一个程序来模拟门的状态。门可以被打开或关闭,当门被打开时,它可以保持打开的时间段,之后时限到了,门就会自动关闭。门可以被手动关闭,无论它的开启时间有多长。

你的任务是编写一个程序,对于一些命令,输出门的状态。

门有三种状态:

  • 关闭状态
  • 手动打开状态
  • 自动打开状态

门状态的变化包括以下几种情况:

  • 门关闭
  • 门手动打开
  • 门自动打开
  • 门关闭(在门被自动打开的时间段到期之前)

命令如下:

  • ButtonClicked - 如果当前状态为关闭,则将门手动打开。
  • CycleComplete - 当门被打开一定时间后,它会自动关闭。当门被自动关闭时,应该将状态更改为关闭状态。
  • DoorClosed - 门被强制关闭,状态更改为关闭状态。

每个命令都需要输出门的当前状态。

问题分析

我们可以使用一个状态变量来跟踪门的状态,并根据命令更改它。我们还需要跟踪门自动关闭的时间,以便在门打开一定时间后将门关闭。

使用以下状态:

enum State {
    CLOSED,
    MANUAL_OPEN,
    AUTO_OPEN
};

当门关闭时,状态为 CLOSED。当门被手动打开时,状态更改为 MANUAL_OPEN。当门被自动打开时,状态更改为 AUTO_OPEN。我们跟踪门开启的时间,以在门打开一定时间后将其关闭。

class Door {
private:
    State state_;
    time_t auto_close_time_;
    
public:
    Door() {
        state_ = CLOSED;
        auto_close_time_ = 0;
    }
    
    void ButtonClicked() {
        if (state_ == CLOSED) {
            state_ = MANUAL_OPEN;
            std::cout << "Door manually opened.\n";
        }
        else {
            std::cout << "Door already open.\n";
        }
    }
    
    void CycleComplete() {
        if (state_ == AUTO_OPEN) {
            state_ = CLOSED;
            std::cout << "Door automatically closed.\n";
        }
        else if (state_ == MANUAL_OPEN) {
            auto_close_time_ = time(NULL) + 10; // set auto-close time to 10 sec from now
            state_ = AUTO_OPEN;
            std::cout << "Door automatically opened.\n";
        }
        else {
            std::cout << "Door already closed.\n";
        }
    }
    
    void DoorClosed() {
        if (state_ == AUTO_OPEN || state_ == MANUAL_OPEN) {
            state_ = CLOSED;
            std::cout << "Door closed.\n";
        }
        else {
            std::cout << "Door already closed.\n";
        }
    }
};
总结

这是一道比较简单的编程问题,需要理解状态机的思想。我们可以使用状态变量和时间跟踪来实现门的状态切换。