0

我正在创建一个应用程序,它告诉从 1 到 12 的每个数字代表一年中的哪个月份,例如1 = January,2 = February等。这是初始代码

print "Please, tell me the month's number!"
number = gets.chomp.to_i
while number > 12  do
    print "Please, re-type it again!"
    number = gets.chomp.to_i
end
case number
    when 1 then print "This is January!"
    when 2 then print "This is February!"
    when 3 then print "This is March!"
    when 4 then print "This is April!"
    when 5 then print "This is May!"
    when 6 then print "This is June!"
    when 7 then print "This is July!"
    when 8 then print "This is August!"
    when 9 then print "This is September!"
    when 10 then print "This is October!"
    when 11 then print "This is November!"
    when 12 then print "This is December!"
    else print "I can't undestand you, i'm sorry!"
end

现在,基本逻辑已经设定。我认为唯一缺少的是 while 循环中定义的第二个条件,如果输入不是整数,我需要重新输入它。我正在尝试正确定义该 while 循环中的第二个条件,但到目前为止没有结果。我该怎么做?

我怎样才能使代码更好?在这种情况下,while循环是适合这项工作的正确方法吗?

4

5 回答 5

2

这是使您的代码更好的另一种方法:

require 'date'
print "Please, tell me the month's number! "
number = gets.to_i
until number.between?(1,12) do
  print "Please, re-type it again! "
  number = gets.to_i
end
month_name = Hash.new
(1..12).each do |month_num|
  month_name[month_num] = Date::MONTHNAMES[month_num]
end
print "This is #{month_name[number]}!"

如其他答案所述,chomp如果使用,则不需要,to_i因为转换为整数将处理新行。我number.between?(1,12)按照@steenslag 的建议使用来检查输入是否有效。

我尝试了哈希方法而不是case语句。循环是执行此操作的while一种方法,但这只是完成它的另一种方法。

于 2013-05-30T18:46:20.407 回答
1
print "Please, tell me the month's number!"
number = gets.to_i

chomp如果要使用,则永远不需要,to_i因为数字的本质表明它永远不会有行尾。

until number > 1 && number < 12  do

您确实希望数字包含 1 到 12,对吗?

你可以选择这样做,

until (1..12).include?(number) do

或者正如@teenslag 所说,

until number.between?(1, 12) do

我认为要么读起来更容易,between?方法可能是更好的选择。

    print "Please, re-type it again!"
    number = gets.to_i
end

如前所述,这可能非常干燥,或者使用内置的 Date 对象。但是,让我们看看我们可以用你拥有的代码做什么,本着同样的精神:

case number
    when 1 then print "This is January!"
    when 2 then print "This is February!"
    when 3 then print "This is March!"
    when 4 then print "This is April!"
    when 5 then print "This is May!"
    when 6 then print "This is June!"
    when 7 then print "This is July!"
    when 8 then print "This is August!"
    when 9 then print "This is September!"
    when 10 then print "This is October!"
    when 11 then print "This is November!"
    when 12 then print "This is December!"
end 

转向这个:

answer = case number
         when 1
           "January"
         when 2
           "February"
         when 3
           "March"
         when 4
           "April"
         when 5
           "May"
         when 6
           "June"
         when 7
           "July"
         when 8
           "August"
         when 9
           "September"
         when 10
           "October"
         when 11
           "November"
         when 12
           "December"
         end
print "This is #{answer}!"

虽然使用 Date 类会更好。

如果这对您不可用,那么也许我会考虑在这里使用哈希。我会让你探索这些选项。

甚至是一个数组。记住 Array 元素从位置 0 开始:

print "Please, tell me the month's number!"
until (number = gets.to_i).between?(1,12) do
    print "Please, re-type it again!"
end
months = %w[January February March April May June July August September October November December]
puts "This is #{months[number - 1]}!"
于 2013-05-27T07:31:00.623 回答
0

正如上面的海报所提到的,这个特定的实例不需要第二个条件。但是,如果您需要多重条件 while 循环,您将使用逻辑 AND 或逻辑 OR 运算符。

逻辑 AND 运算符是&&. 逻辑 OR 运算符是||. &&如果两个条件都需要为真以继续循环,您将使用。您将使用||if 一个或另一个需要为 true 来继续循环。

例如:

while number > 12 || number == 0 do
    stuff...
end

while number > 0 && number < 13 do
    stuff...
end

在第一个片段中,如果输入的数字大于 12 或等于 0,您将进入循环。在第二个片段中,如果输入的数字大于 0 且小于 13,您将进入循环。(显然,第二个将与您在此处使用的 while 循环完全相反,但包含在内用于演示)。

于 2013-05-27T02:27:20.610 回答
0

number将始终是整数,因为您将其转换为整数。

"foo".to_i
 => 0

您可能想改用范围。

until (1..12).include?(gets.chomp.to_i)
  print "Please, re-type it again!"
end

您还可以使用内置的数字到月份转换来干燥您的代码:

number = 4
Date::MONTHNAMES[number]
 => "April"
于 2013-05-27T01:57:13.843 回答
0

您需要的一个简单循环:

until month_num > 0 && month_num < 13 do
 # prompt again
end

更惯用的方法是在之间使用?或包括?

until month_num.between? (1, 12) do
  # prompt again
end

而不是 multiple when then,您可以使用 Date 模块中的哈希映射:-Date::MONTHNAMES[month_num]

于 2018-10-14T08:33:16.417 回答