在闰年示例中使用float和多个'elsif'语句

时间:2013-11-10 00:59:07

标签: ruby

学习编程(第二版)中,可以找到给定日期之间的闰年

  编写一个要求开始年份和结束年份的程序,然后将所有闰年放在它们之间(如果它们也是闰年,则包括它们)。闰年是可被4整除的年份(如1984年和2004年)。然而,被100整除的年份不是闰年(例如1800和1900),除非它们也可以被400整除(例如1600和2000,实际上是闰年)。真糟糕!

我做了一些挖掘并找到了'答案键'。根据密钥,正确的代码如下:

puts 'Input a starting year:'
start_year = gets.chomp
puts 'Input an ending year:'
end_year = gets.chomp
puts ''

while start_year.to_i <= end_year.to_i

  if start_year.to_f % 400 == 0
    puts start_year
  elsif start_year.to_f % 100 == 0
  elsif start_year.to_f % 4 == 0
    puts start_year 
  end

  start_year = start_year.to_i + 1

end

我想知道为什么start_year需要更改为float,以及为什么连续有两个elsif语句(% 100% 4)没有任何说明在% 100之后要做什么。

从指令中可以看出,需要对处理400和100的操作进行分组,但这似乎有100个和4个分组的操作。例如,这个代码显然有效,并没有将1900列为闰年,但它是如何工作的?

当我查看代码时,当迭代到达1900时(假设我的开始和结束日期分别为1000和2000),如果检查它将失败第一个但是然后传递elsif两个秒。那么为什么它不是输出的一部分呢?


修改

这是我重新格式化代码。我也做了一些改变,在我看来简化了一些事情。

puts 'Input a starting year:'
start_year = gets.chomp.to_i
puts 'Input an ending year:'
end_year = gets.chomp.to_i
puts ''

while start_year <= end_year

  if start_year % 400 == 0
    puts start_year
  elsif start_year % 100 == 0
  elsif start_year % 4 == 0 
    puts start_year
  end

  start_year = start_year + 1

end

6 个答案:

答案 0 :(得分:4)

你的任务非常模糊,你提出的答案会分散注意力。

这就是我在Ruby中解决问题的方法。获取开始和结束年份是微不足道的。

start_year = 1999
end_year   = 2050

def leap(year)
  year /= 100 if year % 100 == 0
  year % 4 == 0
end

puts (start_year..end_year).to_a.find_all { |year| leap(year) }

<强>输出

2000
2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048

答案 1 :(得分:2)

没有理由转换为float而不是整数。

至于“空”的elseif子句,对于那种情况,它基本上是一个“无操作”,以避免随后的可分为四的测试。具体来说,1900案例满足% 100 == 0条款,因此不会被视为闰年。

顺便说一下,正如你可能已经猜到的那样,这是非惯用的Ruby,而不仅仅是因为缩进。

答案 2 :(得分:1)

这是打印闰年的另一种方式。我已将范围作为参数传递给函数。

def checkleap(rang)
  puts (rang).select{|z| (z % 4 == 0 && z % 100 != 0) || z  % 400 == 0} 
end

checkleap(2000..3000)

答案 3 :(得分:0)

我只是自己回答了Chris Pine的教程,我相信我的答案(作为一个完整的红宝石nuby)比你的建议更简单:

puts 'What is the starting year?'
starting_year = gets.chomp.to_i
puts 'What is the ending year?'
ending_year = gets.chomp.to_i

while starting_year <= ending_year
  if starting_year%4 == 0 || (starting_year%100 != 0 && starting_year%400 == 0)
    puts starting_year 
  end 
  starting_year+=1
end

答案 4 :(得分:0)

我在ruby docs中查找了数组并找到了这个简单的解决方案:

puts "Starting Year"
syear = gets.chomp
puts "Ending Year"
eyear = gets.chomp
puts ""

lyear = (syear.to_i..eyear.to_i).to_a
lyear.reject!{|x| x % 4 != 0|| (x % 100 == 0 && x % 400 != 0) }

puts lyear

它将范围转换为数组。然后删除不作为闰年分类的元素。

答案 5 :(得分:-1)

puts "What is the starting year?"
start_year = gets.chomp
puts "What is the ending year?"
end_year = gets.chomp
  if (start_year.to_i && end_year.to_i)% 4 == 0
   puts "The  start_year is #{start_year.to_i} and end year  is{end_year.to_i}"
  for leap in start_year.to_i..end_year.to_i
    if leap % 4 == 0
        puts "The leap year is #{leap}"
    else 
          puts "No leap year"
    end
  end
end