0
0

More than 3 years have passed since last update.

閏年処理を考える

Posted at

ある年のある月の日数を求めるメソッドを作ります。2月、つまり閏年かどうかです。  
閏年かどうかは以下の判定基準があります。

① その年が4で割り切れる場合は閏年の可能性がある

まず、閏年は4で割り切れる年であることが最低条件ですね。4で割り切れる年は閏年である可能性です。ただし、4で割り切れるだけでは閏年とはかぎりません。例外が1つあります。

② 年が100で割り切れて400で割り切れない場合は閏年ではない

厄介な条件です。その年が4で割り切れても100で割り切れて400で割り切れない場合は閏年でない。

具体的な例

2000年
2000年は4で割り切れますね。そして100でも割り切れます。さらに400でも割り切れます。100でも400でも割り切れるので、2000年は閏年となります
1900年
1900年は4で割り切れますね。そして100でも割り切れます。ただし、400では割り切れません。100で割り切れて、400で割り切れないため、1900年は閏年ではありません

以上をふまえて閏年の判定。

雛形

question2.rb
  def get_days(year, month)
    # ここに処理を書き加えてください
  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}日間あります"

2月以外は各月の日数が決まっていますね。よって、とりあえず以下のようなソースコードを。

  def get_days(year, month)
    month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 各月の日数は配列で管理
    return month_days[month - 1]
  end

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

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

実はこれでほとんどの場合をカバーしています。ただし、例外が存在します。2月が閏年の場合。そこで2月のときにだけ条件分岐して別の処理を書く。

  def get_days(year, month)
    month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if month == 2 # 2月のとき
      # 閏年のときはdaysに29を代入
      # それ以外はdaysに28を代入
    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}日間あります"

あとは閏年か判定するだけです。閏年かどうかの判定は以下の2つです。

① その年が4で割り切れること
② ただし、年が100で割り切れて400で割り切れない場合は閏年ではない

これをソースコードにしていくと以下。

  year = 指定の年

  if year % 4 == 0                         # 年が4で割り切れること
    if year % 100 == 0 && year % 400 != 0  # 年が100で割り切れて400で割り切れない場合
      # 閏年でない
    else
      # 閏年
    end
  end

このソースコードをget_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                         # 年が4で割り切れること
        if year % 100 == 0 && year % 400 != 0  # 年が100で割り切れて400で割り切れない場合
          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}日間あります"
0
0
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0