====== 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. Konkretna wersja funkcji jest generowana przez kompilator w momencie wywołania funkcji z określonym typem argumentów.
* [[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 - deklaracja**
template
Typek pewna_funkcja(Typek x)
{
return x;
}
**Szablon klasy - deklaracja**
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();
**Ważne:** kompilator generuje szablon dopiero w momencie jego użycia (dla konkretnego typu). Dlatego kod szablonu musi być dostępny dla kompilatora – zwyczajowo implementacja znajduje się w plikach nagłówkowych ''*.h''.
===== Ćwiczenie: szablon klasy Wektor =====
Zaimplementuj szablon klasy ''Wektor'' – pojemnik przechowujący dynamiczną kolekcję elementów pewnego typu. Typ elementów jest parametrem szablonu klasy. Wektor udostępnia dostęp do elementów identycznie jak tablica, ale automatycznie zwiększa 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 liczba 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 elementu wektora o wskazanym indeksie na takiej samej zasadzie, jak w przypadku tablic (np. ''x = wektor[2]'')
* funkcja ''**IleElementow**'' zwraca liczbę elementów
* funkcja ''**Rozmiar**'' zwraca rozmiar wektora
* funkcja ''**Dodaj(const T &element)**'' umieszcza element na końcu kolekcji. Jeśli wyczerpana jest pojemność wektora (liczba elementów równa rozmiarowi), rozmiar jest automatycznie zwiększany dwukrotnie, a następnie dodawany jest nowy element.
* 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 wyjściowego ''std::ostream'' (zakładamy, że dla typu ''T'' składowego wektora istnieje przeciążony operator ''%%<<%%'')
* przeciążona metoda ''**Dodaj**'' pozwalająca dodać element na dowolnej pozycji (od 0 do ''liczba_elementow'')
* przeciążona metoda ''**Usun**'' usuwająca 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(w2*i);
}
cout << "Wyświetlam pewien wielomian : " << wektor_wielomianow[5] << endl;
Napisz program, który wykorzysta klasę ''Wektor'' do przechowywania linii tekstu wczytanych z pliku.
* Na początku program prosi użytkownika o podanie nazwy pliku.
* Następnie wczytuje kolejne linie z pliku i umieszcza je w wektorze.
* Po wczytaniu całej zawartości wypisuje linie na ekran w odwrotnej kolejności (zawartość pliku od końca).
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'', która zamienia wartości dwóch obiektów tego samego typu. Funkcja nie zwraca żadnej wartości. \\
Przykładowo wywołanie funkcji
zamien(a, b)
spowoduje, że obiekt ''a'' przyjmie wartość obiektu ''b'', a obiekt ''b'' przyjmie wartość obiektu ''a'', zaś poniższa instrukcja powinna zamienić elementy tablicy:
zamien(tab[i], tab[j])
2. Zaimplementuj szablon funkcji ''sortuj()'' do porządkowania zawartości wektora od najmniejszego do największego. Funkcję można napisać jako metodę klasy ''Wektor'' lub funkcję globalną przyjmującą referencję do wektora. Załóż, że elementy posiadają operator mniejszości ''<'' do porównywania. W algorytmie sortowania wykorzystaj funkcję ''zamien'' do zamiany pozycji elementów.
Napisz program, który wykorzysta klasę ''Wektor'' oraz funkcję ''sortuj()'' do posortowania liczb z pliku:
* Użytkownik podaje nazwę (ścieżkę) pliku.
* Program wczytuje liczby z pliku do wektora.
* Po wczytaniu wszystkich liczb sortuje je i wypisuje wynik.
* Zakładamy, że plik zawiera liczby rzeczywiste odseparowane białymi znakami.
Przykładowy plik z danymi wejściowymi: {{zajecia:po:liczby.txt|liczby.txt}}
Jeśli masz problem z wymyśleniem działającego algorytmu sortowania, 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=361026|Zadanie 8]]