====== Szablony ======
* [[https://pl.wikibooks.org/wiki/C%2B%2B/Szablony_funkcji|Szablony funkcji]]
* [[https://pl.wikibooks.org/wiki/C%2B%2B/Szablony_klas|Szablony klas]]
**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 podanej pojemności
* operator ''**[]**'' pozwalający odwołać się wskazanego elementu wektora na takiej samej zasadzie jak w przypadku tablic (np. ''x=wektor[2]'')
* ''**IleElementow()**'' zwraca liczbę elementów
* ''**Rozmiar()**'' zwraca pojemność wektora
* ''**Dodaj()**'' umieszcza podany w argumencie element na końcu kolekcji. 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 listy.
* ''**Usun()**'' usuwa ostatni element z kolekcji
* ''**Wyczysc()**'' usuwa wszystkie elementy z kolekcji
* destruktor
* konstruktor kopiujący
* operator przypisania ''operator=''
* operator ''<<'' wypisujący zawartość wektora do strumienia wyjsciowego (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'' służącej do zamiany dwóch wartości 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''.
2. Zaimplementuj funkcję szablonową ''sortuj()'' służącą do sortowania elementów kolekcji ''Wektor''. Funkcję ''sortuj()'' możesz zrealizować w postaci funkcji składowej szablonu klasy ''Wektor'' lub jako funkcję globalną, która sortuje wektor podany w argumencie. Wywołanie funkcji układa elementy kolekcji 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 kolekcji wykorzystaj funkcję szablonową ''zamien'' z poprzedniego punktu.
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=210403|Zadanie 8]]