Я пробовал несколько разных подходов, включая создание отдельного класса NANDGate и использование NOR Gates, но я действительно не могу понять, где я ошибаюсь в своем подходе. Мое значение для вывода сумматора продолжает возвращаться как логическое значение, и результат переноса неверен для определенных входных данных, что, как я полагаю, связано с тем, что проблема заключается в моем классе XOR. Если кто-то может поставить меня в правильном направлении, это было бы очень признательно. Примечание: у меня очень мало опыта работы с Ruby, это мой второй раз, когда я программирую на нем
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}"
&
,|
,~
) вместо логических операторов (&&
,||
,!
) или ключевых слов (and
,or
,not
), если вы хотите возвращать целочисленные значения. - person Aetherus   schedule 09.05.2016gets
возвращает строку. Вероятно, вам придется преобразовать ввод в число/логическое значение (в вашем коде есть неиспользуемый методBoolean
) - person Stefan   schedule 09.05.2016