diff --git a/__pycache__/fraction.cpython-312.pyc b/__pycache__/fraction.cpython-312.pyc new file mode 100644 index 0000000..29247b0 Binary files /dev/null and b/__pycache__/fraction.cpython-312.pyc differ diff --git a/__pycache__/test_fraction.cpython-312.pyc b/__pycache__/test_fraction.cpython-312.pyc new file mode 100644 index 0000000..4128782 Binary files /dev/null and b/__pycache__/test_fraction.cpython-312.pyc differ diff --git a/fraction.py b/fraction.py new file mode 100644 index 0000000..2334ac0 --- /dev/null +++ b/fraction.py @@ -0,0 +1,54 @@ +from fractions import Fraction + +class FractionCalculator: + + def calculate(self, expression: str): + """ + Takes input like '4/5+3/5' or '4/5 + 3/5' + Returns simplified fraction result + """ + + expression = expression.replace(" ", "") + + # detect operator + if '+' in expression: + a, b = expression.split('+') + return self._operate(a, b, '+') + + elif '-' in expression: + a, b = expression.split('-') + return self._operate(a, b, '-') + + elif '*' in expression: + a, b = expression.split('*') + return self._operate(a, b, '*') + + elif '/' in expression: + # careful: division operator between fractions + parts = expression.split('/') + if len(parts) == 4: + a = parts[0] + "/" + parts[1] + b = parts[2] + "/" + parts[3] + return self._operate(a, b, '/') + + raise ValueError("Invalid expression") + + def _operate(self, a, b, operator): + try: + f1 = Fraction(a) + f2 = Fraction(b) + except ZeroDivisionError: + raise ValueError("Invalid fraction (zero denominator)") + + if operator == '+': + result = f1 + f2 + elif operator == '-': + result = f1 - f2 + elif operator == '*': + result = f1 * f2 + elif operator == '/': + if f2 == 0: + raise ValueError("Division by zero fraction") + result = f1 / f2 + + return f"{result.numerator}/{result.denominator}" \ No newline at end of file diff --git a/test_fraction.py b/test_fraction.py new file mode 100644 index 0000000..37ff74b --- /dev/null +++ b/test_fraction.py @@ -0,0 +1,35 @@ +import unittest +from fraction import FractionCalculator + +class TestFractionCalculator(unittest.TestCase): + + def setUp(self): + self.calc = FractionCalculator() + + # addition + def test_add(self): + self.assertEqual(self.calc.calculate("4/5+3/5"), "7/5") + + # subtraction + def test_subtract(self): + self.assertEqual(self.calc.calculate("4/5-3/5"), "1/5") + + # multiplication + def test_multiply(self): + self.assertEqual(self.calc.calculate("2/3*3/4"), "1/2") + + # division + def test_divide(self): + self.assertEqual(self.calc.calculate("2/3/3/4"), "8/9") + + # simplification + def test_simplify(self): + self.assertEqual(self.calc.calculate("2/4+2/4"), "1/1") + + # invalid fraction + def test_invalid_fraction(self): + with self.assertRaises(ValueError): + self.calc.calculate("3/0+1/2") + +if __name__ == '__main__': + unittest.main() \ No newline at end of file