📜  门|门 CS 1997 |第 44 题(1)

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

题目简介

该题为“门|门 CS 1997”竞赛的第44题,要求实现一个略微复杂的门禁系统,可以进行开门、关门、查询门状态等操作。

题目要求

具体的题目要求如下:

  1. 实现 Door 类,包含以下方法:
    • open():将门打开。
    • close():将门关闭。
    • get_state():获取门的状态,取值为 "open""closed"
    • __str__():返回门的字符串形式,格式为 <Door: state>,其中 state 为门的状态。
  2. 实现 SecurityDoor 类,继承自 Door 类,增加以下方法和属性:
    • __init__(self, passcode: str):初始化方法,传入门的密码。密码正确才能进行开门操作。
    • is_secure():获取门的安全状态,取值为 TrueFalse,安全状态的判断标准为是否设置了密码。
    • open_with_passcode(self, passcode: str):根据密码打开门,如果密码错误则不能打开门。
    • __str__():返回门的字符串形式,格式为 <SecurityDoor: state, code>,其中 code 为门的密码。如果未设置密码,则 code 显示为 "None"。

解题思路

该题要求实现门禁系统,包含普通门和安全门两种类型。普通门只能进行简单的开关操作,而安全门必须输入密码才能进行开门操作。

首先需要实现 Door 类,包含基本的开门、关门和查询状态方法。这些方法都非常简单,只需要设置门的状态变量即可。

然后需要实现 SecurityDoor 类,继承自 Door 类,并增加密码相关的属性和方法。初始化方法需要传入门的密码,并设置一个标志来记录是否设置了密码。这个标志可以用一个布尔值来表示,如果未设置密码则为 False,否则为 True

进行开门操作时需要输入密码,并根据密码是否正确来决定门是否打开。如果密码错误,则返回错误提示。查询安全状态时只需要判断是否设置了密码,如果设置了则是安全状态,否则不是安全状态。

代码实现

以下为Python的代码实现。

class Door:
    def __init__(self):
        self.state = "closed"
        
    def open(self):
        self.state = "open"
        
    def close(self):
        self.state = "closed"
        
    def get_state(self):
        return self.state
        
    def __str__(self):
        return f"<Door: {self.state}>"

class SecurityDoor(Door):
    def __init__(self, passcode: str):
        super().__init__()
        self.passcode = passcode
        self.has_passcode = True if passcode else False
        
    def is_secure(self):
        return self.has_passcode
        
    def open_with_passcode(self, passcode: str):
        if passcode == self.passcode:
            self.open()
        else:
            print("Error: Incorrect passcode.")
            
    def __str__(self):
        return f"<SecurityDoor: {self.state}, code:{self.passcode or 'None'}>"

测试样例

以下为测试样例,分别测试了普通门、安全门的基本操作和密码验证操作。

# 创建一个普通门
door1 = Door()

# 打开门并查询状态
door1.open()
print(door1.get_state()) # open

# 关闭门并查询状态
door1.close()
print(door1.get_state()) # closed

# 创建一个安全门
door2 = SecurityDoor("123456")

# 查询安全状态
print(door2.is_secure()) # True

# 用正确密码打开门
door2.open_with_passcode("123456")
print(door2.get_state()) # open

# 用错误密码打开门
door2.open_with_passcode("654321") # Error: Incorrect passcode.

# 查询门状态和密码
print(door2.get_state()) # open
print(door2.passcode) # 123456

# 修改密码
door2.passcode = "abcd"
print(door2.passcode) # abcd

# 查询门状态和密码
print(door2.get_state()) # open
print(door2.passcode) # abcd

# 用旧密码打开门
door2.open_with_passcode("123456") # Error: Incorrect passcode.

# 用新密码打开门
door2.open_with_passcode("abcd")
print(door2.get_state()) # open

# 查询门状态和密码
print(door2.get_state()) # open
print(door2.passcode) # abcd

以上测试样例验证了两种门的基本功能,可以在本地进行运行测试。