Advertisement
Rementai

Ułamki

Mar 30th, 2023
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.61 KB | None | 0 0
  1. class Fraction:
  2.     count = 0  # atrybut klasy - zlicza liczbę utworzonych obiektów
  3.  
  4.     def __init__(self, numerator, denominator=1):
  5.         if denominator == 0:
  6.             raise ValueError("Mianownik nie może być równy zero")
  7.         self.numerator = numerator
  8.         self.denominator = denominator
  9.         Fraction.count += 1
  10.  
  11.     def __str__(self):
  12.         return f"{self.numerator}/{self.denominator}"
  13.  
  14.     def __add__(self, other):
  15.         numerator = self.numerator * other.denominator + other.numerator * self.denominator
  16.         denominator = self.denominator * other.denominator
  17.         result = Fraction(numerator, denominator)
  18.         return result.simplify()
  19.  
  20.     def __sub__(self, other):
  21.         numerator = self.numerator * other.denominator - other.numerator * self.denominator
  22.         denominator = self.denominator * other.denominator
  23.         result = Fraction(numerator, denominator)
  24.         return result.simplify()
  25.  
  26.     def __mul__(self, other):
  27.         numerator = self.numerator * other.numerator
  28.         denominator = self.denominator * other.denominator
  29.         result = Fraction(numerator, denominator)
  30.         return result.simplify()
  31.  
  32.     def __truediv__(self, other):
  33.         numerator = self.numerator * other.denominator
  34.         denominator = self.denominator * other.numerator
  35.         result = Fraction(numerator, denominator)
  36.         return result.simplify()
  37.  
  38.     @staticmethod
  39.     def _gcd(a, b):
  40.         while b != 0:
  41.             a, b = b, a % b
  42.         return a
  43.  
  44.     def simplify(self):
  45.         gcd = self._gcd(self.numerator, self.denominator)
  46.         self.numerator //= gcd
  47.         self.denominator //= gcd
  48.         return self
  49.  
  50.     def __eq__(self, other):
  51.         if isinstance(other, int):
  52.             other = Fraction(other)
  53.         if not isinstance(other, Fraction):
  54.             return False
  55.         self.simplify()
  56.         other.simplify()
  57.         return self.numerator == other.numerator and self.denominator == other.denominator
  58.  
  59.     def __lt__(self, other):
  60.         if isinstance(other, int):
  61.             other = Fraction(other)
  62.         if not isinstance(other, Fraction):
  63.             raise TypeError("Nie można porównywać ułamka z innym typem")
  64.         common_denominator = self.denominator * other.denominator
  65.         self_numerator = self.numerator * other.denominator
  66.         other_numerator = other.numerator * self.denominator
  67.         return self_numerator < other_numerator
  68.  
  69.     @classmethod
  70.     def from_decimal(cls, decimal):
  71.         if not isinstance(decimal, (float, int)):
  72.             raise TypeError("Nieprawidłowy typ argumentu")
  73.  
  74.         numerator = decimal.as_integer_ratio()[0]
  75.         denominator = decimal.as_integer_ratio()[1]
  76.         return cls(numerator, denominator)
  77.  
  78.     def __del__(self):
  79.         Fraction.count -= 1
  80.  
  81. def main():
  82.     f1 = Fraction(3, 4)
  83.     f2 = Fraction(1, 2)
  84.     print(f1 + f2)  # wyświetli 5/4
  85.     print(f1 - f2)  # wyświetli 1/4
  86.     print(f1 * f2)  # wyświetli 3/8
  87.     print(f1 / f2)  # wyświetli 3/2
  88.  
  89.     f3 = Fraction.from_decimal(0.25)
  90.     print(f3)  # wyświetli 1/4
  91.  
  92.     print(Fraction.count)  # wyświetli 3
  93.  
  94.     # porównanie ułamków przy użyciu metody __eq__
  95.     if f1 == f2:
  96.         print("Ułamki są równe")
  97.     else:
  98.         print("Ułamki są różne")
  99.  
  100.     # porównanie ułamków przy użyciu metody __lt__
  101.     if f1 < f2:
  102.         print("Ułamek f1 jest mniejszy niż f2")
  103.     else:
  104.         print("Ułamek f1 jest większy lub równy f2")
  105.  
  106.     # utworzenie ułamka z użyciem metody from_decimal
  107.     f3 = Fraction.from_decimal(0.5)
  108.     print(f3)
  109.  
  110. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement