回顾我的闰年计划

时间:2014-05-04 01:25:52

标签: ruby-on-rails ruby

我使用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循环中?

此外,任何其他指导和提示,以改善我的计划将不胜感激。

4 个答案:

答案 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