下面的代码是一个计算器脚本,我可以针对数学表达式运行。输出显然是错误的。我认为它是无限循环的。如果有人能在这里找到错误,我会非常感激。
我无法在我的解决方案中使用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)
答案 0 :(得分:1)
一个好的起点是resource on regex。如果您觉得有必要以这种方式进行实验,也知道有几个在线正则表达式评估者。
提供几个非常重要的提示,这些提示可以让您更接近自己完成作业:
puts
,您可以使用它来开始while
条件(\D
):我认为[^\d.]
更好[*\/]
和[+-]
可以分别替换\*|\/
和\+|\-
.to_s
添加到expression
\d*|\d*\.\d*
与\d*(?:\.\d*)?
请仔细查看上面的列表并尝试了解我的建议
你能让你的脚本给出与我相同的结果吗? (9.0
)