我使用Chris Pine的教程学习红宝石:https://pine.fm/LearnToProgram/?Chapter=06
基本上,任务是写一个闰年计划:
编写一个程序,要求开始年份和结束年份,然后将所有闰年放在它们之间(如果它们也是闰年,则包括它们)。闰年是可被4整除的年份(如1984年和2004年)。然而,被100整除的年份不是闰年(例如1800和1900),除非它们可以被400整除(例如1600和2000,实际上是闰年)。
这是我写的程序:
puts "leap years program"
puts ""
puts "what is the starting year?"
startYear = gets.to_i
puts "what is the ending year?"
while (endYear = gets.to_i) < startYear
puts "ending year should be later than starting year, please re-input:"
end
while startYear < endYear
while ((startYear % 4 == 0 and startYear % 100 != 0) or (startYear % 100 == 0 and startYear % 400 == 0))
puts startYear.to_s
startYear = startYear + 1
end
startYear = startYear + 1
end
为什么我需要两次写startYear = startYear + 1
- 一次在内部while循环中,一次在外部while循环中?
此外,任何其他指导和提示,以改善我的计划将不胜感激。
答案 0 :(得分:0)
您可以添加条件&#39; startYear&lt; endYear&#39;在内在的循环条件&#39; while((startYear%4 == 0和startYear%100!= 0)或(startYear%100 == 0和startYear%400 == 0))&#39;所以你不再需要外循环了,你只需要一个循环。
答案 1 :(得分:0)
@Jimmy:
你编写程序的方式,如果你没有在你的内循环中增加startYear,那将是一个无限循环。你第一次找到闰年并进入内循环时,你永远不会退出它,因为内循环条件总是正确的。
如果您使用startYear = 2000进入内部循环并且从未在该循环内增加它,那么您的输出将类似于:
2000 2000 2000 ...
因此,您将startYear增加1,使其成为2001,这会使内循环条件失败。然后,在外循环中再次将startYear递增1,然后再次针对内循环条件对其进行测试。这可以确保您不会在同一年进行两次测试。
答案 2 :(得分:0)
当您真正需要做的是在外部循环中每次迭代检查一次时,您正在使用内部循环。因此,您可以尝试在循环内使用条件:
while startYear < endYear
if (startYear % 4 == 0 and startYear % 100 != 0) or
(startYear % 100 == 0 and startYear % 400 == 0)
puts startYear.to_s
end
startYear = startYear + 1
end
我讨厌循环,因为我经常发现它们难以预测。以下是我可以避免在这里使用的方法:
(endYear - startYear).times do |year|
if year % 4 == 0 and year % 100 != 0 or
year % 100 == 0 and year % 400 == 0
puts year.to_s
end
答案 3 :(得分:-1)
也许这更好:
puts "leap years program".center(60)
puts ""
puts 'Please type a starting year: '
starting = gets.to_i
puts 'Please type a ending year: '
while (ending = gets.to_i) < starting
puts 'ending year should be later than starting year, please re-input:'
end
puts 'All leap years below:'
while starting <= ending
if (starting%100 != 0 and starting%4 == 0) or (starting%100 == 0 and starting%400 == 0)
puts starting
end
starting = starting + 1
end