===== Ukázková zkouška 1 ===== Ze zkoušky je možné získat maximálně 40 bodů, 20 bodů z obsáhlejších otázek na této stránce a 20 bodů z [[courses:a7b36pjc:testy:kratke_otazky|krátkých otázek]]. - Napište deklaraci šablonové třídy queue (fronta) pro libovolný datový typ (parametr šablony). Třída queue bude poskytovat následující operace: [3b] * ''front()'' -- vrátí první prvek * ''push(element)'' -- přidá do fronty další prvek * ''pop()'' -- zahodí první prvek * ''size()'' -- vrátí velikost fronty (množství prvků ve frontě) * ''empty()'' -- vrátí 'true' pokud je fronta prázdná, jinak ''false'' \\ \\ //Nezapomeňte na to, že vaše třída může potřebovat konstruktory.// \\ ++ řešení | template class Queue { public: T& front(); const T& front() const; void push(const T& elem); void push(T&& elem); void pop(); size_t size() const; bool empty() const; private: std::vector data; }; ++ - Co vypíše následující program na standardní výstup? [1B] class B {}; class D : public B {}; void f(B& throwable) { throw throwable; } int main() { D status; try { f(status); } catch (D& e) { std::cout << "Chytil jsem D!\n"; } catch (...) { std::cout << "To je divny...\n"; } } ++ řešení | \\ //To je divny...// ++ - Které z následujících deklarací pole, (ia) až (id), jsou špatně a proč? Předpokládejte, že funkce ''get_size()'' vrací int. [2b] \\ ''const unsigned buf_size = 1024;'' * ''int ia[buf_size + 3];'' * ''int ib[get_size()];'' * ''int ic[9 * 6 - 55];'' * ''char id[4] = "cpp";'' \\ ++ řešení | \\ ''ib'' -- rozměr musí být konstantní \\ ''ic'' -- rozměr nesmí být záporný ++ - Co vypíše následující program na standardní výstup? [3b] struct A { A() { std::cout << "A "; } ~A() { std::cout << "~A "; } void say() { std::cout << "A says "; } void say() const { std::cout << "A says const "; } }; struct B : A { B() { std::cout << "B "; } ~B() { std::cout << "~B "; } void say() { std::cout << "B says "; } void say() const { std::cout << "B says const "; } }; int main() { A a; const B b; a.say(); b.say(); const A& aref = b; aref.say(); } ++ řešení | \\ //A A B A says B says const A says const ~B ~A ~A// ++ - Jaká chyba je v této funkci? Jak ji můžete opravit? [3b] bool transfer_item(account& account1, account& account2, const item& item) { // Nejdriv zamkneme oba ucty std::lock_guard lg1(account1.mutex); std::lock_guard lg2(account2.mutex); // A pak se pokusime prevest item z jednoho do druheho. // Ucet uz ho nemusi vlastnit, takze je potreba to zkontrolovat // znovu if (account1.contains(item)) { account1.remove(item); account2.add(item); return true; } return false; } ++ řešení | \\ //Může snadno dojít k deadlocku. Nejjednodušší způsob je použít std::lock pro zamknutí obou mutexů zároveň a nechat lock_guardy přebrat vlastnictví zámku.// ++ - Naimplementujte funkci, která seřadí ''std::vector'' dle příjmení, jména a věku osoby. [3b] #include #include #include struct osoba { std::string prijmeni, jmeno; int vek; }; //Nezapomeňte, že ''std::sort'' není stabilní.// \\ ++ řešení | \\ Buďto se použije 3x ''std::stable_sort'', nebo stačí prostě použít komplexní lambdu. Funkce musí brát daný vector referencí. ++ - Naimplementujte funkci, která referencí přebírá dva objekty typu ''std::vector''. Parametr ''in'' je konstantní a s prvky typu ''double'', a parametr out je s prvky typu int. Funkce má za úkol vyprázdnit ''out'' a převést do něj všechny prvky z ''in''. Pokud prvek z vektoru ''in'' není celočíselný, a došlo by ke ztrátě dat, funkce vyhodí výjimku. Implementujte funkci tak, aby poskytla silnou záruku. [5b] \\ ++ řešení | \\ //Záruku nelze získat dopřednou kontrolou, protože může dojít k chybě i při volání push_back na výstupním vektoru. Je tedy potřeba vytvořit nový vektor, ten naplnit a následně ho prohodit s vektorem out.// ++