====== Przeciążanie operatorów ======
* [[https://pl.wikibooks.org/wiki/C%2B%2B/Przeci%C4%85%C5%BCanie_operator%C3%B3w|Przeciążanie operatorów]] - pozwala nadpisać działanie standardowych operatorów dla własnych typów danych.
* Przeciążany operator jest funkcją zaczynająca sie od ''operator'' c = a + b;
jest równoważne c.operator=( a.operator+(b) );
* sposób 1: globalna funkcja operatorowa, np. ''operator+(Typ1 a, Typ2 b)''
* preferowana jeśli po lewej stronie ma stać obiekt, którego nie możemy modyfikować
* gdy funkcja operatorowa musi korzystać z pól prywatnych argumentu to musi być zaprzyjaźniona z klasą tego argumentu
* sposób 2: funkcja składowa (metoda) klasy ''Typ1::operator+(Typ2 b)''
* niektóre operatory (''operator='', ''operator[]'') musza być niestatycznymi funkcjami składowymi klasy
* nie możemy przeładowywać operatorów dla typów wbudowanych (int, char, float)
===== Ćwiczenie: Przeciążanie operatorów w klasie Wielomian =====
1. Przeciąż dla klasy ''Wielomian'' operator przesunięcie bitowego ''<<'' w taki sposób aby realizował wypisanie wielomianu w strumieniu wyjściowym ''ostream''. \\
Przykład:
Wielomian w1;
cout << w1 << endl;
2. Dociąż operator przypisania ''='' dla klasy ''Wielomian'' w taki sposób aby możliwe było wykonanie poniższej operacji.
double wsp[] = { 3 , 5 , 1};
int st=2;
Wielomian w1(st,wsp);
Wielomian w2;
w2=w1;
3. Dociąż operator ''+'' tak aby realizował dodawanie dwóch wielomianów (operator może zastąpić funkcję ''Dodaj()'')
Wielomian w1, w2;
cout << "w1 + w2 = " << w1 + w2 << endl;
4. Dla operacji wykonywanych na obiektach klasy Wielomian dociąż dwuargumentowe operatory arytmetyczne ''*'', ''*='', ''+='', ''-'', ''-='' oraz porównanie wielomianów ''=='', ''!=''
Wielomian w1, w2;
Wielomian w3 = w1 + w2;
Wielomian w4 = w1 * 3.1;
Wielomian w4 = w1 * w4;
if (w1 == w2) cout << "Wielomiany są identyczne" << endl;
// itd.
5. Przeciąż operator [] tak aby zwracał wskazany indeksem współczynnik wielomianu na wzór dostępu do elementów tablicy:
Wielomian w;
cout << w[0] << end;
w[0]++;
cout << w << end;
6. Przeciąż jednoargumentowy operator * tak aby realizował pochodną stopnia 1-go.
Wielomian w1;
cin >> w1;
Wielomian pochodna = *w1;
Wielomian pochodna2 = ****w1;
7. Zrealizuj przekształcanie typu ''double'' na obiekt typu ''Wielomian''.
Wielomian w1;
double x = 5.1;
cin >> w1;
Wielomian w2 = w1 + (Wielomian)x;
Wielomian w3 = w2 - 1.2;
===== Zadanie 4: Operator () w klasie Wielomian =====
Uzupełnij implementację klasy ''Wielomian'' z zajęć dodając przeciążenie operatora ''()'', który zwraca wartość wielomianu dla podanej w argumencie wartości rzeczywistej typu ''double'''.
Przykładowo, jeśli mamy wielomian postaci $f(x) = 3x^2 + 2x + 1$ to jego wartość w punkcie $x=1$ wynosi $f(1)=6$.
Po przeciążeniu operatora ''()'' powinno byc mozliwe wykonanie:
double wsp = {1, 2, 3};
Wielomian w(2, wsp);
double y = w(1.0); // wyznaczenie wartosci funkcji
Do wyznaczenia wartości wielomianu wykorzystaj [[wppl>Schemat_Hornera|schemat Hornara]]. \\
Dla wielomianu postaci $a_n x^n + \ldots + a_1 x + a_0$ wyznaczania wartości w punkcie $x$ za pomocą schematu Hornera:
- ustaw wartość początkową $y = a_n$
- dla każdego kolejnego $i=n-1, n-2, ... , 1, 0$ wykonuj
* podstaw do $y$ wynik $ x \cdot y + a_i$
- zwróć wynik $y$
Napisz program, który wykorzysta klasę ''Wielomian'' oraz operator ''()'' do przeprowadzenia symulacji trajektorii lotu obiektu rzuconego pionowo w górę z wysokości $h_0$ z prędkością początkową $v_0$.
Położenie obiektu opisane jest funkcją wielomianową
$$y(t) = h_0 + v_0 t - \frac{gt^2}{2}$$
gdzie stała przyspieszenia ziemskiego wynosi $g\approx 9,81 \frac{m}{s^2}$.
Dla podanych przez użytkownika wartości $h_0$ oraz $v_0$ program wypisuje wysokość $y(t)$ obiektu w kolejnych sekundach ruchu od momentu rzutu $t=0$ aż do momentu osiągnięcia powierzchni Ziemi $y(t)=0$. Przykład działania programu:
Wysokosc poczatkowa : 10
Predkosc poczatkowa : 50
t y(t)
----------------
0 10.0
1 55.1
2 90.4
3 115.9
4 131.5
5 137.4
6 133.4
7 119.7
8 96.1
9 62.7
10 19.5
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=205488|Zadanie 4]]