📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019年1月10日)|问题3(1)

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

门 | Sudo GATE 2020 Mock II(2019年1月10日)|问题3

本题是关于程序的控制流和数据结构。在程序中,控制流可以用于确定何时以及在何种情况下执行哪些代码。

问题描述

给定一个门(Door)类,定义一个门实例的状态:

class Door:
    def __init__(self):
        self.doorStatus = 'closed'
        self.lockStatus = 'unlocked'

定义一个门时间表(DoorSchedule)类,它允许门的时间表的添加和查询:

class DoorSchedule:
    def __init__(self):
        self.schedule = []
        
    def addEntry(self, day, time_start, time_end, doorStatus, lockStatus):
        self.schedule.append({
            'day': day,
            'time_start': time_start,
            'time_end': time_end,
            'doorStatus': doorStatus,
            'lockStatus': lockStatus,
        })
        
    def getDoorStatus(self, day, time):
        for entry in self.schedule:
            if day == entry['day'] and time >= entry['time_start'] and time <= entry['time_end']:
                return entry['doorStatus']
        return 'closed'
    
    def getLockStatus(self, day, time):
        for entry in self.schedule:
            if day == entry['day'] and time >= entry['time_start'] and time <= entry['time_end']:
                return entry['lockStatus']
        return 'locked'

门类的初始状态是关闭且未上锁。现在,门时间表的条目以列表的形式提供。时间表包括以下列:

  • day: 星期几;
  • time_start: 开始时间;
  • time_end: 结束时间;
  • doorStatus: 门状态;
  • lockStatus: 锁状态。

门状态可以是open(开),closed(关)或halfopen(半开),锁状态可以是locked(锁定)或unlocked(未锁定)。门时间表按开门的时间范围升序排列。

现在,定义了类门控制器(DoorController),该类可以处理门的PIN,然后根据开锁和锁定状态来操作门,且不允许操作错误状态的门:

class DoorController:
    def __init__(self, door, schedule):
        self.door = door
        self.schedule = schedule
        
    def processPIN(self, pin):
        day, time = pin.split(':')
        time = int(time)
        doorStatus = self.schedule.getDoorStatus(day, time)
        lockStatus = self.schedule.getLockStatus(day, time)
        if doorStatus == 'open' and lockStatus == 'unlocked': 
            self.door.doorStatus = 'open'
            self.door.lockStatus = 'unlocked'
        elif doorStatus == 'closed' and lockStatus == 'locked': 
            self.door.doorStatus = 'closed'
            self.door.lockStatus = 'locked'
        elif doorStatus == 'halfopen' and lockStatus == 'unlocked': 
            self.door.doorStatus = 'open'
            self.door.lockStatus = 'unlocked'
        else:
            raise ValueError('Door cannot be opened')

DoorController是一个门控制器类,它维护两个状态:door(门)和schedule(时间表)。当调用processPIN时,它会将PIN分解成day和time,然后根据时间表的状态来操作门状态和锁状态。

现在,下面的代码会调用DoorController并改变门的状态:

door = Door()
schedule = DoorSchedule()

# add entries to the schedule
schedule.addEntry('Monday', 10, 20, 'open', 'locked')
schedule.addEntry('Tuesday', 15, 30, 'closed', 'unlocked')

controller = DoorController(door, schedule)
# door starts closed, unlocked
assert door.doorStatus == 'closed'
assert door.lockStatus == 'unlocked'

# process a PIN which opens the door
controller.processPIN('Tuesday:25')
assert door.doorStatus == 'closed'
assert door.lockStatus == 'unlocked'

# process another PIN to lock the door
controller.processPIN('Tuesday:35')
assert door.doorStatus == 'closed'
assert door.lockStatus == 'locked'

# process a wrong PIN which cannot open the door
try:
    controller.processPIN('Monday:5')
except ValueError as e:
    assert str(e) == 'Door cannot be opened'
assert door.doorStatus == 'closed'
assert door.lockStatus == 'locked'

代码中有三个断言,每个断言都检查门和锁的状态是否与预期相同。

主要语句

本问题所涉及到的主要语句如下:

  • if 语句
  • for 循环
  • try-except

如果if语句的条件(elif)被满足,则其后边的代码块会被执行。在这种情况下,控制流跳过整个代码块。

对于for循环,它会在循环中遍历一个可迭代的对象、列表或序列等。当条件未被满足时,它们可以用于执行一些特定的操作,例如,如果未找到符合条件的元素,则for循环的else分支将被执行。

try-except块用于捕获和处理Python程序执行期间遇到的异常和错误。当异常以及与其相关的错误和其他问题发生时,这些异常会被捕获,从而避免程序中止。

Markdown

本文档采用markdown语言编写,支持插入图片,网址链接等。具体格式如下:

  • 一级标题

  • 二级标题
  • 三级标题

等等。

例如:

  • 插入图片:![Alt text](/path/to/img.jpg "Optional title")
  • 插入链接:[text](http://url.com/)

等等。

总结

本题是关于Python中的控制流和数据结构。程序使用门类、时间表类和门控制器类的实现,可以通过processPIN()方法来操作门控制器的状态。if-elif-else语句用于根据状态来执行相应的操作。for循环用于遍历时间表,并查询指定时间的门状态和锁状态。try-except块用于错误处理,并打印出相关的错误消息。这些语法实现了程序的高效、准确和清晰的需求。