いきなりですが問題です.
コマンドライン引数から生年月日の情報を受け取り,本日の年齢を求めるプログラムを作りなさい.
そしてすぐコードです.
#!/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加える)に対応すること.
なのですが,これはまた日を改めましてエントリにします.
関連: