📜  门| GATE-CS-2016(套装2)|问题 4(1)

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

门 | GATE-CS-2016(套装2)|问题 4

本题目要求编写一个程序来实现门电路的功能。电路的门类型包括:

  • AND门
  • OR门
  • NOT门
  • XOR门

每个门都有指定数量的输入端口和一个输出端口。门的输入和输出都是布尔值。

你需要创建一个可以支持这些门类型的类Gate,并实现以下方法:

  • 输入:(inputs: List[bool]) -> None:将输入值输入门。输入值的数量应等于门的num_inputs属性。在输入值之后,门应该计算出新的输出值并将其存储在output属性中。

  • 输出:(output_index: int) -> bool:返回门的第output_index端口的输出值。

门的构造函数应该接受一个门类型字符串,以及该门有多少输入端口。例如,实例化一个两个输入的OR门应该如下所示:

or_gate = Gate("OR", 2)

门可以与其他门级联,这意味着您可以将一个门的输出连接到另一个门的输入。例如,下面的代码创建两个门:一个AND门和一个NOT门,并将AND门的输出连接到NOT门的输入:

and_gate = Gate("AND", 2)
not_gate = Gate("NOT", 1)
not_gate.connect_input(and_gate, 0)

在此示例中,我们假设AND门的输出位于索引0处,因为这是默认值。

门的默认输出端口为0,但是也可以更改。例如,如果要将AND门的输出设置为索引1,则可以执行以下操作:

and_gate.set_output_index(1)

当您编写时,可以在Gate类中使用以下代码作为起点:

class Gate:
    def __init__(self, gate_type: str, num_inputs: int):
        self.gate_type = gate_type
        self.num_inputs = num_inputs
        self.inputs = [None] * num_inputs
        self.output = None
        self.output_index = 0

    def set_input(self, input_index: int, value: bool) -> None:
        self.inputs[input_index] = value

    def set_output_index(self, output_index: int) -> None:
        self.output_index = output_index

    def connect_input(self, gate: 'Gate', input_index: int) -> None:
        gate.set_output_index(input_index)
        self.inputs[input_index] = gate

    def get_output(self, input_values: List[bool]) -> bool:
        raise NotImplemented
原理

本题需要我们写一个实现门电路的程序,这里的门包括了 AND、OR、NOT、XOR。除此之外,还能够支持级联连接,方便们之间的连通操作。

思考整个电路的构成,每个门都有输入与输出,相当于是一个多对一的关系,那我们就可以设计一个类 Gate 代表门,具有以下的属性:

  • gate_type: str 表示门的类型
  • num_inputs: int 表示门的输入口数量
  • inputs: List[Union[bool, Gate]] 用于存储门的输入信息,这里也可以存储另外一个门,即级联连接。
  • output: Optional[bool] 表示门的输出信息,是一个 bool 类型。
  • output_index: int 表示门的输出端口,即 0 或 1。

至此,我们就能够设计出 Gate 类的初始化函数,其中 inputs 的值默认为 None,表示输入都是空的,output 也是空的,作为输出,也只能够得到 None 的值,需要在输入之后,计算整个门的输出值,并存储在 output 属性中。

class Gate: def init(self, gate_type: str, num_inputs: int): self.gate_type = gate_type self.num_inputs = num_inputs self.inputs = [None] * num_inputs self.output = None self.output_index = 0

我们需要定义 Gate 类中的方法,使得整个电路可以实现级联,计算最后的输出值。

  • set_input 方法,用于给输入添加值。input_index 表示输入的索引值,value 表示输入值的布尔值。

    def set_input(self, input_index: int, value: bool) -> None: self.inputs[input_index] = value

  • set_output_index 方法,用于设置输出端口的位置。

    def set_output_index(self, output_index: int) -> None: self.output_index = output_index

  • connect_input 方法,用于连接不同的门,这里的 inputs 中,不光可以存储输入的布尔值,还可以存储另外一个门。gate 表示要连接的门对象,并且需要设置对应的输入端口 input_index。

    def connect_input(self, gate: 'Gate', input_index: int) -> None: gate.set_output_index(input_index) self.inputs[input_index] = gate

  • get_output 方法,计算并返回门的输出值。input_values 表示输入的值,根据门的类型,输出不同的结果。

      def get_output(self, input_values: List[bool]) -> bool:
      if self.gate_type == "NOT":
      # NOT 门只有一个输入即可
          return not(input_values[0])
      elif self.gate_type == "AND":
          for i in input_values:
          # 如果有一个是 False,那么整体的输出都是 False
              if not i:
                  return False
          return True
      elif self.gate_type == "OR":
          for i in input_values:
          # 如果有一个是 True,那么整体的输出都是 True
              if i:
                  return True
          return False
      elif self.gate_type == "XOR":
          return input_values[0] != input_values[1]
    

接下来,我们可以参考下面的代码进行实现:

from typing import List, Union, Optional

class Gate:
    def __init__(self, gate_type: str, num_inputs: int):
        self.gate_type = gate_type
        self.num_inputs = num_inputs
        self.inputs = [None] * num_inputs
        self.output = None
        self.output_index = 0

    def set_input(self, input_index: int, value: bool) -> None:
        self.inputs[input_index] = value

    def set_output_index(self, output_index: int) -> None:
        self.output_index = output_index

    def connect_input(self, gate: 'Gate', input_index: int) -> None:
        gate.set_output_index(input_index)
        self.inputs[input_index] = gate

    def get_output(self, input_values: List[bool]) -> bool:
        if self.gate_type == "NOT":
            return not(input_values[0])
        elif self.gate_type == "AND":
            for i in input_values:
                if not i:
                    return False
            return True
        elif self.gate_type == "OR":
            for i in input_values:
                if i:
                    return True
            return False
        elif self.gate_type == "XOR":
            return input_values[0] != input_values[1]

使用示例:

# 创建一个 OR 门
or_gate = Gate("OR", 2)

# 设置输入值
or_gate.set_input(0, True)
or_gate.set_input(1, False)

# 计算输出值
or_gate.get_output([True, False])
# 得到 True

# 创建一个 NOT 门
not_gate = Gate("NOT", 1)

# 将 OR 门的输出连接到 NOT 门的输入
not_gate.connect_input(or_gate, 0)

# 计算输出值
not_gate.get_output([True])
# 得到 False

以上可以,通过 Gate 类模拟整个电路的状态,计算得到整个电路的输出值。