用Ruby编程语言创建数学计算器



我正在用Ruby创建一个新的计算器。然而,我一直在经历这个问题:;如果";即使我键入";添加";如果我想把数字加在一起。与";elsif";声明。";否则";语句将始终执行。

请原谅我混乱的代码。我开始使用Ruby

class CalculatorFunctions
def addNumbers(num1, num2)
@n1 = num1
@n2 = num2
@sum = @n1 + @n2
puts @sum
end
def subtractNumbers(num1, num2)
@n1 = num1
@n2 = num2
@difference = @n1 - @n2
puts @difference
end
def multiplyNumbers(num1, num2)
@n1 = num1
@n2 = num2
@product = @n1 * @n2
puts @product
end
def divideNumbers(num1, num2)
@n1 = num1
@n2 = num2
@quotient = @n1 / @n2
puts @quotient
end
end
calcFunctions = CalculatorFunctions.new
puts "Select a method:nType 'add' for AdditionnType 'subtract' for SubtractionnType 'multiply' for MultiplicationnType 'divide' for Division"
method = gets
puts "Enter the first number:"
num1 = gets.to_i
puts "Enter the second number:"
num2 = gets.to_i
if method == "add" or method == "Add"
calcFunctions.addNumbers(num1, num2)
elsif method == "subtract" or method == "Subtract"
calcFunctions.subtractNumbers(num1, num2)
elsif method == "multiply" or method == "Multiply"
calcFunctions.multiplyNumbers(num1, num2)
elsif method == "divide" or method == "Divide"
calcFunctions.divideNumbers(num1, num2)
else
puts "Invalid method"
end

从输入中删除换行符

当您调用method = gets时,您还可以在用户按下RETURN时捕获换行符。您需要使用String#chomp或String#strip从输入中删除换行符。

method = gets.chomp

或者,您可以将if语句中的相等性检查换成String#start_with?。这也可以解决问题,但这是一种不太习惯的方法

这不是一个答案,而是一个扩展注释,无法在一个或多个常规注释中轻松表达。因此,请不要投赞成票(可以投反对票(。

首先,没有理由将方法放在类中,因为您不会创建该类的实例。您可以将方法放在一个模块中,然后根据需要将模块#包含在类中。举个例子,看看Ruby内置的数学模块。它们都是模块方法,因此使用模块名称调用它们。例如,

Math.sqrt(25)

接下来,请注意,这四种基本算术方法的相似之处在于,它们都有两个参数和一个运算符。因此,我们可以通过编写一个适用于所有方法的方法来简化代码。

module Calc
def self.compute(op, arg1, arg2)
arg1.public_send(op, arg2)
end
end

请参阅#public_send。

让我们试试。

Calc.compute(:+, 2, 3)   #=>  5
Calc.compute(:-, 2, 3)   #=> -1
Calc.compute(:*, 2, 3)   #=>  6
Calc.compute(:/, 7, 2)   #=>  3
Calc.compute(:/, 7.0, 2) #=>  3.5 

请注意,我们也可以将运算符作为字符串而不是符号传递。

Calc.compute('+', 2, 3)  #=> 5       

因为我们希望每个运算符都有单独的方法,所以我们可以如下编写模块Calc

module Calc
def self.add(arg1, arg2)
compute(:+, arg1, arg2)
end
def self.subtract(arg1, arg2)
compute(:-, arg1, arg2)
end
def self.multiply(arg1, arg2)
compute(:*, arg1, arg2)
end
def self.divide(arg1, arg2)
raise ZeroDivisionError if arg2.zero?
compute(:/, arg1, arg2)
end
private
def self.compute(op, arg1, arg2)
arg1.public_send(op, arg2)
end
end

Calc.add(2, 3)      #=>  5
Calc.subtract(2, 3) #=> -1
Calc.multiply(2, 3) #=>  6
Calc.divide(7, 2)   #=>  3
Calc.divide(7.0, 2) #=>  3.5 
Calc.divide(7.0, 0) #=> ZeroDivisionError

奇怪的是,当第二个参数为零时,如果我没有在Calc::divide中引发一个被零除的异常,就会产生以下结果。

Calc.divide(7.0, 0) #=> Infinity

您可以获得如下参数。

print "Enter the method, 'add', 'subtract', 'multiply' or 'divide': "
method = gets.strip.downcase
puts
print "Enter the first number: "
num1 = gets.to_i
puts
print "Enter the second number: "
num2 = gets.to_i

然后,如果,例如,method = 'add'num1 = 2num2 = 5

Calc.public_send(method, num1, num2) #=> 7

请注意,我还没有创建任何实例变量。此外,Ruby有一个使用Snake大小写命名变量和方法的约定。你不必遵循这一点,但99%以上的Rubisters都遵循。


在ruby 中使用switch语句的简单计算器

puts "Entre first number"
num1 = gets.chomp().to_f
puts "Entre operator"
op = gets.chomp()
puts "Entre second number"
num2 = gets.chomp().to_f
case op
when "+"
puts(num1 + num2)
when "-"
puts(num1 - num2)
when "*"
puts(num1 * num2)
when "/"
puts(num1/num2)
end

最新更新