Ruby命令行计算器

时间:2016-07-19 00:46:47

标签: ruby command-line calculator

我正在尝试制作命令行计算器,但我不知道从哪里开始。

这是我到目前为止所做的:

    puts "Calculator "
    puts "please write what youd like to calculate . i.e '4 + 3 * 4'"

    cal = gets.chomp.split(" ")

    cal.map!.with_index do |num, i|
      if i.even?
        num.to_i
      else
        num.to_sym
      end
    end
    cal.inspect 
    # i.e [3, :+, 4]

我希望能够获得数组中的内容并返回结果。像这样:3 + 4 = 7

3 个答案:

答案 0 :(得分:3)

你几乎就在那里!

正如您可能意识到的那样,像+这样的运算符只是Ruby中方法的语法糖,所以这个数组:

cal = [3, :+, 4]

...拥有您需要的一切:接收器(3),调用该接收器的方法(:+)和参数(4):

recv, meth, arg = cal
recv.public_send(meth, arg)
# => 7

以上内容相当于调用3.+(4),这当然与3 + 4相同。

答案 1 :(得分:2)

对用户的输入字符串使用eval,它应该为您处理。 I. e。:

eval('4 + 3 * 4')
#⇒ 16

如果你想看到处理不同字符串的eval的不同快速示例,你可以在irb中运行它。

这是关于使用eval的帖子。

https://rubymonk.com/learning/books/5-metaprogramming-ruby-ascent/chapters/24-eval/lessons/63-eval

答案 2 :(得分:1)

对于简单的计算器,您可能希望首先检查 BODMAS 顺序中符号的位置。

保持简单,将其更改为 DMAS - 除法,乘法,加法,然后减法。

我们来看"4 + 3 - 5 / 2 * 5"。假设您认为用户将每个符号或数字与空格分开,我们可以用空格分割该字符串。

此外,假设用户输入了正确的(非错误的)计算,我们应该查找第一个操作员的索引。由于DMAS,我们应该先做分工。

我们找到/的索引,然后将之前索引中的值除以之后索引中的值,因此5 / 2

在数组中,将您刚刚使用的值和运算符替换为您计算的值。因此,["4", "+", "3", "-", "5", "/", "2", "*", "5"]变为[4, "+", 3, "-", 2.5, "*", 5]

然后,您可以重复此过程,根据操作符的内容更改您对值的操作。