[Fortran] 纯文本查看 复制代码
module rational_class
implicit none
private
type,public :: rational !分数类
private
integer :: num ! 分子
integer :: denom ! 分母
contains
private
! 加法+
procedure,pass(this) :: rat__rat_plus_rat,rat__int_plus_rat,rat__rat_plus_int
generic,public :: operator(+) => rat__rat_plus_rat,rat__int_plus_rat,rat__rat_plus_int
! 减法-
procedure,pass(this) :: rat__rat_minus_rat,rat__int_minus_rat,rat__rat_minus_int
generic,public :: operator(-) => rat__rat_minus_rat,rat__int_minus_rat,rat__rat_minus_int
! 乘法*
procedure,pass(this) :: rat__rat_times_rat,rat__int_times_rat,rat__rat_times_int
generic,public :: operator(*) => rat__rat_times_rat,rat__int_times_rat,rat__rat_times_int
! 除法/
procedure,pass(this) :: rat__rat_div_rat,rat__int_div_rat,rat__rat_div_int
generic,public :: operator(/) => rat__rat_div_rat,rat__int_div_rat,rat__rat_div_int
! 乘方**
procedure,pass(this) :: rat__rat_exp_int
generic,public :: operator(**) => rat__rat_exp_int
! 赋值=
procedure,pass(this) :: rat_eq_rat,int_eq_rat,real_eq_rat,rat_eq_int
generic,public :: assignment(=) => rat_eq_rat,int_eq_rat,real_eq_rat,rat_eq_int
! 大于>
procedure,pass(this) :: rat_gt_rat,int_gt_rat,rat_gt_int
generic,public :: operator(>) => rat_gt_rat,int_gt_rat,rat_gt_int
! 小于<
procedure,pass(this) :: rat_lt_rat,int_lt_rat,rat_lt_int
generic,public :: operator(<) => rat_lt_rat,int_lt_rat,rat_lt_int
! 等于==
procedure,pass(this) :: rat_compare_rat,int_compare_rat,rat_compare_int
generic,public :: operator(==) => rat_compare_rat,int_compare_rat,rat_compare_int
! 不等于/=
procedure,pass(this) :: rat_ne_rat,int_ne_rat,rat_ne_int
generic,public :: operator(/=) => rat_ne_rat,int_ne_rat,rat_ne_int
! >=
procedure,pass(this) :: rat_ge_rat,int_ge_rat,rat_ge_int
generic,public :: operator(>=) => rat_ge_rat,int_ge_rat,rat_ge_int
! <=
procedure,pass(this) :: rat_le_rat,int_le_rat,rat_le_int
generic,public :: operator(<=) => rat_le_rat,int_le_rat,rat_le_int
procedure,pass(this),public :: output,input,set
end type rational
contains
! 分数>分数
function rat_gt_rat(this,b) !改动
logical :: rat_gt_rat
class(rational), intent(in) :: this,b !改动
type(rational) :: fa !改动
fa = (this - b) !与彭国伦书上算法不同
if (fa%num > 0)then !差值的分子大于0
rat_gt_rat = .true.
else
rat_gt_rat = .false.
end if
return
end function rat_gt_rat
! 整数>分数
function int_gt_rat(a,this) !改动
logical :: int_gt_rat
integer,intent(in) :: a
class(rational),intent(in) :: this !改动
type(rational) :: fa !改动
fa = (a - this)
if (fa%num > 0)then !差值的分子大于0
int_gt_rat = .true.
else
int_gt_rat = .false.
end if
return
end function int_gt_rat
! 分数>整数
function rat_gt_int(this,b) !改动
logical :: rat_gt_int
class(rational),intent(in) :: this !改动
integer,intent(in) :: b
type(rational) :: fa !改动
fa = (this - b) !改动
if (fa%num > 0)then !差值的分子大于0
rat_gt_int = .true.
else
rat_gt_int = .false.
end if
return
end function rat_gt_int
! 分数<分数
function rat_lt_rat(this,b) !改动
logical :: rat_lt_rat
class(rational), intent(in) :: this,b !改动
!利用等价
rat_lt_rat = rat_gt_rat(b,this) !利用现有函数
return
end function rat_lt_rat
! 整数<分数
function int_lt_rat(a,this) !改动
logical :: int_lt_rat
integer,intent(in) :: a
class(rational),intent(in) :: this !改动
!利用等价
int_lt_rat = rat_gt_int(this,a) !利用现有函数
return
end function int_lt_rat
! 分数<整数
function rat_lt_int(this,b) !改动
logical :: rat_lt_int
class(rational),intent(in) :: this !改动
integer,intent(in) :: b
!利用等价
rat_lt_int = int_gt_rat(b,this) !利用现有函数
return
end function rat_lt_int
! 分数==分数
function rat_compare_rat(this,b) !改动
logical :: rat_compare_rat
class(rational), intent(in) :: this,b !改动
type(rational) :: c !改动
c = (this - b) !改动
if ( c%num == 0 ) then !差值的分子等于0
rat_compare_rat = .true.
else
rat_compare_rat = .false.
end if
return
end function rat_compare_rat
! 整数==分数
function int_compare_rat(a,this) !改动
logical :: int_compare_rat
integer,intent(in) :: a
class(rational), intent(in) :: this !改动
!利用等价
int_compare_rat = rat_compare_int(this,a) !利用现有函数
return
end function int_compare_rat
! 分数==整数
function rat_compare_int(this,b) !改动
logical :: rat_compare_int
class(rational), intent(in) :: this !改动
integer,intent(in) :: b
type(rational) :: c !改动
c = (this - b) !改动
if ( c%num == 0 ) then !差值的分子等于0
rat_compare_int = .true.
else
rat_compare_int = .false.
end if
return
end function rat_compare_int
! 分数/=分数
function rat_ne_rat(this,b) !改动
logical :: rat_ne_rat
class(rational), intent(in) :: this,b !改动
rat_ne_rat = .not.rat_compare_rat(this,b) !利用现有函数
return
end function rat_ne_rat
! 整数/=分数
function int_ne_rat(a,this) !改动
logical :: int_ne_rat
integer,intent(in) :: a
class(rational), intent(in) :: this !改动
int_ne_rat = .not.int_compare_rat(a,this) !利用现有函数
return
end function int_ne_rat
! 分数/=整数
function rat_ne_int(this,b) !改动
logical :: rat_ne_int
class(rational), intent(in) :: this !改动
integer,intent(in) :: b
rat_ne_int = .not.rat_compare_int(this,b) !利用现有函数
return
end function rat_ne_int
! 分数>=分数
function rat_ge_rat(this,b) !改动
logical :: rat_ge_rat
class(rational), intent(in) :: this,b !改动
rat_ge_rat = rat_gt_rat(this,b) .or. rat_compare_rat(this,b) !利用现有函数
return
end function rat_ge_rat
! 整数>=分数
function int_ge_rat(a,this) !改动
logical :: int_ge_rat
integer,intent(in) :: a
class(rational),intent(in) :: this !改动
int_ge_rat = int_gt_rat(a,this) .or. int_compare_rat(a,this) !利用现有函数
return
end function int_ge_rat
! 分数>=整数
function rat_ge_int(this,b) !改动
logical :: rat_ge_int
class(rational),intent(in) :: this !改动
integer,intent(in) :: b
rat_ge_int = rat_gt_int(this,b) .or. rat_compare_int(this,b) !利用现有函?
return
end function rat_ge_int
! 分数<=分数
function rat_le_rat(this,b) !改动
logical :: rat_le_rat
class(rational), intent(in) :: this,b !改动
!利用等价
rat_le_rat = rat_ge_rat(b,this) !利用现有函数
return
end function rat_le_rat
! 整数<=分数
function int_le_rat(a,this) !改动
logical :: int_le_rat
integer,intent(in) :: a
class(rational),intent(in) :: this !改动
!利用等价
int_le_rat = rat_ge_int(this,a) !利用现有函数
return
end function int_le_rat
! 分数<=整数
function rat_le_int(this,b) !改动
logical :: rat_le_int
class(rational),intent(in) :: this !改动
integer,intent(in) :: b
!利用等价
rat_le_int = int_ge_rat(b,this) !利用现有函数
return
end function rat_le_int
! 分数=分数
subroutine rat_eq_rat( rat1, this ) !改动
class(rational), intent(out) :: rat1 !改动
class(rational), intent(in) :: this !改动
rat1%num = this%num
rat1%denom = this%denom
return
end subroutine rat_eq_rat
! 整数=分数
subroutine int_eq_rat( int, this ) !改动
integer, intent(out) :: int
class(rational), intent(in) :: this !改动
int = this%num / this%denom
return
end subroutine int_eq_rat
! 分数=整数
subroutine rat_eq_int( this, int ) !改动
integer, intent(in) :: int
class(rational), intent(out) :: this !改动
this%num = int
this%denom = 1
return
end subroutine rat_eq_int
! 浮点数=分数
subroutine real_eq_rat( float, this ) !改动
real, intent(out) :: float
class(rational), intent(in) :: this !改动
float = real(this%num) / real(this%denom) !改动
return
end subroutine real_eq_rat