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ć. ====== 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** <code c++> template <typename Typek> Typek pewna_funkcja(Typek x) { return x; } </code> **Szablon klasy** <code c++> template <typename Typek> class Klasa { Typek *x; Typek& Metoda(); }; </code> **Szablon funkcji składowej (metody)** <code c++> template <typename Typek> Typek& Klasa<Typek>::Metoda() { } </code> **Przykład użycia** <code c++> int a = 5; a = pewna_funkcja(a); Wielomian w; Wielomian w2 = pewna_funkcja(w); Klasa<int> obiekt; Klasa<int> *wsk = new Klasa<int>(); </code> ===== Ć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ę: <code c++> Wektor<int> 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<Wielomian> 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; </code> 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 <code c++>zamien(a, b)</code> 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]]