Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Nowa wersja
Poprzednia wersja
pl:dydaktyka:jimp2:2017:labs:templates2 [2017/05/25 03:22]
mwp utworzono
pl:dydaktyka:jimp2:2017:labs:templates2 [2019/06/27 15:50] (aktualna)
Linia 147: Linia 147:
  
 </​code>​ </​code>​
 +
 +===== Ćwiczenia do wykonania =====
 +
 +  - [? plusy] Drzewo wyszukiwań binarnych (BST) z możliwością przechowywania dowolnego typu posiadającego przeciążony operator<​. Drzewo powinno udostępniać metody:
 +    - void Insert(const Element &e)
 +    - bool Find(const Element &e)
 +    - size_t Depth()
 +    - size_t Size()
 +    Podpowiedź:​ poddrzewa można przechowywać jako raw pointer (*Tree), ale wtedy pamiętać o [[https://​stackoverflow.com/​questions/​4782757/​rule-of-three-becomes-rule-of-five-with-c11|rule of 5]] albo wykorzystać smart pointer (unique_ptr<​Tree>​)
 +  - **[1 punkty] Przygotować funkcję przyjumującą "​obiekt"​ z możliwością wywołania siebie (tym "​obiektem"​ może być lambda, wskaźnik do globalnej funkcji, struktura/​klasa ze zdefiniowanym operatorem wywołania funkcji (operator()). Funkcja ma za zadanie zmierzenie czasu wykonania tego obiektu i zwrócenie tego czasu w razem z rezultatem wykonania "​obiektu"​ jako parę. Czas ma być mierzony w milisekundach. Zakładamy, że "​obiekt"​ nie przyjmuje, żadnych parametrów,​ ale może zwracać wartość dowolnego typu (nie void).** Podpowiedź:​ biblioteka chrono może się przydać. ​
 +  - **[3 punkty] Przygotować klasę Teacher, TeacherId i TeacherHash,​ klasa Teacher jest zwykłą klasą wartości, TeacherId również (reprezentuje Id nauczyciela),​ natomiast TeacherHash to klasa/​sturktura,​ która jest obiektem wyliczającym skrót za pomocą przeciążonego operatora wywołania funkcji (). Podpowiedzi:​ [[https://​stackoverflow.com/​questions/​20590656/​error-for-hash-function-of-pair-of-ints/​20602159#​20602159|wyliczenia hash przy pomocy wbudowanej struktury hash<​Type>​]] i [[https://​stackoverflow.com/​questions/​5889238/​why-is-xor-the-default-way-to-combine-hashes|raczej + z mieszaniem, mnożeniem przez pierwszą niż xor]]** ​
 +  - **[3 punkty] Zdefiniować klasę SequentialIdGenerator,​ która jest w stanie generować nowe wartości Id dla dowolnego typu Id (TeacherId, StudentId, CourseId, BuildingId...). Ponieważ klasy Id są obiektami niezmiennymi (a przynajmniej powinny być) SequentialIdGenerator powinien przyjmować jako parametr szablonu jeszcze jeden typ "​prosty",​ który będzie służył jako wewnętrzny licznik, który będzie inkrementowany przy potrzebie wygnenerowania nowego Id. Zakładamy, że typ Id musi posiadać konstruktor parametryczny z jednym argumentem typu "​prostego"​. Klasa SequentialIdGenerator powinna udostępniać metodę NextValue() która zwraca nowe Id, dodatkowo musi być możliwość wystartowania generatora z zadaną wartością (argument przekazany w konstruktorze). Tak naprawdę typ "​prosty"​ nie musi być wcale wbudowanym typem, może to być dowolna klasa z przeciążonym preinkrementacji (operator++) i możliwością zrzutowania na int (operator int)**
 +  - **[3 punkty] Przygotować funkcję PreOrder, PostOrder i InOrder dla drzewa BST, chodzi o to by możliwe było wykonanie:​** <code cpp>​Tree<​int>​ tree{5};
 +tree.Insert(9); ​
 +...
 +
 +cout << "​PreOrder:​ ";
 +for(const int &​value_in_tree : PreOrder(tree)) {
 +  cout<<​value_in_tree << " ";
 +}
 +cout << "​InOrder:​ ";
 +for(const int &​value_in_tree : InOrder(tree)) {
 +  cout<<​value_in_tree << " ";
 +}
 +cout << "​PostOrder:​ ";
 +for(const int &​value_in_tree : PostOrder(tree)) {
 +  cout<<​value_in_tree << " ";
 +}</​code>​ Wskazówka: przyda się PreOrderTreeIterator z metodami operator++, operator*, operator!= i pewnie PreOrderTreeView z metodami begin() end(), zwaracjące wcześniejszy iterator.
 +
 +
 +
  
pl/dydaktyka/jimp2/2017/labs/templates2.1495675372.txt.gz · ostatnio zmienione: 2019/06/27 15:52 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0