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]] 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** <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 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ę: <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''. 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 <code c++>zamien(a, b)</code> 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]]