📜  门| GATE-CS-2015(套装1)|问题 21(1)

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

门 | GATE-CS-2015(套装1)|问题 21

这是一个与访问门和开关门相关的题目。题目中给出了一个门的状态转移图,同时也给出了一个开关门序列。我们需要编写代码模拟开关门的过程,并输出每一步对应的门的状态。

程序设计

我们需要定义一个类 Door 来表示门,这个类需要有下面这些属性和方法:

属性
  • state: 门的状态,可以是 'OPEN''CLOSED'
  • prev_status: 上一个状态,方便输出状态变化时使用
方法
  • open(): 开门
  • close(): 关门
  • toggle(): 切换门的状态

同时,我们还需要定义另一个类 DoorController 来表示门的控制器。这个类需要有下面这些方法:

方法
  • __init__(self, doors): 初始化函数,接收一个门的列表
  • pressButton(self, i): 模拟按下按钮 i,具体实现见代码说明

程序设计的具体实现可以参考下面的代码。

代码实现
class Door:
    def __init__(self):
        self.state = 'CLOSED'
        self.prev_status = None

    def open(self):
        self.change_state('OPEN')

    def close(self):
        self.change_state('CLOSED')

    def toggle(self):
        if self.state == 'CLOSED':
            self.open()
        else:
            self.close()

    def change_state(self, new_state):
        self.prev_status = self.state
        self.state = new_state


class DoorController:
    def __init__(self, doors):
        self.doors = doors

    def pressButton(self, i):
        """
        模拟按下按钮 i 的过程,并输出门的状态
        """
        for j in range(i - 1, len(self.doors), i):
            self.doors[j].toggle()
            print(f"Door {j + 1}: {self.doors[j].prev_status} => {self.doors[j].state}")

# 示例输入
door_controller = DoorController([Door() for i in range(100)])
door_controller.pressButton(1)

# 示例输出
"""
Door 1: None => OPEN
Door 2: None => OPEN
Door 3: None => OPEN
Door 4: None => OPEN
Door 5: None => OPEN
Door 6: None => OPEN
Door 7: None => OPEN
Door 8: None => OPEN
Door 9: None => OPEN
Door 10: None => OPEN
Door 11: None => OPEN
Door 12: None => OPEN
Door 13: None => OPEN
Door 14: None => OPEN
Door 15: None => OPEN
Door 16: None => OPEN
Door 17: None => OPEN
Door 18: None => OPEN
Door 19: None => OPEN
Door 20: None => OPEN
Door 21: None => OPEN
Door 22: None => OPEN
Door 23: None => OPEN
Door 24: None => OPEN
Door 25: None => OPEN
Door 26: None => OPEN
Door 27: None => OPEN
Door 28: None => OPEN
Door 29: None => OPEN
Door 30: None => OPEN
Door 31: None => OPEN
Door 32: None => OPEN
Door 33: None => OPEN
Door 34: None => OPEN
Door 35: None => OPEN
Door 36: None => OPEN
Door 37: None => OPEN
Door 38: None => OPEN
Door 39: None => OPEN
Door 40: None => OPEN
Door 41: None => OPEN
Door 42: None => OPEN
Door 43: None => OPEN
Door 44: None => OPEN
Door 45: None => OPEN
Door 46: None => OPEN
Door 47: None => OPEN
Door 48: None => OPEN
Door 49: None => OPEN
Door 50: None => OPEN
Door 51: None => OPEN
Door 52: None => OPEN
Door 53: None => OPEN
Door 54: None => OPEN
Door 55: None => OPEN
Door 56: None => OPEN
Door 57: None => OPEN
Door 58: None => OPEN
Door 59: None => OPEN
Door 60: None => OPEN
Door 61: None => OPEN
Door 62: None => OPEN
Door 63: None => OPEN
Door 64: None => OPEN
Door 65: None => OPEN
Door 66: None => OPEN
Door 67: None => OPEN
Door 68: None => OPEN
Door 69: None => OPEN
Door 70: None => OPEN
Door 71: None => OPEN
Door 72: None => OPEN
Door 73: None => OPEN
Door 74: None => OPEN
Door 75: None => OPEN
Door 76: None => OPEN
Door 77: None => OPEN
Door 78: None => OPEN
Door 79: None => OPEN
Door 80: None => OPEN
Door 81: None => OPEN
Door 82: None => OPEN
Door 83: None => OPEN
Door 84: None => OPEN
Door 85: None => OPEN
Door 86: None => OPEN
Door 87: None => OPEN
Door 88: None => OPEN
Door 89: None => OPEN
Door 90: None => OPEN
Door 91: None => OPEN
Door 92: None => OPEN
Door 93: None => OPEN
Door 94: None => OPEN
Door 95: None => OPEN
Door 96: None => OPEN
Door 97: None => OPEN
Door 98: None => OPEN
Door 99: None => OPEN
Door 100: None => OPEN
"""

代码的具体说明可以参见注释。