[Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode
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