Mega Code Archive

 
Categories / Python Tutorial / Data Type
 

Driver for class Rational

def gcd( x, y ):    while y:       z = x       x = y       y = z % y    return x class Rational:    def __init__( self, top = 1, bottom = 1 ):       if bottom == 0:          raise ZeroDivisionError, "Cannot have 0 denominator"       self.numerator = abs( top )       self.denominator = abs( bottom )       self.sign = ( top * bottom ) / ( self.numerator * self.denominator )       self.simplify()      def simplify( self ):       common = gcd( self.numerator, self.denominator )       self.numerator /= common       self.denominator /= common              def __neg__( self ):       return Rational( -self.sign * self.numerator, self.denominator )           def __add__( self, other ):       return Rational(self.sign * self.numerator * other.denominator +          other.sign * other.numerator * self.denominator,          self.denominator * other.denominator )    def __sub__( self, other ):       return self + ( -other )    def __mul__( self, other ):       return Rational( self.numerator * other.numerator,                        self.sign * self.denominator *                        other.sign * other.denominator )    def __div__( self, other ):       return Rational( self.numerator * other.denominator,                        self.sign * self.denominator *                        other.sign * other.numerator )    def __truediv__( self, other ):       return self.__div__( other )    def __eq__( self, other ):       return ( self - other ).numerator == 0    def __lt__( self, other ):       return ( self - other ).sign < 0    def __gt__( self, other ):       return ( self - other ).sign > 0    def __le__( self, other ):       return ( self < other ) or ( self == other )    def __ge__( self, other ):       return ( self > other ) or ( self == other )    def __ne__( self, other ):       return not ( self == other )              def __abs__( self ):       return Rational( self.numerator, self.denominator )        def __str__( self ):       if self.sign == -1:          signString = "-"       else:          signString = ""       if self.numerator == 0:          return "0"       elif self.denominator == 1:          return "%s%d" % ( signString, self.numerator )       else:          return "%s%d/%d" % ( signString, self.numerator, self.denominator )                 def __int__( self ):       return self.sign * divmod( self.numerator, self.denominator )[ 0 ]    def __float__( self ):       return self.sign * float( self.numerator ) / self.denominator    def __coerce__( self, other ):       if type( other ) == type( 1 ):          return ( self, Rational( other ) )       else:          return None rational1 = Rational()   rational2 = Rational( 10, 30 )   rational3 = Rational( -7, 14 )   print "rational1:", rational1 print "rational2:", rational2 print "rational3:", rational3 print print rational1, "/", rational2, "=", rational1 / rational2 print rational3, "-", rational2, "=", rational3 - rational2 print rational2, "*", rational3, "-", rational1, "=", rational2 * rational3 - rational1 rational1 += rational2 * rational3 print "\nrational1 after adding rational2 * rational3:", rational1 print print rational1, "<=", rational2, ":", rational1 <= rational2 print rational1, ">", rational3, ":", rational1 > rational3 print print "The absolute value of", rational3, "is:", abs( rational3 ) print print rational2, "as an integer is:", int( rational2 ) print rational2, "as a float is:", float( rational2 ) print rational2, "+ 1 =", rational2 + 1