#!/usr/bin/python from math import gcd # importuju greatest common divisor # aby se mi snaz kratily zlomky # definujeme novou tridu class Fraction: # definujeme co se ma dit pri vytvoreni objektu def __init__(self, up, down): self.up = up # self.up != up self.down = down self.base() # bude se hodit pri zbytku implementaci # zarucuje ze nebudeme muset explicitne volat # metodu `base` nikde jinde # kraceni zlomku # vsimneme si ze narozdil od funkci, u metod # je v pohode i jiny typ vraceni z funkce nez # jenom pomoci `return` # - metoda muze menit objekt kterymu nalezi def base(self): divisor = gcd(self.up, self.down) # ziskavame nejvedsi spolecny delitel if divisor > 1: # zjistujeme jestli muzeme kratit self.up = self.up // divisor # znena sebe sama self.down = self.down // divisor # a zase if self.up < 0 and self.down < 0: self.up = -self.up self.down = -self.down # scitani zlomku def add(self, other): return Fraction(self.up * other.down + other.up * self.down, self.down * other.down) # ^- tohle mi zaruci ze se ten zlomek automaticky zkrati # jelikoz tvorim novy objekt a v initu mam `self.base()` # taky vracim jiny objekt a nemenim ty, ktere jsem dostal # nasobeni zlomku def multiply(self, other): return Fraction(self.up * other.up, self.down * other.down) # odcitani zlomku def subtract(self, other): return Fraction(self.up * other.down - other.up * self.down, self.down * other.down) # deleni # prosim tady nepouzivat pythonovsky deleni, je velice nepresny def divide(self, other): return Fraction(self.up * other.down, self.down * other.up) # aby se mi to hezky printlo def show(self): return f"{self.up}/{self.down}" # testy for x in range(1, 4): for y in range(1, 4): a = Fraction(x, y) b = Fraction(y, x) print(f"\na: {a.show()}\nb: {b.show()}\n") print("+", a.add(b).show()) print("*", a.multiply(b).show()) print("-", a.subtract(b).show()) print("/", a.divide(b).show()) # ez