在Ruby中使用Modulus%运算符时的逻辑错误

时间:2013-02-21 21:35:48

标签: ruby

我一直在学习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

这是该计划的作用 它要求开始年份和结束年份,然后“放置”它们之间的所有闰年(并包括它们,如果它们也是闰年)。闰年是可被4整除的年份(如1984年和2004年)。然而,被100整除的年份不是闰年(例如1800和1900),除非它们可以被400整除(例如1600和2000,实际上是闰年)。

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

开始

1604, 1608年, 1612, 。 。 。 。 。 1696, 1704年, 1708, 。 。 。 。 。 。 1992年, 1996年, 2000
我的意思是逻辑上它也应该显示1600但程序只是跳过它。我知道这只是一个错误的发线。但我无法弄明白。

P.S。我是新手所以请忽略任何愚蠢的错误。感谢

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

问题是您最初传递字符串"1600",字符串格式化方法%适用于该字符串,并返回self。这不是0,因此不满足条件。从第二次迭代开始,它将转换为整数,因此它可以按预期工作。您应该在输入后直接转换字符串:

startingYear = gets.to_i
endingYear = gets.to_i

另外,请注意逻辑中的一些冗余。例如,如果一年可以被400整除,那么它可以被4整除,因此在后者的测试中嵌套测试对于后者是多余的。更清晰的逻辑是这样的:

(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