summaryrefslogtreecommitdiffstats
path: root/Demo/classes/Rat.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1992-08-13 12:14:11 (GMT)
committerGuido van Rossum <guido@python.org>1992-08-13 12:14:11 (GMT)
commite876949f2b8a68646cac269cff9fd1c71975d3ac (patch)
tree3d9558e392c99c83b47fa744cfde6a5bd12692db /Demo/classes/Rat.py
parent04691fc1c1bb737c0db772f5c1ea697a351a01d9 (diff)
downloadcpython-e876949f2b8a68646cac269cff9fd1c71975d3ac.zip
cpython-e876949f2b8a68646cac269cff9fd1c71975d3ac.tar.gz
cpython-e876949f2b8a68646cac269cff9fd1c71975d3ac.tar.bz2
Initial revision
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()