初めてのプログラミング4(閏年)

当ブログに於いてRuby及びプログラミングの入門書 初めてのプログラミング の各章の最後に位置付けられる練習問題にて正解の掲載されぬに 少しく不安を感じたかも知れぬ本誌購読のご同志の為の、 参照、比較検討用に生贄的に供す個人的な解釈、解答を掲載したのは
7章 流れ制御
7.1 比較メソッド
7.2 分岐
7.3 ループ
7.4 論理を少し
7.5 練習問題
に対するアーティクルとして、 での64頁の練習問題
7.5.1. 99本のビールが壁に
遠足などでよく歌われる古典的な童謡の歌詞、「 99 Bottles of Beer on the Wall 」を出力するプログラムを書いてみましょう。
に対するものでした。

当章には他にも練習問題が65頁に
7.5.2. 耳の遠いおばあちゃん
及び
7.5.3. 耳の遠いおばあちゃんのプログラムの拡張
と用意され、入力の大文字、小文字に対する判定の上、 表示を分岐させる要請なのですが、他にも最後に66頁に一問
7.5.4. うるう年
開始の年と終わりの年を聞いて、 その間にあるすべてのうるう年を (もし開始や終了の年がうるう年だったらそれも含めて) 表示するプログラムを書いてみましょう。 うるう年は(1984年や2004年のように)4で割り切れる数の年です。 ただし、100で割り切れる年(例えば、1800年や1900年)はうるう年では なくて 、さらに、それは 400で割り切れない限り です(つまり、1600年や2000年はうるう年です)。 けっこう複雑ですね。
とあれば、今回は此方への当方の解答例を贄に供したいと思います。
スポンサーリンク
条件分岐を3種類用意してみましたが、 利用者に入力を促す部分は共通で
puts ´閏年が指定の期間に何回存在するか調べるプログラムです。´
puts ´開始の年は?´
start_year = gets.chomp
puts ´終了の年は?´
stop_year = gets.chomp

leap_year = 0
cnt_year = start_year.to_i
としました。変数 leap_year を繰り返し分の中で条件に叶う度にカウントを加増して、 最終的に利用者に対する回答として提示します。
100で割り切れる年が特殊な扱われ方をしますから、 400で割り切れる年との兼ね合いで処理を変え、 三種類の条件分岐を考えてみた内、 最初の
leap_year1.rb
while cnt_year <= stop_year.to_i
  if cnt_year%4 == 0
    leap_year = leap_year + 1
  end
  if cnt_year%100 == 0
    leap_year = leap_year - 1
  end
  if cnt_year%400 == 0
    leap_year = leap_year + 1
  end
  cnt_year = cnt_year + 1
end
puts ´指定期間に閏年は´ + leap_year.to_s + ´回在ります。´
は最も単純で設問設定通り、開始から終了の年をループさせる中で、 4で割り切れればカウントを増やし、 100で割り切れればカウントを減らし、 400で割り切れればカウントを増やすことを順番に実行させており、 次の
leap_year2.rb
while cnt_year <= stop_year.to_i
  if cnt_year%4 == 0
    if cnt_year%100 == 0
      if cnt_year%400 == 0
        leap_year = leap_year + 1
      end
    else
      leap_year = leap_year + 1
    end
  end
  cnt_year = cnt_year + 1
end
puts ´指定期間に閏年は´ + leap_year.to_s + ´回在ります。´
では各条件をネストさせることでカウントの増減を調整し、 最後三つ目の
leap_year3.rb
while cnt_year <= stop_year.to_i
  if cnt_year%4 == 0
    if cnt_year%100 != 0 || cnt_year%400 == 0
        leap_year = leap_year + 1
    end
  end
  cnt_year = cnt_year + 1
end
puts ´指定期間に閏年は´ + leap_year.to_s + ´回在ります。´
では分岐の条件を少し工夫してネストの階層を減らしています。

以上の3プログラムを、現在の手元環境
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
で走らせて得られる結果は、
C:¥tsukamotch¥Ruby¥programs>leap_year1.rb
閏年が指定の期間に何回存在するか調べるプログラムです。
開始の年は?
2000
終了の年は?
2008
指定期間に閏年は3回在ります。

C:¥tsukamotch¥Ruby¥programs>leap_year2.rb
閏年が指定の期間に何回存在するか調べるプログラムです。
開始の年は?
2000
終了の年は?
2008
指定期間に閏年は3回在ります。

C:¥tsukamotch¥Ruby¥programs>leap_year3.rb
閏年が指定の期間に何回存在するか調べるプログラムです。
開始の年は?
2000
終了の年は?
2008
指定期間に閏年は3回在ります。
の通り、問題無く想定内の結果を得られました。

解答の正確性については、或る程度の範囲であれば、 閏年の情報を提供をしてくれているサイト 閏年(うるうどし=一行リンク色)と干支(えと)の一覧 でご確認、ご検証いただくことが出来ますので、ご参考下さい。