第8章の練習,投票


年月日

class Dt
  def initialize(y,m,d)
    @year = y
    @month = m
    @day = d
  end
end

次の結果は何?

irb(main):001:0> d=Dt.new(2008,12,23)
=> #
irb(main):002:0> d == Dt.new(2008,12,23)
  1. true
  2. false

年月日: 表示メソッド

class Dt
  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
end

年月日: アクセッサー

class Dt
  def getYear()
    @year
  end
  def getMonth()
    @month
  end
  def getDay()
    @day
  end
end
class Dt
  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
end

年月日: アクセッサーの一括生成

class Dt
  attr_accessor :year,:month,:day
end

年月日: サブクラスのメソッド

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
end

年月日: サブクラスのコンストラクタ

class Jdt < Dt
  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
class Jdt < Dt
  def initialize(y,m,d)
    super(y,m,d)
  end
end

年月日: 同じ日かどうかの判定

class Dt
  def eq(d)
    @year == d.getYear && @month == d.getMonth && @day == d.getDay
  end
end

練習: 日付の差

2つの年月日の差(間に何日あるか)を計算するインスタンスメソッドを書いてみよう。
class [[DtとJdtのどちら?]]
  def between(d)
    # ここを埋めてください.
  end
end
ヒント
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

式: コンストラクタ

class Expr
  def initialize(left, op, right)
    @left = left
    @op = op
    @right = right
  end
end

式: 表示

class Expr
  def to_s()
    s = "("
    s += @left.to_s()
    s += @op
    s += @right.to_s()
    s + ")"
  end
end

式: 計算

class Expr
  def to_f
    left = @left.to_f
    right = @right.to_f
    if @op == "+" then
      left + right
    elsif @op == "-" then
      left - right
    elsif @op == "*" then
      left * right
    elsif @op == "/" then
      left / right
    else
      0
    end
  end
end

複素数

class ComplexNumber
  attr_accessor :realPart,:imaginaryPart
  def initialize(r,i)
    @realPart = r
    @imaginaryPart = i
  end
end
def add(x,z)
  ComplexNumber.new(x.realPart + z.realPart , x.imaginaryPart + z.imaginaryPart)
end
def sub(x,z)
  ComplexNumber.new(x.realPart - z.realPart , x.imaginaryPart - z.imaginaryPart)
end
def multiply(x,z)
  ComplexNumber.new(x.realPart * z.realPart - x.imaginaryPart * z.imaginaryPart , x.realPart * z.imaginaryPart + x.imaginaryPart * z.realPart)
end
def rad2(x)
  x.realPart * x.realPart + x.imaginaryPart * x.imaginaryPart
end
def inv(x)
  r = rad2(x).to_f
  ComplexNumber.new(x.realPart/r,-x.imaginaryPart/r)
end
def division(x,z)
  multiply(x,inv(z))
end
x1 = ComplexNumber.new(1,2)
x2 = ComplexNumber.new(3,-4)
x3 = multiply(x1,x2)
division(x3,x1)
division(x3,x2)
multiply(inv(x3),x1)