閏年(Leap Year)判別コード

 というわけで(id:heydays:20080508:1210235785)、模範解答を参考に閏年(Leap Year)判別コードを見直してみる。こうして見直してみると、プログラム初心者丸出しで恥ずかしいことこの上ないけど、そこら辺は気にしない気にしない。

Leap Years. Write a program which will ask for a starting year and an ending year, and then puts all of the leap years between them (and including them, if they are also leap years). Leap years are years divisible by four (like 1984 and 2004). However, years divisible by 100 are not leap years (such as 1800 and 1900) unless they are divisible by 400 (like 1600 and 2000, which were in fact leap years). (Yes, it’s all pretty confusing, but not as confusing has having July in the middle of the winter, which is what would eventually happen.)

6. Flow Control

 この練習問題の僕の解答は以下だった。

puts 'Enter a start year.'
sYear = gets.chomp
puts ''
puts 'Enter an end year.'
eYear = gets.chomp
puts ''
if sYear > eYear
puts 'An end year must be equal to or greater than a start year.'
else
puts 'The leap years between ' + sYear.to_s + ' and ' + eYear.to_s + ' are listed below.'
puts ''
while sYear.to_i != (eYear.to_i + 1)
aYear = sYear.to_i % 4
bYear = sYear.to_i % 100
cYear = sYear.to_i % 400
if aYear == 0
if bYear != 0
puts sYear.to_s
else
if cYear == 0
puts sYear.to_s
end
end
end
sYear = sYear.to_i + 1
end
end

 そして、id:Kiskeさんの模範解答(id:Kiske:20070705:1183627478)は以下。

puts '開始年を入力.'
from = gets.chomp.to_i
puts '終了年を入力.'
to = gets.chomp.to_i
puts "#{from}年~#{to}年のうるう年一覧"
while from <= to
if (from % 4 == 0 and from % 100 != 0 or from % 400 == 0)
puts from.to_s + ''
end from = from + 1
end

rubyチュートリアルを試してみる その2 – note-phper

なるほどー。

こうして見ると、もう全然だめですな、僕のコードは。この練習問題のキーである閏年をいかに判別するか、っていうところが僕の書いたコードだと何かしつこい。

閏年は以下のルールから判別する。

  • 4で割り切れる
  • かつ、100で割り切れない
  • 100で割り切れる場合、400で割り切れれば、閏年

これを、if文一行で書けるってことに気付かなかった。勉強になりました。

あと、『gets.chomp』を『gets.chomp.to_i』とすることで、変数に入力した文字列を数(Integer)として扱うことができる、っていうのも気付かなかったなあ。なるほど。

 というわけで、僕の書いたコードを上記模範解答を参考にして、書き換えてみる。

puts 'Enter a start year.'
sYear = gets.chomp.to_i
puts ''
puts 'Enter an end year.'
eYear = gets.chomp.to_i
puts ''
if sYear > eYear
puts 'An end year must be equal to or greater than a start year.'
else
puts 'The leap years between ' + sYear.to_s + ' and ' + eYear.to_s + ' are listed below.'
puts ''
while sYear <= eYear
if (sYear % 4 == 0 and sYear % 100 != 0 or sYear % 400 == 0)
puts sYear.to_s
end
sYear = sYear + 1
end
end

んー、シンプル。

Many thanks to id:Kiske

See also

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.