Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ====== Dziedziczenie ====== * [[https://pl.wikibooks.org/wiki/C%2B%2B/Dziedziczenie|Dziedziczenie]] * Przeciążanie metod w klasach pochodnych * Operatory widoczności: private, protected, public * Inicjalizacja i destrukcja obiektów z dziedziczonych {{zajecia:po:method_overriding_in_subclass.png?200|}} {{zajecia:po:types_of_inheritance.png?250| }} **Składnia** <code C++> class Bazowa { // definicja klasy }; class Pochodna: public Bazowa { // definicja klasy }; </code> ===== Ćwiczenie: Klasa pochodna Parabola ===== 1. Utwórz klasę pochodną klasy ''Wielomian'' o nazwie ''Parabola''. Kod źródłowy klasy ''Wielomian'' znajdziesz w zakładce [[pliki|pliki]] lub w repozytorium [[https://github.com/IS-UMK/po_2024_src/tree/master/05_wielomian|GitHub]]. Parabola jest szczególnym rodzajem wielomianu, którego stopień wynosi 2. Dla paraboli możemy zdefiniować specyficzne operacje jak, np. wyznaczenie miejsc zerowych, wyznaczenie punktu ekstremalnego, itp. * klasa Parabola będzie wymagała dostepu do prywatnych zasobów wielomianu, aby było to możliwe nalezy zmienić poziom dostępu dziedziczonych elementow z ''private'' do ''protected'' * dodaj chronione pole ''delta'' zawierające wartość rzeczywistą równą $$ \Delta = b^2 - 4ac$$ \\ Wartość delty ustalana jest automatycznie w momencie zmiany współczynników $a, b, c$, m.in. w konstruktorze, podczas inicjowania obiektu. 2. Dla klasy ''Parabola'' zaimplementuj następujące operacje (dostępne publicznie): * konstruktor inicjujący parabolę trzema wartościami $a$, $b$ i $c$, które definiują parabolę $$y=ax^2+bx+c$$ Ustaw wartości domyślne argumentów $a=0, b=0, c=0$. * konstruktor kopiujący * funkcję składową zwracającą położenie $x_e$ ekstremalnej wartości (minimum lub maksimum funkcji) $$x_e = -\frac{b}{2a}$$ * funkcję składową zwracającą ilość pierwiastków (miejsc zerowych) oraz ich wartości. Wartością zwracaną jest liczba 0, 1 lub 2 określająca występowanie i ilość miejsc zerowych. Dodatkowo, jeżeli istnieją miejsca zerowe, to zwracane są wartości miejsc zerowych $x_1$ i $x_2$ (np. przez adres zmiennej w argumentach lub referencję). $$x_1 = \frac{-b - \sqrt{\Delta}}{2a} \qquad x_2 = \frac{-b + \sqrt{\Delta}}{2a}$$ * funkcję składową ''ObliczWartosc'', która dla danej w argumencie wartości rzeczywistej ''x'' zwróci wartość wielomianu $f(x)$. 4. Napisz program, który wykorzysta klasę ''Parabola'' do wyznaczenia i wypisania wartości miejsc zerowych $x_1$ i $x_2$, wartość ekstremum $x_e$ oraz wartości funkij w punktach $f(x_1)$, $f(x_2)$ oraz $f(x_e)$ dla dowolnej paraboli o współczynnikach $a$, $b$ i $c$ podanych przez użytkownika. Przetestuj działanie dla funkcji $f(x) = 0.1x^2 - 100x + 0.1$ **Diagram klas UML** {{zajecia:po:wielomian_parabola.png?250}} 5 . Zaimplementuj klasę pochodną, dziedziczącą po klasie ''Parabola'', która zastępuje implementację funkcji wyznaczającej pierwiastki i wykorzystuje do obliczeń [[wpp>Wzory_Viète’a|wzory Viète’a]]: * gdy $b < 0$ funkcja zwraca wartość pierwiastka $x_1$ obliczoną bazową funkcją oraz $x_2$ równą $x_2 = c/a/x_1$ * gdy $b \geq 0$ funkcja zwraca wartość pierwiastka $x_2$ obliczoną bazową funkcją oraz $x_1$ równą $x_1 = c/a/x_2$ 6. Przetestuj działanie programu wyznaczającego miejsca zerowe funkcji kwadratowej wykorzystując klasę pochodną z punktu 5. **Diagram klas UML** {{zajecia:po:wielomian_parabola2.png?250}} ===== Zadanie 6: Klasa pochodna Linia ===== Utwórz klasę pochodną klasy ''Wielomian'' o nazwie ''Linia'' reprezentującą wielomian stopnia pierwszego $$y=ax+b$$ Zaimplementuj metody umożliwiające następujące operacje na obiektach klasy ''Linia'': * konstruktor domyślny (inicjuje linię $y=0x+0$) * konstruktor posiadający 2 argumenty $a$ i $b$, oba reprezentujące wartość rzeczywistą. Konstruktor tworzy linię na płaszczyźnie o podanych współczynnikach $$y = ax + b$$ * konstruktor posiadający 3 argumenty $A$, $B$ i $C$, wszystkie reprezentują liczby rzeczywiste. Konstruktor tworzy linię prostą zdefiniowaną równaniem ogólnym $$Ax + By = C $$ * funkcję składową ''PunktPrzeciecia(const Linia &l)'', która zwraca współrzędne przecięcia się z linią ''l'' daną w argumencie funkcji. Dwie linie $y=a_1x+b_1$ i $y=a_2x+b_2$ przecinaja się w punkcie $$x = -\frac{b_2-b_1}{a_2-a_1}$$ Napisz program, który wykorzysta klasę ''Linia'' oraz funkcję wyznaczającą punkt przecięcia linii prostych do rozwiązania układu równań postaci $$ \left\{\begin{array}{l} a_1 x + b_1 y = c_1 \\ a_2 x + b_2 y = c_2 \\ \end{array}\right. $$ Dla wartości rzeczywistych $a_1, b_1, c_1, a_2, b_2, c_2$ podanych przez użytkownika program wypisuje wartość $x$ i $y$ stanowiące rozwiązanie powyższego układu równań. Zakładamy, że układ równań zawsze posiada rozwiązanie, tj. obie linie proste nie są równoległe i posiadają jeden punkt przecięcia. **Diagram klas UML** {{zajecia:po:wielomian_linia.png?400}} Przykład działania programu: <code> Podaj wspolczynniki a, b, c pierwszego rownania 2 8 4 Podaj wspolczynniki a, b, c drugiego rownania 1 1 2 Rozwiazaniem bedzie przeciecie linii prostych: f(x) = -0.25 x +0.50 f(x) = -1.00 x +2.00 Rozwiazanie x = 2 y = 0 </code> Rozwiązanie w postaci plików nagłówkowych ''*.h'' i źródłowych ''*.cpp'' umieść w Moodle [[https://moodle.umk.pl/mod/assign/view.php?id=209412|Zadanie 6]]