OBOWIĄZKOWE DO PRZESŁANIA: zadanie 7.6 i jedno z 7.1-7.5.
W pliku fracs.py zdefiniować klasę Frac wraz z potrzebnymi metodami. Wykorzystać wyjątek ValueError do obsługi błędów w ułamkach. Dodać możliwości dodawania|odejmowania|mnożenia|dzielenia|porównywania liczb int do ułamków (działania lewostronne i prawostronne). Rozważyć możliwość włączenia liczb float do działań na ułamkach [Wskazówka: metoda float.as_integer_ratio()]. Napisać kod testujący moduł fracs.
# Przykład zachowania klasy Fraction. <<< from fractions import Fraction <<< Fraction(3.14159) Fraction(3537115888337719, 1125899906842624) <<< Fraction(3.14159).limit_denominator(1000) # default is 1000000 Fraction(355, 113) <<< Fraction(0.4) Fraction(3602879701896397, 9007199254740992) <<< Fraction(0.4).limit_denominator(1000) Fraction(2, 5)
class Frac:
"""Klasa reprezentująca ułamki."""
def __init__(self, x=0, y=1):
# Sprawdzamy, czy y=0.
self.x = x
self.y = y
def __str__(self): pass # zwraca "x/y" lub "x" dla y=1
def __repr__(self): pass # zwraca "Frac(x, y)"
# Py2
#def __cmp__(self, other): pass # cmp(frac1, frac2)
# Py2.7 i Py3
def __eq__(self, other): pass
def __ne__(self, other): pass
def __lt__(self, other): pass
def __le__(self, other): pass
#def __gt__(self, other): pass
#def __ge__(self, other): pass
def __add__(self, other): pass # frac1+frac2, frac+int
__radd__ = __add__ # int+frac
def __sub__(self, other): pass # frac1-frac2, frac-int
def __rsub__(self, other): # int-frac
# tutaj self jest frac, a other jest int!
return Frac(self.y * other - self.x, self.y)
def __mul__(self, other): pass # frac1*frac2, frac*int
__rmul__ = __mul__ # int*frac
def __div__(self, other): pass # frac1/frac2, frac/int, Py2
def __rdiv__(self, other): pass # int/frac, Py2
def __truediv__(self, other): pass # frac1/frac2, frac/int, Py3
def __rtruediv__(self, other): pass # int/frac, Py3
# operatory jednoargumentowe
def __pos__(self): # +frac = (+1)*frac
return self
def __neg__(self): pass # -frac = (-1)*frac
def __invert__(self): pass # odwrotnosc: ~frac
def __float__(self): pass # float(frac)
def __hash__(self):
return hash(float(self)) # immutable fracs
# w Pythonie set([2]) == set([2.0])
# chcemy set([2]) == set([Frac(2)])
# Kod testujący moduł.
import unittest
class TestFrac(unittest.TestCase): pass
W pliku polys.py zdefiniować klasę Poly wraz z potrzebnymi metodami. Wykorzystać wyjątek ValueError do obsługi błędów w wielomianach. Dodać możliwości dodawania liczb (int, float) do wielomianów (działania lewostronne i prawostronne). Dodanie nowych metod kontenerowych i sprawdzenie możliwości iteracji po instancji (for coeff in poly lub for term in poly). Napisać kod testujący moduł polys.
class Poly:
"""Klasa reprezentująca wielomiany."""
# wg Sedgewicka - tworzymy wielomian c*x^n
def __init__(self, c=0, n=0):
self.size = n + 1 # rozmiar tablicy
self.a = self.size * [0]
self.a[self.size-1] = c
def __str__(self):
return str(self.a)
def __add__(self, other): pass # poly1+poly2, poly+liczba
__radd__ = __add__ # liczba+poly
def __sub__(self, other): pass # poly1-poly2, poly-liczba
def __rsub__(self, other): pass # liczba-poly
def __mul__(self, other): pass # poly1*poly2, poly*liczba
__rmul__ = __mul__ # liczba*poly
def __pos__(self): # +poly1 = (+1)*poly1
return self
def __neg__(self): pass # -poly1 = (-1)*poly1
def is_zero(self): pass # bool, True dla [0], [0, 0],...
def __eq__(self, other): pass # obsługa poly1 == poly2
def __ne__(self, other): # obsługa poly1 != poly2
return not self == other
def eval(self, x): pass # schemat Hornera
def combine(self, other): # złożenie poly1(poly2(x))
def __pow__(self, n): pass # poly(x)**n lub pow(poly(x),n)
def diff(self): pass # różniczkowanie
def integrate(self): pass # całkowanie
def __len__(self): pass # len(poly), rozmiar self.a
def __getitem__(self, i): pass # poly[i], współczynnik przy x^i
def __setitem__(self, i, value): pass # poly[i] = value
def __call__(self, x): pass # poly(x)
# dla isinstance(x, (int,float)) odpowiada eval(),
# dla isinstance(x, Poly) odpowiada combine()
# Kod testujący moduł.
import unittest
class TestPoly(unittest.TestCase): pass
W pliku rectangles.py zdefiniować klasę Rectangle wraz z potrzebnymi metodami. Wykorzystać wyjątek ValueError do obsługi błędów. Napisać kod testujący moduł rectangles.
from points import Point
class Rectangle:
"""Klasa reprezentująca prostokąty na płaszczyźnie."""
def __init__(self, x1, y1, x2, y2):
# Chcemy, aby x1 < x2, y1 < y2.
self.pt1 = Point(x1, y1)
self.pt2 = Point(x2, y2)
def __str__(self): pass # "[(x1, y1), (x2, y2)]"
def __repr__(self): pass # "Rectangle(x1, y1, x2, y2)"
def __eq__(self, other): pass # obsługa rect1 == rect2
def __ne__(self, other): # obsługa rect1 != rect2
return not self == other
def center(self): pass # zwraca środek prostokąta
def area(self): pass # pole powierzchni
def move(self, x, y): pass # przesunięcie o (x, y)
def intersection(self, other): pass # część wspólna prostokątów
def cover(self, other): pass # prostąkąt nakrywający oba
def make4(self): pass # zwraca krotkę czterech mniejszych
# A-------B po podziale A---+---B
# | | | | |
# | | +---+---+
# | | | | |
# D-------C D---+---C
# Kod testujący moduł.
import unittest
class TestRectangle(unittest.TestCase): pass
W pliku triangles.py zdefiniować klasę Triangle wraz z potrzebnymi metodami. Wykorzystać wyjątek ValueError do obsługi błędów. Napisać kod testujący moduł triangles.
from points import Point
class Triangle:
"""Klasa reprezentująca trójkąty na płaszczyźnie."""
def __init__(self, x1, y1, x2, y2, x3, y3):
# Należy zabezpieczyć przed sytuacją, gdy punkty są współliniowe.
self.pt1 = Point(x1, y1)
self.pt2 = Point(x2, y2)
self.pt3 = Point(x3, y3)
def __str__(self): pass # "[(x1, y1), (x2, y2), (x3, y3)]"
def __repr__(self): pass # "Triangle(x1, y1, x2, y2, x3, y3)"
def __eq__(self, other): pass # obsługa tr1 == tr2
# Trójkąty powinny być równe, jeżeli mają ten sam zbiór wierzchołków,
# niezależnie od kolejności pt1, pt2, pt3.
def __ne__(self, other): # obsługa tr1 != tr2
return not self == other
def center(self): pass # zwraca środek trójkąta
def area(self): pass # pole powierzchni
def move(self, x, y): pass # przesunięcie o (x, y)
def make4(self): pass # zwraca krotkę czterech mniejszych
# A po podziale A
# / \ / \
# / \ +---+
# / \ / \ / \
# C-------B C---+---B
# Kod testujący moduł.
import unittest
class TestTriangle(unittest.TestCase): pass
W pliku circles.py zdefiniować klasę Circle wraz z potrzebnymi metodami. Okrąg jest określony przez podanie środka i promienia. Wykorzystać wyjątek ValueError do obsługi błędów. Napisać kod testujący moduł circles.
from points import Point
class Circle:
"""Klasa reprezentująca okręgi na płaszczyźnie."""
def __init__(self, x, y, radius):
if radius < 0:
raise ValueError("promień ujemny")
self.pt = Point(x, y)
self.radius = radius
def __repr__(self): pass # "Circle(x, y, radius)"
def __eq__(self, other):
return self.pt == other.pt and self.radius == other.radius
def __ne__(self, other):
return not self == other
def area(self): pass # pole powierzchni
def move(self, x, y): pass # przesuniecie o (x, y)
def cover(self, other): pass # najmniejszy okrąg pokrywający oba
# Kod testujący moduł.
import unittest
class TestCircle(unittest.TestCase): pass
Stworzyć następujące iteratory nieskończone:
(a) zwracający 0, 1, 0, 1, 0, 1, ...,
(b) zwracający przypadkowo jedną wartość z ("N", "E", "S", "W")
[błądzenie przypadkowe na sieci kwadratowej 2D],
(c) zwracający 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, ...
[numery dni tygodnia].