わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

満年齢の計算

いきなりですが問題です.

コマンドライン引数から生年月日の情報を受け取り,本日の年齢を求めるプログラムを作りなさい.

そしてすぐコードです.

#!/usr/bin/env ruby

require 'date'

class Age
  def initialize(*b)
    case b[0]
    when Date
      @birth = b[0]
    when Integer
      @birth = Date.new(*b)
    else
      @birth = Date.new(1989, 1, 7)
    end

    # 年齢計算ニ関スル法律に基づき,誕生日の前日に満年齢を1加えるなら真
    @bylaw = true
  end
  attr_accessor :birth

  def calc_age
    today = Date.today

    # 未来の人の年齢を求めることはできない
    return -1 if today < @birth

    # 年差
    age = today.year - @birth.year

    # 日付比較
    b2 = Date.new(today.year, @birth.mon, @birth.mday)
    b2 -= 1 if @bylaw
    age -= 1 if today < b2

    # 戻り値
    age
  end
end

if __FILE__ == $0
  if ARGV.empty?
    ac = Age.new
  else
    year = ARGV.shift.to_i
    mon = (ARGV.shift || 1).to_i
    mday = (ARGV.shift || 1).to_i
    ac = Age.new(year, mon, mday)
  end

  puts "Birth date: #{ac.birth}"
  puts "Age: #{ac.calc_age}"
end

いくつか実行します.

$ date
Tue Jan 22 05:51:57 JST 2008

$ ruby age.rb
Birth date: 1989-01-07
Age: 19

$ ruby age.rb 2007 1 22
Birth date: 2007-01-22
Age: 1

$ ruby age.rb 2007 1 23
Birth date: 2007-01-23
Age: 1

$ ruby age.rb 2007 1 24
Birth date: 2007-01-24
Age: 0

$ ruby age.rb 2008 1 22
Birth date: 2008-01-22
Age: 0

$ ruby age.rb 2008 1 23
Birth date: 2008-01-23
Age: -1

なお,@bylawの値をfalseにすると,「ruby age.rb 2007 1 23」(去年の翌日)を実行したときの年齢は0となります.@bylawの真偽にかかわらず,「ruby age.rb 2008 1 23」は-1です.
それでは次の問題.

コマンドライン引数から「生年月日」「現在の日付」「年齢計算方法」の情報を受け取り,該当日の年齢を求めるプログラムを作りなさい.年齢計算方法としては,数え年,慣例による満年齢(誕生日に1加える),法に基づく満年齢(誕生日の前日に1加える)に対応すること.

なのですが,これはまた日を改めましてエントリにします.
関連: