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

Peter Junglas 8.10.1999