📜  门| GATE CS 2008 |问题20(1)

📅  最后修改于: 2023-12-03 14:58:19.181000             🧑  作者: Mango

门| GATE CS 2008 |问题20

这是一道来自GATE CS 2008的编程题,要求实现一个可复用的门类。

问题描述

门可以按以下方式进行操作:

  • setValue(bool)getValue():用于设置和获取门的布尔值。
  • performGateLogic():用于实现门的的逻辑行为。这个方法应该由各自的门子类重新实现。

门有以下子类:

  • BinaryGate:两个输入的门,具有以下子类:
    • AndGate
    • OrGate
    • XorGate
  • UnaryGate:一个输入的门,具有以下子类:
    • NotGate
  • Connector:连接两个门的门。

编写一个可以重复使用的门类,使得这些子类可以通过继承和实现performGateLogic()方法来扩展此门类。还需要实现Connector类的__init__()方法来将一个输出连接到另一个输入。

代码实现

以下是一个可能的实现。门类和门子类都实现了setValue()getValue()performGateLogic()方法。

class LogicGate:
    def __init__(self, n):
        self.label = n
        self.output = None

    def getLabel(self):
        return self.label

    def getOutput(self):
        self.output = self.performGateLogic()
        return self.output

    def performGateLogic(self):
        pass

class BinaryGate(LogicGate):
    def __init__(self, n):
        LogicGate.__init__(self, n)
        self.pinA = None
        self.pinB = None

    def getPinA(self):
        if self.pinA == None:
            return int(input("Enter Pin A input for gate " + self.getLabel() + "-->"))
        else:
            return self.pinA.getFrom().getOutput()

    def getPinB(self):
        if self.pinB == None:
            return int(input("Enter Pin B input for gate " + self.getLabel() + "-->"))
        else:
            return self.pinB.getFrom().getOutput()

    def setNextPin(self, source):
        if self.pinA == None:
            self.pinA = source
        else:
            if self.pinB == None:
                self.pinB = source
            else:
                raise RuntimeError("Error: NO EMPTY PINS")

class AndGate(BinaryGate):
    def __init__(self, n):
        BinaryGate.__init__(self, n)

    def performGateLogic(self):
        a = self.getPinA()
        b = self.getPinB()
        if a == 1 and b == 1:
            return 1
        else:
            return 0

class OrGate(BinaryGate):
    def __init__(self, n):
        BinaryGate.__init__(self, n)

    def performGateLogic(self):
        a = self.getPinA()
        b = self.getPinB()
        if a == 1 or b == 1:
            return 1
        else:
            return 0

class XorGate(BinaryGate):
    def __init__(self, n):
        BinaryGate.__init__(self, n)

    def performGateLogic(self):
        a = self.getPinA()
        b = self.getPinB()
        if a != b:
            return 1
        else:
            return 0

class UnaryGate(LogicGate):
    def __init__(self, n):
        LogicGate.__init__(self, n)
        self.pin = None

    def getPin(self):
        if self.pin == None:
            return int(input("Enter Pin input for gate " + self.getLabel() + "-->"))
        else:
            return self.pin.getFrom().getOutput()

    def setNextPin(self, source):
        if self.pin == None:
            self.pin = source
        else:
            raise RuntimeError("Error: NO EMPTY PINS")

class NotGate(UnaryGate):
    def __init__(self, n):
        UnaryGate.__init__(self, n)

    def performGateLogic(self):
        if self.getPin():
            return 0
        else:
            return 1

class Connector:
    def __init__(self, fgate, tgate):
        self.fromgate = fgate
        self.togate = tgate

        tgate.setNextPin(self)

    def getFrom(self):
        return self.fromgate

    def getTo(self):
        return self.togate
使用示例

以下是一个使用示例:

g1 = AndGate("G1")
g2 = AndGate("G2")
g3 = OrGate("G3")
g4 = NotGate("G4")
c1 = Connector(g1, g3)
c2 = Connector(g2, g3)
c3 = Connector(g3, g4)

注意,在使用示例中,我们首先定义了4个门实例,然后使用Connector类将它们连接在一起,形成一个逻辑电路。此电路表示如下逻辑函数:

G4(G1(A, B), G2(A, B))

其中,G1G2AndGate的实例,G3OrGate的实例,G4NotGate的实例。

接下来,我们可以测试它的结果:

g1.setNextPin(1)
g2.setNextPin(0)
print(g4.getOutput())

这将输出以下结果:

0

这种逻辑电路对应的是“A和非B”的逻辑。在这个例子中,G1(A, B)为假(由于B为假),G2(A, B)也为假(由于A为真),因此整个电路对应的最终值应为假。G4(G1(A, B), G2(A, B)) 调换次序后即:G4(G2(A, B), G1(A, B))也为假。