0

Learn to Program (第 2 版)には、指定された日付の間のうるう年を見つける演習があります。

開始年と終了年を要求し、それらの間にすべてのうるう年を挿入するプログラムを作成します (うるう年でもある場合は、それらも含めます)。うるう年は 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 に変更する必要があるのか​​、なぜ 2 つのelsifステートメント ( % 100and % 4) が 2 つのステートメントの後に何をすべきかについての指示がないのはなぜだろうと思っていました% 100

説明書では400と100を扱う操作をグループ化する必要があるように見えたが、これは100と4を扱う操作をグループ化しているようだ。たとえば、このコードは明らかに機能し、1900 年をうるう年としてリストしていませんが、どのように機能するのでしょうか?

コードを見ていると、反復が 1900 になると (開始日と終了日がそれぞれ 1000 年と 2000 年であるとします)、最初の if チェックは失敗しますが、両方のelsifs に合格します。では、なぜそれが出力の一部ではないのでしょうか?


編集

これが私のコードの再フォーマットです。また、私の意見では物事を少し単純化するいくつかの変更を加えました。

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
4

6 に答える 6

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
于 2013-11-10T02:50:38.287 に答える
0

Rubyドキュメントで配列を調べたところ、この簡単な解決策が見つかりました:

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

範囲を配列に変換します。次に、うるう年として分類されない要素を削除します。

于 2014-05-10T19:46:46.537 に答える
-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
于 2016-02-07T14:32:26.037 に答える