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
ステートメント ( % 100
and % 4
) が 2 つのステートメントの後に何をすべきかについての指示がないのはなぜだろうと思っていました% 100
。
説明書では400と100を扱う操作をグループ化する必要があるように見えたが、これは100と4を扱う操作をグループ化しているようだ。たとえば、このコードは明らかに機能し、1900 年をうるう年としてリストしていませんが、どのように機能するのでしょうか?
コードを見ていると、反復が 1900 になると (開始日と終了日がそれぞれ 1000 年と 2000 年であるとします)、最初の if チェックは失敗しますが、両方のelsif
s に合格します。では、なぜそれが出力の一部ではないのでしょうか?
編集
これが私のコードの再フォーマットです。また、私の意見では物事を少し単純化するいくつかの変更を加えました。
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