レコード・オブジェクト・クラス(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
以下の実行をした場合,それぞれの結果はどうなるか.まずは,頭の中だけで考えてから,実行してみて結果を確かめなさい.
- d1.year-d2.year
- 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