1

下面的代码旨在成为我可以针对数学表达式运行的计算器脚本。输出显然是错误的。我认为它是无限循环的。如果有人能在这里找到错误,我将不胜感激。

我不能eval在我的解决方案中使用。你在这里看到的一般格式是我必须使用的。我也 99% 确定我也不能使用case声明。

编码

expression = (ARGV[0]).gsub(/\s/, '')
def theCalculator (expression)
  while expression =~ /\D/
    if expression =~ /\(.*\)/
        expression = expression.scan(/\((.*)\)/)
        expression = $` + (theCalculator(expression)).to_s + $'
    elsif expression =~ /\^/
        expression = expression.scan(/(\d*|\d*\.\d*)(\^)(\d*|\d*\.\d*)/)
        expression = $1.to_f ** $3.to_f
        expression = $` + expression.to_s + $'
    elsif expression =~ /\*|\//
        expression = expression.scan(/(\d*|\d*\.\d*)(\*|\/)(\d*|\d*\.\d*)/)
        if $2 == "*"
          expression = $1.to_f * $3.to_f
        else
          expression = $1.to_f / $3.to_f
        end
      expression = $` + expression.to_s + $'
    elsif expression =~ /\+|\-/
      expression = expression.scan(/(\d*|\d*\.\d*)(\+|\-)(\d*|\d*\.\d*)/)
        if $2 == "+"
          expression = $1.to_f + $3.to_f
        else
          expression = $1.to_f - $3.to_f
        end
      expression = $` + expression.to_s + $'
    end
end
return expression
end
expression = theCalculator(expression)
puts expression

输入

ruby calc.rb "2 ^ (4 - 1.0) + 1"

输出

(big ol infinite loop)
4

1 回答 1

1

一个好的起点是regex 上的这个资源。如果您觉得有必要以这种方式进行试验,也知道有几个在线正则表达式评估器。

只是给出几个非常重要的提示,它们应该会让你更接近自己完成你的任务:

  • 找到调试代码的方法!你已经知道了puts,你可以用它开始
  • 仔细看看你的while情况(\D):在我看来[^\d.]更好
  • 另外,在我看来[*\/],可以分别[+-]替换\*|\/\+|\-
  • .to_s在您的递归调用中,我得到了更好的结果expression
  • 注意贪婪:使用惰性量词进行括号匹配
    编辑:使用表达式匹配没有任何内部括号的括号...</li>
  • \d*|\d*\.\d*不一样\d*(?:\.\d*)?

请仔细查看上面的列表并尝试理解我的建议。
你能让你的脚本给出和我一样的结果吗?( 9.0)

于 2013-04-20T21:33:07.050 回答