📅  最后修改于: 2023-12-03 15:12:43.870000             🧑  作者: Mango
本文介绍了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";
}
}
};
这是一道比较简单的编程问题,需要理解状态机的思想。我们可以使用状态变量和时间跟踪来实现门的状态切换。