レコード・オブジェクト・クラス(1) 演習


インスタンス変数とコンストラクタ

スライドで使ったクラスDtの定義をまとめたものを以下に示す(dt.rb).
class Dt
  def initialize(y,m,d)
    @year = y
    @month = m
    @day = d
  end
  def to_print
    monthName = [0,"Jan","Feb","Mar","Apr",
			"May","Jun","Jul","Aug",
			"Sep","Oct","Nov","Dec"]
    monthName[@month]+" "+@day.to_s+", "+@year.to_s
  end
  def getYear
    @year
  end
  def getMonth
    @month
  end
  def getDay
    @day
  end
  def setYear(y)
    if y > 1868
      @year = y
    end
  end
  def setMonth(m)
    if 1 <= m && m <= 12
      @month = m
    end
  end
  def setDay(d)
    if 1 <= d && d <= 31
      @day = d
    end
  end
  attr_accessor :year,:month,:day
end


練習問題

上のクラスDtを読み込んだ後で,以下のようにしてDtクラスの オブジェクトの作成,メソッド呼び出しをおこなった.
d1=Dt.new(2007,12,12)
d2=Dt.new(2008,2,14)
d1.setMonth(d1.getMonth()-1)
d2.setDay(d2.getDay()+5)
d1.year=d2.year
以下の実行をした場合,それぞれの結果はどうなるか.まずは,頭の中だけで考えてから,実行してみて結果を確かめなさい.
  1. d1.year-d2.year
  2. d1.to_print()

サブクラスの利用

スライドで使ったクラスJdtの定義をまとめたものを以下に示す(jdt.rb).
class Jdt < Dt
  def to_print
    if @year > 1988
      gengo = "Heisei"
      jyear = @year - 1988
    elsif @year > 1925
      gengo = "Showa"
      jyear = @year - 1925
    elsif @year > 1911
      gengo = "Taisho"
      jyear = @year - 1911
    elsif @year > 1867
      gengo = "Meiji"
      jyear = @year - 1867
    else
      gengo = "out-of-range"
      jyear = @year
    end
    gengo+jyear.to_s+"Nen"+@month.to_s+"Gatsu"+@day.to_s+"Nichi"
  end
  def initialize(g,y,m,d)
    if g == "H"
      year = y+1988
    elsif g == "S"
      year = y+1925
    elsif g == "T"
      year = y+1911
    elsif g == "M"
      year = y+1867
    else
      year = y
    end
    @year = year
    @month = m
    @day = d
  end
end

練習問題

2つの年月日の差(今日と昨日の間の差は1日とする)を計算するインスタンスメソッドを書いてみよう。
class ???
  def between(d)
    ???
  end
end
のようにして定義する.完成すると,
f=Jdt.new("H",19,10,1)
t=Dt.new(2008,3,31)
t.between(f)
のように使える(答えは182となる).
ヒント
1から書いても良いが,以下のメソッドを使っても良い(dt1.rb). 以下のメソッドを使わずに書く場合はなるべく短く書く試みをしてみると面白いだろう.
# ある年が閏年かどうか?
# leap_year(2007)
# => false    # 2007年は閏年でない
# leap_year(2008)
# => true     # 2008年は閏年
def leap_year(year) 
  if year%400==0 
    true
  elsif year%100==0 
    false
  elsif year%4==0 
    true
  else 
    false
  end 
end
# 2つの年の1月1日同士が何日離れているか?
# dayDifference(2008,2007)
# => 365 # 2008年1月1日と2007年1月1日は365日差
# dayDifference(2017,2007)
# => 3653 # 2017年1月1日と2007年1月1日は3653日差
def dayDifference(year1,year2)
  if(year2>year1)
    -dayDifference(year2,year1)
  else
    d=0
    for y in year2..(year1-1)
      if leap_year(y)
       d+=366
      else
       d+=365
      end
    end
    d
  end
end
# ある年のX月Y日は同じ年の1月1日から何日離れているか?
# daysFromNewYear(2007,12,12) 
# => 345  # 2007年12月12日と2007年1月1日から345日後
def daysFromNewYear(year,month,day)
  daysOfMonth=[0,31,28,31,30,31,30,31,31,30,31,30,31]
  if leap_year(year)
    daysOfMonth[2]=29
  end
  d=0
  m=1
  while m < month
    d=d+daysOfMonth[m]
    m=m+1
  end
  d+(day-1)
end