Ruby - 在循环中使用gets.chomp进行计算

时间:2017-09-28 21:51:00

标签: ruby-on-rails ruby loops

我对Ruby很新。我一直试图找到一种用户输入进行计算的方法。我想做两件事:

  1. 输出哪个朋友有最多的恐龙或水母。
  2. 输出哪个朋友有最多的恐龙和水母组合。
  3. 到目前为止,我只有这个循环请求用户输入:

    f = "yes"
    
    while f == "yes"
    print "Enter your name: "
    n = gets.chomp.to_f
    print "Enter the number of dinosaurs you have: "
    d = gets.chomp.to_f
    print "Enter the number of jellyfish you have: "
    j = gets.chomp.to_f
    print "Another friend? (yes/no)"
    f = gets.chomp
    end
    

    感谢任何帮助。非常感谢你!

    更新: 非常感谢你的帮助。我意识到我不够具体。我会在这里澄清一下。

    我想要的输出看起来像这样(~~是用户输入的东西):

    Enter your name: ~ Bob~
    Enter the number of dinosaur you have: ~3~
    Enter the number of jellyfish you have: ~6~
    Another friend? (yes/no) ~yes~
    Enter your name: ~ Sally~
    Enter the number of dinosaur you have: ~2~
    Enter the number of jellyfish you have: ~8~
    Another friend? (yes/no) ~no~
    Friend who has the most dinosaurs: Bob
    Friend who has the most jellyfish: Sally
    Friend who has the most dinosaurs and jellyfish combined: Sally
    

    到目前为止,我写的代码只让我“另一个朋友?(是/否)”但我不知道如何让Ruby输出我想要的最后三行。你们可以对此有所了解吗?

    非常感谢!

    更新更新: 感谢您所有的帮助!用Hash和Array搞定了。谢谢!

2 个答案:

答案 0 :(得分:2)

你的问题的答案有三个。

收集用户输入

gets从stdin返回一行,包括换行符。如果用户输入 B o b 输入,则gets返回"Bob\n"。< / p>

要剥离换行符,请使用String#chomp

"Bob\n".chomp #=> "Bob"

要将"3\n"之类的输入转换为整数3,您可以使用String#to_i

"3\n".to_i #=> 3

请注意,to_i会忽略无关的字符(包括换行符),因此您可以避免使用chomp

存储数据

您可能希望将用户的数据存储在一个位置。在像Ruby这样的面向对象编程语言中,这样的&#34; place&#34;通常是一个班级。它可以很简单:

class User
  attr_accessor :name, :dinosaurs, :jellyfish
end

attr_accessor创建了getter和setter,因此您可以通过以下方式读取和写入用户的属性:

user = User.new
user.name = 'Bob'
user.name #=> "Bob"

由于您不想只需要一个用户,因此您需要另一个地方来存储用户。

Array可以正常使用:

users = []

user = User.new
user.name = 'Bob'
user.dinosaurs = 3

users << user

users
#=> [#<User @name="Bob", @dinosaurs=3>]

添加第二位用户:

user = User.new     # <- same variable name, but new object
user.name = 'Sally'
user.dinosaurs = 2

users << user

users
#=> [#<User @name="Bob", @dinosaurs=3>, #<User @name="Sally", @dinosaurs=2>]

从数组中检索用户(或其属性):

users[0]      #=> #<User @name="Bob">
users[0].name #=> "Bob"
users[1].name #=> "Sally"

使用数据计算

Array包含Enumerable mixin中的许多有用方法。

要获得一个具有最大值的元素max_by - 它将每个元素(即用户)传递给一个块,并且该块必须返回您感兴趣的值(例如{{1 }})。 dinosaurs然后返回具有最高max_by值的用户:

dinosaurs

您还可以计算值:

users.max_by { |u| u.dinosaurs }
#=> #<User @name="Bob">

但是这会导致异常,因为我们没有在上面设置users.max_by { |u| u.dinosaurs + u.jellyfish }

答案 1 :(得分:0)

现在您正在尝试通过调用to_f将名称变为浮点数(数字)。当它从用户进来时它已经是一个字符串,并且应该保留一个字符串。

此外,您当前正在覆盖循环的每次迭代中的每个变量。因此,如果鲍勃填补了这一点,并希望添加一个朋友,莎莉,鲍勃的所有信息都会被莎莉的信息覆盖。

相反,您需要创建一个哈希或数组,然后从您的循环中逐个添加每个用户。

continue = "yes"
users = {}

while continue == "yes"
print "Enter your name: "
name = gets.chomp.to_f
print "Enter the number of dinosaurs you have: "
dinosaursCount = gets.chomp.to_f
print "Enter the number of jellyfish you have: "
jellyfishCount = gets.chomp.to_f

users[name] = {dinosaurs: dinosaursCount, jellyfish: jellyfishCount}

print "Another friend? (yes/no)"
continue = gets.chomp
end

现在,如果通过命令行添加了Bob和Sally,您可以通过执行以下操作获取数据:

users.Bob #{dinosaurs: 10, jellyfish: 10}
users.Bob.dinosaurs #10
users.Bob.jellyfish #10