ino-akiのブログ

ITエンジニアを目指して学習したことをアウトプットするブログ

Rubyドリル 閏年問題

本日は、指定された西暦年と月に基づいて、その月の日数を求めるプログラムを作成する課題に取り組みます。特に、閏年について考慮する必要があります。

問題の説明

西暦の年と月を入力し、その月の日数を求めるプログラムを作成します。閏年については以下の基準で判断します。

  1. 年が4で割り切れる場合は閏年の可能性があります。
  2. ただし、年が100で割り切れる場合は閏年ではありません。
  3. さらに、年が400で割り切れる場合は閏年です。

出力例:

  • 1990年2月 => "1990年2月は28日間あります"
  • 2000年2月 => "2000年2月は29日間あります"
  • 2100年2月 => "2100年2月は28日間あります"
  • 2000年3月 => "2000年3月は31日間あります"

コードの雛形

def get_days(year, month)
  month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  # ここに処理を書き加えてください
end

puts "年を入力してください:"
year = gets.to_i
puts "月を入力してください:"
month = gets.to_i

days = get_days(year, month)
puts "#{year}年#{month}月は#{days}日間あります"

模範解答

以下は、上記の条件を考慮して実装したプログラムの解答例です。

def get_days(year, month)
  month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  
  if month == 2
    if year % 4 == 0
      if year % 100 == 0 && year % 400 != 0
        days = 28 # 閏年でない
      else
        days = 29 # 閏年
      end
    else
      days = 28 # 閏年でない
    end
  else
    days = month_days[month - 1]
  end

  return days
end

puts "年を入力してください:"
year = gets.to_i
puts "月を入力してください:"
month = gets.to_i

days = get_days(year, month)
puts "#{year}年#{month}月は#{days}日間あります"

解説

  1. 月の日数の配列:

    • month_days 配列に各月の日数を格納しています。2月は28日ですが、閏年の場合は29日になります。
  2. 閏年の判断:

    • 年が4で割り切れる場合は、さらにその年が100で割り切れるかどうかを確認します。
    • 100で割り切れる場合は、さらに400で割り切れるかどうかを確認します。
    • これらの条件に基づいて、2月の日数を決定します。
  3. 月が2月以外の場合:

    • 配列 month_days から対応する月の日数を取得します。

このプログラムを使えば、指定された年と月に応じて正しい日数を出力することができます。