使ruby计算器连续运行

时间:2016-07-29 02:03:19

标签: arrays ruby while-loop calculator

我在ruby中制作了一个简单的计算器。但是一旦程序停止运行并且必须重新运行。我尝试了以下但它以无限循环结束。如何编写它以便它将一直运行直到用户告诉它退出?

puts "Please enter two digits separated by operation you would like to calculate:"

input = gets.chomp.split(' ')

while input != nil
  if input[1] == "+"
    puts input[0].to_i + input[2].to_i
  elsif input[1] == "-"
    puts input[0].to_i - input[2].to_i
  elsif input[1] == "*"
    puts input[0].to_i * input[2].to_i
  else 
    puts input[0].to_i / input[2].to_i
end
end

4 个答案:

答案 0 :(得分:0)

split(' ')返回一个数组而不是nil,因此input != nil总是求值为true,这会产生无限循环。

您可能希望在某些输入中尝试while input.size == 2break while循环,例如:

while true
  # ... if / elsif for operators
  elsif input[1] == 'exit'
    break # end the 'while' loop
  end
end

答案 1 :(得分:0)

递归方法:

def recurs_calc
  puts "Please enter two digits separated by operation you would like to calculate:"
  input = gets.chomp.split(' ')

  if input[1] == "+"
    puts input[0].to_i + input[2].to_i
    recurs_calc
  elsif input[1] == "-"
    puts input[0].to_i - input[2].to_i
    recurs_calc
  elsif input[1] == "*"
    puts input[0].to_i * input[2].to_i
    recurs_calc
  elsif input[1] == '/'
    puts input[0].to_f / input[2].to_i
    recurs_calc
  elsif input[0] == 'exit'
    exit
  else
    puts 'please enter two numbers with SPACES i.e. 4 + 4 then enter'
    recurs_calc
  end
end

recurs_calc

我们会根据条件回忆recurs_calc,并在用户输入'exit'时退出。注意我还在to_f分支中使用/来获得更准确的结果,并包含一个考虑了“错误”输入的最终分支。尝试运行它。

使用eval的另一种方法可能会对您有所帮助,尽管这可能有点作弊。出于安全原因,使用eval也被认为是不好的做法。还要特别感谢@nicael字符串替换:

loop do
puts "Enter calculation"
input = gets.chomp
  if input == 'exit'
    exit
  else
    p eval (input.gsub(/(\d+)/, '\1.0'))
  end
end

答案 2 :(得分:0)

进行如下更改:

msg = "Please enter two digits separated by operation you would like to calculate:"

puts msg

while input = gets.chomp.split(' ')
  if input[1] == "+"
    puts input[0].to_i + input[2].to_i
  elsif input[1] == "-"
    puts input[0].to_i - input[2].to_i
  elsif input[1] == "*"
    puts input[0].to_i * input[2].to_i
  else
    puts input[0].to_i / input[2].to_i
  end
  puts msg
end

答案 3 :(得分:0)

这一切都是Ruby的一大堆,可以大大简化。这里的关键是将Ruby方式应用于事物,优雅的解决方案立即变得明显。

考虑用实际的while结构替换那个混乱的loop循环。同时根据split的含义命名loop do puts "Please enter two digits separated by operation you would like to calculate:" left, operator, right = gets.chomp.split(' ') result = case (operator) when '+' left.to_i + right.to_i when '-' left.to_i - right.to_i when '*' left.to_i * right.to_i when '/' left.to_i / right.to_i end puts result end 产生的元素:

loop do
  puts "Please enter two digits separated by operation you would like to calculate:"

  left, operator, right = gets.chomp.split(' ')

  result = case (operator)
  when '+', '-', '*', '/'
    left.to_i.send(operator, right.to_i)
  end

  puts result
end

现在这看起来像很多重复,这里唯一改变的是运营商。由于Ruby是一种高度动态的语言,我们实际上可以将其折叠起来:

loop do
  puts "Please enter digits separated by the operations you would like to calculate:"

  values = gets.chomp.split(' ')

  while (values.length > 2)
    left = values.shift.to_i
    operator = values.shift
    right = values.shift.to_i

    values.unshift(left.send(operator, right))
  end

  puts values[0]
end

现在还有一些重复。如何进一步减少这种情况并提供更大的灵活性:

layoutSubviews

这意味着您可以将任意长的数字列表添加到一起。将字符串标记为数字和非数字组件并不困难,但这可以让您自己尝试。