1

我一直在学习Ruby。我写了一个小程序。我面临一个逻辑错误,到目前为止我无法修复。这是代码。

 1:  puts 'Please enter the starting Year'  
 2:  startingYear = gets.chomp  
 3:  puts 'Please enter the ending Year'  
 4:  endingYear = gets.chomp  
 5:  while(startingYear.to_i <= endingYear.to_i)  
 6:     if(startingYear%4 == 0)
 7:            if((startingYear%400 == 0) or (startingYear%100 != 0))
 8:                   puts startingYear
 9:            end
10:     end
11:     startingYear = startingYear.to_i + 1
12:  end

这是这个程序的作用。
它要求开始年份和结束年份,然后在它们之间“放置”所有闰年(如果它们也是闰年,则包括它们)。闰年是能被四整除的年份(如 1984 年和 2004 年)。但是,可以被 100 整除的年份不是闰年(例如 1800 和 1900),除非它们可以被 400 整除(例如 1600 和 2000,它们实际上是闰年)。

我也使用了 Ruby 调试器。当我执行程序时,它只是在第一次迭代时跳过第 6 行。之后它工作得很好。
例如:当我使用输入 1600 作为起始年份和 2000 作为结束年份时。然后输出从:

1604、1608、1612、…… . . . . 1696、1704、1708、…… . . . . . 1992, 1996, 2000
我的意思是逻辑上它也应该显示 1600 但程序只是跳过它。我知道这只是一条发际线之类的错误。但我就是想不通。

PS我是新手,所以请忽略任何愚蠢的错误。谢谢

4

2 回答 2

3

在开始时将字符串转换为整数:

startingYear = gets.chomp.to_i 
endingYear = gets.chomp.to_i

然后,您不必to_i在代码中的其他任何地方使用。

您的程序在第一次迭代时跳过了第 6 行,因为您startingYear是第一次通过循环的字符串。

于 2013-02-21T21:43:17.553 回答
0

The problem is that you are passing a string "1600" initially, to which the string formatting method % applies, and returns self. which is not 0, so it does not satisfy the condition. From the second iteration, it is converted to an integer, so it works as you intended. You should convert the string once directly after the input:

startingYear = gets.to_i
endingYear = gets.to_i

Also, note some redundancy in your logic. For example, if a year is divisible by 400, then it follows that it is divisible by 4, so nesting the test for the former inside the test for the latter is redundant. A cleaner logic would be like this:

(startingYear..endingYear).each do |year|  
  if    (year % 400).zero? then puts year
  elsif (year % 100).zero?
  elsif (year %   4).zero? then puts year
  end
end
于 2013-02-21T21:49:01.793 回答