Rationale Zahlen als abstrakter Datentyp


module rational_arithmetic

  type Ratio
     integer  :: num, den
  end type Ratio
  
  private cancel
  
  interface operator(*)
     module procedure ratmul       
  end interface
  
contains
  
  type(Ratio) function ratmul(r1, r2)
    implicit none
    type(Ratio), intent(in) ::  r1, r2

    ratmul%num = r1%num * r2%num
    ratmul%den = r1%den * r2%den
    call cancel(ratmul)

  end function ratmul

  
  subroutine cancel(rat)
    implicit none
    type(Ratio), intent(inout) ::  rat
    
    integer u, v, r
    
    u = abs(rat%num)
    v = abs(rat%den)
    
    do
       if (v == 0) exit
       r = mod(u, v)
       u = v
       v = r
    end do
    
    rat%num = rat%num / u
    rat%den = rat%den / u  
    
  end subroutine cancel
  
end module rational_arithmetic


program ratiofarm
  use rational_arithmetic
  
  type(Ratio)  :: a, b, c
  
  a = Ratio(2,5)
  b = Ratio(1,6)
  c = a * b
  print*, c

end program ratiofarm

previous    contents     next

Peter Junglas 8.10.1999