2013-02-21 46 views
1

我一直在学习Ruby。我写了一个小程序。我面临一个逻辑错误,目前我无法解决这个错误。这是代码。在Ruby中使用Modulus%操作符时出现逻辑错误

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, 我的意思是说它也应该显示1600,但程序只是简单地跳过它。我知道这只是一个像错误一样的发际线。但我无法弄清楚。

P.S.我是一个新手,所以请忽略任何一种愚蠢的错误。由于

回答

3

将您的字符串为整数一旦在开始:

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

那么你不必在你的代码中使用to_i其他地方。

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

+0

这工作。非常感谢。你救了我的一天:) – 2013-02-21 21:46:57

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 
+0

明白了。问题已解决。谢谢你的方式:) – 2013-02-21 21:56:40

+0

谢谢。这条建议对我来说是另一个宝石。下次会记住这一点。 :) – 2013-02-21 22:05:54