Ich habe ein paar verschiedene Ansätze ausprobiert, einschließlich der Erstellung einer separaten NANDGate-Klasse und der Verwendung von NOR-Gates, aber ich kann wirklich nicht herausfinden, wo ich falsch liege. Mein Wert für die Addiererausgabe wird immer als Boolescher Wert zurückgegeben, und das Carryout-Ergebnis ist für bestimmte Eingaben nicht korrekt. Ich stelle mir vor, dass das Problem in der XOR-Klasse liegt, die ich habe. Wenn jemand mich in die richtige Richtung bringen kann, würde es sehr geschätzt werden. Hinweis I Ruby sehr unerfahren bin das ist meine zweite Zeit-Codierung darinErstellen einer XOR-Klasse zum Implementieren eines Volladdierers
class Circuit
# constructor method
def initialize(in1, in2)
@in1, @in2 = in1, in2
end
end
class AndGate < Circuit
def cir_func()
(@in1 && @in2)
end
end
class OrGate < Circuit
def cir_func()
(@in1 || @in2)
end
end
class NotGate < Circuit
def initialize(in1)
@in1 = in1
end
def cir_func()
(not @in1)
end
end
class NandGate < Circuit
def cir_func()
(not (@in1_ && @in2_))
end
end
class XOrGate < Circuit
def initialize(in1, in2)
@in1_ = in1
@in2_ = in2
end
def cir_func()
a0 = AndGate.new(@in1_, @in2_).cir_func()
a0not = NotGate.new(a0).cir_func()
a1 = AndGate.new(@in1_, a0not).cir_func()
a1not = NotGate.new(a1).cir_func()
a2 = AndGate.new(a0not, @in2_).cir_func()
a2not = NotGate.new(a2).cir_func()
o0 = AndGate.new(a1not, a2not).cir_func()
o0not = NotGate.new(o0)
return o0not.cir_func()
end
end
class Mux_2to1 < Circuit
def initialize(in1, in2, ctr1)
@in1_ = in1
@in2_ = in2
@ctr1_ = ctr1
end
def cir_func()
inv_ctr = NotGate.new(@ctr1_).cir_func()
a0 = AndGate.new(@in1_, inv_ctr).cir_func()
a1 = AndGate.new(@in2_, @ctr1_).cir_func()
o0 = OrGate.new(a0, a1)
return o0.cir_func()
end
end
class Mux_4to1 < Circuit
def initialize(in1, in2, in3, in4, ctr1, ctr2)
@in1_ = in1
@in2_ = in2
@in3_ = in3
@in4_ = in4
@ctr1_ = ctr1
@ctr2_ = ctr2
end
def cir_func()
a0 = Mux_2to1.new(@in1_, @in2_, @ctr1_).cir_func()
a1 = Mux_2to1.new(@in3_, @in4_, @ctr1_).cir_func()
o0 = Mux_2to1.new(a0, a1, @ctr2_)
return o0.cir_func()
end
end
class FullAdder < Circuit
def initialize(in1, in2, carryIn)
@in1_ = in1
@in2_ = in2
@carry_ = carryIn
end
def cir_func()
a0 = XOrGate.new(@in1_, @in2_).cir_func()
o0 = XOrGate.new(a0, @carry_)
a1 = AndGate.new(@in1_, @in2_).cir_func()
a2 = AndGate.new(a0, @carry_).cir_func()
o1 = OrGate.new(a1, a2)
return o0.cir_func(), o1.cir_func()
end
end
def Boolean(string)
return true if string== true || string =~ (/(true|1)$/i)
return false if string== false || string.nil? || string =~ (/(false|0)$/i)
raise ArgumentError.new("invalid value for Boolean: \"#{string}\"")
end
puts "Please enter input 1 for adder:"
input_1 = gets()
puts "Please enter input 2 for adder:"
input_2 = gets()
puts "Please enter carry in for adder:"
carryin_ = gets()
x = FullAdder.new(input_1, input_2, carryin_)
output, carryOut = x.cir_func()
puts "The result for the adder is: #{output} and the carry out is: #{carryOut}"
Sie sollten bitwise Operatoren ('&', '|', '~') anstelle von logischen Operatoren ('&&', '||', '!') Oder Schlüsselwörtern ('and',' or') verwenden. 'not'), wenn Sie ganzzahlige Rückgabewerte wünschen. – Aetherus
Beachten Sie, dass "gets" eine Zeichenfolge zurückgibt. Sie müssen wahrscheinlich die Eingabe in eine Zahl/boolean konvertieren (es gibt eine unbenutzte Methode 'Boolean' in Ihrem Code) – Stefan