====== Szablony ======
* [[https://pl.wikibooks.org/wiki/C%2B%2B/Szablony_funkcji|Szablony funkcji]] pozwalają na tworzenie funkcji, które mogą działać z różnymi typami danych bez konieczności definiowania każdej wersji osobno.
* [[https://pl.wikibooks.org/wiki/C%2B%2B/Szablony_klas|Szablony klas]] umożliwiają tworzenie klas, które mogą działać z różnymi typami danych.
**Szablon funkcji**
template
Typek pewna_funkcja(Typek x)
{
return x;
}
**Szablon klasy**
template
class Klasa
{
Typek *x;
Typek& Metoda();
};
**Szablon funkcji składowej (metody)**
template
Typek& Klasa::Metoda()
{
}
**Przykład użycia**
int a = 5;
a = pewna_funkcja(a);
Wielomian w;
Wielomian w2 = pewna_funkcja(w);
Klasa obiekt;
Klasa *wsk = new Klasa();
===== Ćwiczenie: szablon klasy Wektor =====
Zaimplementuj szablon klasy ''Wektor'', która jest pojemnikiem przechowującym kolekcję elementów pewnego typu (typ elementów jest parametrem szablonu klasy). Wektor udostępnia elementy kolekcji w identyczny sposób jak tablica ale jest strukturą dynamiczną, która zwiększa automatycznie swój rozmiar w miarę dodawania nowych elementów.
Klasa ''Wektor'' składa się z następujących pól:
* ''rozmiar'' - rozmiar pojemnika
* ''elementy'' - wskaźnik do tablicy o rozmiarze ''rozmiar'', która przechowuje elementy
* ''liczba_elementow'' - aktualna ilość elementów w pojemniku
Klasa udostępnia następujące metody:
* konstruktor domyślny, inicjuje Wektor o pojemności 20 elementów.
* konstruktor ''**Wektor(int rozmiar)**'' inicjuje wektor o podanym rozmiarze
* operator ''**[]**'' pozwalający odwołać się do wskazanego elementu wektora na takiej samej zasadzie jak to jest w przypadku tablic (np. ''x=wektor[2]'')
* funkcja ''**IleElementow**'' zwraca liczbę elementów
* funkcja ''**Rozmiar**'' zwraca pojemność wektora
* funkcja ''**Dodaj**'' umieszcza na końcu kolekcji element podany w argumencie . Jeżeli pojemność wektora jest wyczerpana (liczba elementów jest równa rozmiarowi) to przed dodaniem kolejnego elementu rozmiar wektora jest automatycznie zwiekszany dwukrotnie i dopiero wtedy umieszczany jest nowy element na końcu sekwencji elementów.
* funkcja ''**Usun**'' usuwa ostatni element z kolekcji
* funkcja ''**Wyczysc**'' usuwa wszystkie elementy z kolekcji
* destruktor
* konstruktor kopiujący
* operator przypisania ''operator=''
* operator ''<<'' wypisujący zawartość wektora do strumienia wyjsciowego ''std::ostream'' (zakładamy, że dla typu ''T'' składowego wektora istnieje dociążony odpowiednio operator ''%%<<%%'')
* przeciążoną metodę ''**Dodaj**'' pozwalającą dodać element na dowolnej pozycji (od 0 do ''liczba_elemntow'')
* przeciążoną metodę ''**Usun**'' usuwającą element z podanej w argumencie pozycji
Przykładowy kod testujący klasę:
Wektor liczby;
for(int i=0;i<100;i++) liczby.Dodaj(i);
cout << "Rozmiar " << liczby.Rozmiar() << " elementow " << liczby.IleElementow() << endl;
float wsp[]={1,2,3,4,5};
Wielomian w1(wsp,4);
Wektor wektor_wielomianow;
for(int i=0;i<100;i++)
{
Wielomian w2=w1 * liczby[i];
wektor_wielomianow.Dodaj(w*i);
}
cout << "Wyswietlam pewien wielomian : " << wektor_wielomianow[5] << endl;
Napisz program, który wykorzysta klasę ''Wektor'' do przechowywania linii tekstu wczytanych z pewnego pliku tekstowego.
Na początku działania program prosi o podanie nazwy pliku, następnie program wczytuje kolejne linie tekstu z podanego pliku i umieszcza je w wektorze. Po przeczytaniu całej zawartości pliku program wypisuje na konsoli elementy wektora w odwrotnej kolejności, tj. program wypisuje zawartość pliku z odwróconą kolejnoscia linii.
Przydatne funkcje:
* [[https://cplusplus.com/doc/tutorial/files/|Input/output with files]]
* funkcja [[https://en.cppreference.com/w/cpp/string/basic_string/getline|getline()]] - czytanie linii ze strumienia wejściowego
===== Zadanie 8: Szablon funkcji =====
1. Zaimplementuj szablon funkcji o nazwie ''zamien''. Funkcja posiada dwa argumenty tego samego typu i służącej do zamiany wartości obiektów podanych w argumentach.
Przykładowo, dla dwóch obiektów ''a'' i ''b'' wywołanie funkcji
zamien(a, b)
spowoduje, że obiekt ''a'' przyjmie wartość obiektu ''b'', a obiekt ''b'' przyjmie wartość obiektu ''a''.
Funkcja nie zwraca żadnej wartości.
2. Zaimplementuj szablon funkcji ''sortuj()'' służący do sortowania elementów kolekcji ''Wektor''. Funkcję sortującą możesz zrealizować w postaci metody szablonu klasy ''Wektor'' lub jako funkcję globalną. Wywołanie funkcji układa elementy wektora w porządku od najmniejszego do największego. Zakładamy, że obiekty znajdujące się w wektorze posiadają zdefiniowany operator mniejszości ''<'' pozwalający je porównać. Spróbuj samodzielnie wymyślić algorytm sortowania. Do zamiany położenia elementów wektora wykorzystaj funkcję szablonową ''zamien'' z pierwszego punktu zadania.
Napisz program, który wykorzysta klasę ''Wektor'' oraz szablon funkcji ''sortuj()'' do posortowania liczb zawartych w pliku tekstowym. Nazwę (ścieżkę) pliku podaje użytkownik na początku działania programu. Program czyta liczby z pliku i umieszcza je w wektorze. Po wczytaniu wszystkich liczb kolekcja podlega sortowaniu a wynik wypisany jest na ekranie.
Zakładamy, że plik wejściowy zawiera ciąg liczb rzeczywistych odseparowanych białymi znakami.
Przykładowy plik z danymi wejsciowymi: {{zajecia:po:liczby.txt|liczby.txt}}
Jeśli masz problem z wymyśleniem działającego algorytmu sortowania to skorzystaj z [[https://eduinf.waw.pl/inf/alg/003_sort/0004.php|algorytmu sortowania bąbelkowego]]
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=297894|Zadanie 8]]