📅  最后修改于: 2023-12-03 14:58:19.181000             🧑  作者: Mango
这是一道来自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))
其中,G1
和G2
是AndGate
的实例,G3
是OrGate
的实例,G4
是NotGate
的实例。
接下来,我们可以测试它的结果:
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))
也为假。