TI/Skrypty z zajęć/kz10-14

Z Brain-wiki
# -*- coding: utf-8 -*-
"""
Created on Tue Jun  2 11:03:05 2020

@author: Tomek
"""

'''
Zadanie 10
Utwórz klasę Punkt, która będzie służyła do reprezentowania punktu na płaszczyźnie. 
Klasa powinna mieć dwa pola (współrzędne punktu), konstruktor dwuparametrowy oraz metody: 
    getX, getY,setX, seyY, odlegloscOdPkt (o parametrze typu Punkt), 
    __str__ (opis punktu postaci (x; y)).
'''

class Punkt():
    def __init__(self, x, y):
        self.__x = x
        self.__y = y
    
    def getX(self): return self.__x
    def getY(self): return self.__y
    def setX(self, x): self.__x = x
    def setY(self, y): self.__y = y
    def __str__(self): return '('+str(self.__x)+'; '+str(self.__y)+')'
    def odlegloscOdPkt(self, other):
        return ((self.__x-other.getX())**2 + (self.__y-other.getY())**2)**(0.5)
#p1 = Punkt(1,1)
#p2 = Punkt(4,5)
#print(p1)
#print(p2)
#print(p1.odlegloscOdPkt(p2))
#print(p2.odlegloscOdPkt(p1))       
'''
Zadanie 11
Napisz klasę Wielobok opisującą wielobok. Klasa powinna zawierać listę obiektów klasy Punkt
(z zadania poprzedniego) przechowującą informację o współrzędnych punktów tworzących wielobok, konstruktor, który jako argument powinien przyjmować dowolną liczbę elementów typu Punkt, metodę
zwracającą liczbę boków, metodę liczącą obwód wieloboku oraz metodę __str__ wypisująca
na ekranie wszystkie wierzchołki wieloboku.
'''
class Wielobok():
    def __init__(self, *args):
        self.__punkty = list(args)
        
    def n(self):
        return len(self.__punkty)
    
    def obwod(self):
        result = 0.0
        poczatek = self.__punkty[-1]
        for koniec in self.__punkty:
            result += poczatek.odlegloscOdPkt(koniec)
            poczatek = koniec
        return result
    
    def __str__(self):
#        result = ''
#        for punkt in self.__punkty:
#            result += str(punkt)
#        return result
        return ' '.join([str(p) for p in self.__punkty])

p1 = Punkt(1,1)
p2 = Punkt(1,4)
p3 = Punkt(5,4)
p4 = Punkt(5,1)
#w = Wielobok(p1,p2,p3,p4)
#print(w)
#print(w.n())
#print(w.obwod())    

'''
Zadanie 12
Napisz klasę Trojkat dziedziczącą po klasie Wielobok. Konstruktor powinien przyjmować trzy 
obiekty klasy punkt. Napisz metodę liczącą pole trójkąta (polecam wzór Herona)
 oraz metodę __str__ korzystającą z tej samej metody klasy rodzica.
'''
class Trojkat(Wielobok):
    def __init__(self, p1, p2, p3):
        super().__init__(p1, p2, p3)
        
    def pole(self):
        p = 0.5 * self.obwod()
        boki = (p1.odlegloscOdPkt(p2),p2.odlegloscOdPkt(p3),p3.odlegloscOdPkt(p1))
        return (p*(p-boki[0])*(p-boki[1])*(p-boki[2]))**0.5
    
    def __str__(self):
        return 'Trojkat '+ super().__str__()
    
tr = Trojkat(p1,p2,p4)
#print(tr)
#print(tr.obwod())
#print(tr.pole())

'''
Zadanie 13
Napisz klasę Rownoleglobok dziedziczącą po klasie Wielobok. Konstruktor dostaje trzy 
Punkty (A,B i C). Czwarty punkt powstaje z odbicie punktu A względem środka odcinka 
BC. Napisz metodę obliczająca pole powierzchni za pomocą tworzonych na tę potrzebę 
obiektów klasy Trojkat.
'''
class Rownoleglobok(Wielobok):
    def __init__(self, A, B, C):
        BC = Punkt((B.getX()+C.getX())/2,(B.getY()+C.getY())/2)
        D = Punkt(BC.getX()+ (BC.getX() - A.getX()), BC.getY()+ (BC.getY() - A.getY()))
        super().__init__(A, B, D, C)
        self.__A = A
        self.__B = B
        self.__C = C
        #self.__D = D
        
        
    def pole(self):
        tr1 = Trojkat(self.__A, self.__B, self.__C)
#        tr2 = Trojkat(self.__D, self.__B, self.__C)
        return 2*tr1.pole()# + tr2.pole()
    
r = Rownoleglobok(p1, p2, p4)
#print(r)
#print(r.obwod())
#print(r.pole())
'''
Zadanie 14
Napisz klasę „dziwnaLiczba”, która dziedziczy po klasie „int” (liczbach całkowitych). 
„Dziwność” polega na tym, że przy dodawaniu dwóch obiektów klasy „dziwnaLiczba” 
otrzymujemy „dziwnąLiczbę” będącą wynikiem mnożenia liczb im odpowiadających, 
a przy mnożeniu dwóch „dziwnychLiczb” otrzymujemy „dziwnąLiczbę” będącą wynikiem dodawania liczb im odpowiadających. W skrócie, znaki mnożenia i dodawania są zamienione miejscami
'''

class dziwnaLiczba(int):
    def __mul__(self, other):
        return dziwnaLiczba(super().__add__(other))
    
    def __add__(self, other):
        return dziwnaLiczba(super().__mul__(other))
    
a = dziwnaLiczba(3)
b = dziwnaLiczba(4)