我一直在学习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。我是新手所以请忽略任何愚蠢的错误。感谢
答案 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