summaryrefslogtreecommitdiffstats
path: root/Demo/classes/Rat.py
diff options
context:
space:
mode:
Diffstat (limited to 'Demo/classes/Rat.py')
-rwxr-xr-xDemo/classes/Rat.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/Demo/classes/Rat.py b/Demo/classes/Rat.py
new file mode 100755
index 0000000..0b2519d
--- /dev/null
+++ b/Demo/classes/Rat.py
@@ -0,0 +1,86 @@
+# Rational numbers
+
+
+def rat(num, den):
+ return Rat().init(num, den)
+
+
+def gcd(a, b):
+ while b:
+ a, b = b, a%b
+ return a
+
+
+class Rat:
+
+ def init(self, num, den):
+ if den == 0:
+ raise ZeroDivisionError, 'rat(x, 0)'
+ g = gcd(num, den)
+ self.num = num/g
+ self.den = den/g
+ return self
+
+ def __repr__(self):
+ return 'rat' + `self.num, self.den`
+
+ def __cmp__(a, b):
+ c = a-b
+ if c.num < 0:
+ return -1
+ if c.num > 0:
+ return 1
+ return 0
+
+ def __float__(self):
+ return float(self.num) / float(self.den)
+
+ def __long__(self):
+ return long(self.num) / long(self.den)
+
+ def __int__(self):
+ return int(self.num / self.den)
+
+ def __coerce__(a, b):
+ t = type(b)
+ if t == type(0):
+ return a, rat(b, 1)
+ if t == type(0L):
+ return a, rat(b, 1L)
+ if t == type(0.0):
+ return a.__float__(), b
+ raise TypeError, 'Rat.__coerce__: bad other arg'
+
+ def __add__(a, b):
+ return rat(a.num*b.den + b.num*a.den, a.den*b.den)
+
+ def __sub__(a, b):
+ return rat(a.num*b.den - b.num*a.den, a.den*b.den)
+
+ def __mul__(a, b):
+ return rat(a.num*b.num, a.den*b.den)
+
+ def __div__(a, b):
+ return rat(a.num*b.den, a.den*b.num)
+
+ def __neg__(self):
+ return rat(-self.num, self.den)
+
+
+def test():
+ print rat(-1L, 1)
+ print rat(1, -1)
+ a = rat(1, 10)
+ print int(a), long(a), float(a)
+ b = rat(2, 5)
+ l = [a+b, a-b, a*b, a/b]
+ print l
+ l.sort()
+ print l
+ print rat(0, 1)
+ print rat(1, 0)
+ print a+1
+ print a+1L
+ print a+1.0
+
+test()