====== 05 - Fraction class ====== See the general [[courses:be5b33prg:tutorials:homeworks|homework guidelines]]! You are going to write a simple class to represent fractions in Python. Place it in the module called ''fraction.py'' Your class should: * be called Fraction. * have a constructor which stores the numerator and the denominator (assume both integers): def __init__(self, numerator, denominator): self.numerator = numerator # top self.denominator = denominator # bottom * the constructor should raise the ''ZeroDivisionError'' error and print an error message in case the denominator is zero. * have ''%%__str__()%%'' method implemented. This allows for the objects of this class to be typed to string, i.e., you can use the Fraction objects in the ''print()'' function. Also see Section 15.7 of [[http://openbookproject.net/thinkcs/python/english3e/classes_and_objects_I.html|Wentworth]]. There are several requirements: # the output should be in the form: numerator/denominator f1 = Fraction(2,3) print(f1) >>> 2/3 # a reduced fraction should be printed - a fraction in which the numerator and denominator are integers that have no other common divisors than 1. f2 = Fraction(12,18) print(f2) >>> 2/3 # print only numerator in case the denominator is 1 f3 = Fraction(8,2) print(f3) >>> 4 # print initial ''-'' in case the fraction is negative. No other representations of negative fractions will be accepted. f4 = Fraction(-2,3) print(f4) >>> -2/3 f5 = Fraction(2,-3) print(f5) >>> -2/3 f6 = Fraction(-2,-3) print(f6) >>> 2/3 * Implement methods ''%%__add__()%%'', ''%%__sub__()%%'', ''%%__mul__()%%'', ''%%__truediv__()%%'' allowing Fraction objects to be used in a standard set of arithmetic operations (aka overloading built-in operators). Also see here [[https://www.programiz.com/python-programming/operator-overloading|Operator overloading]]: f1 = Fraction(12,18) f2 = Fraction(4,9) print("f1 = " + str(f1)) print("f2 = " + str(f2)) print("f1 + f2 = " + str(f1+f2)) print("f1 - f2 = " + str(f1 - f2)) print("f1 * f2 = " + str(f1 * f2)) print("f1 / f2 = " + str(f1 / f2)) >>> f1 = 2/3 >>> f2 = 4/9 >>> f1 + f2 = 10/9 >>> f1 - f2 = 2/9 >>> f1 * f2 = 8/27 >>> f1 / f2 = 3/2 * Overload the following comparison operators: ''%%__eq__()%%'' (equal), ''%%__lt__()%%'' (less than), ''%%__le__()%%'' (less than or equal), ''%%__gt__()%%'' (greater than), ''%%__ge__()%%'' (greater than or equal). All the operations have to be meaningful, i.e., follow the rules for fraction comparison! Also see here: [[https://www.programiz.com/python-programming/operator-overloading|Operator overloading]]. (Note: In Python3, it is not necessary to implement the inequality operator when ''%%__eq__()%%'' is defined.) ==== Grading ==== | **Subtask** | **Max. points** | | Constructor - takes 2 arguments (ints), raise error if denominator is 0 | 2 | | ''%%__str__()%%'' method | 2 | | overloading arithmetic operators | 2 | | overloading comparison operators | 2 | | clean documented code (function decomposition, following naming conventions, doc strings, etc.) | 4 | | **Total** | **12** |