Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech
cíl: vytvořit třídu inf_system pro ukládání informací o studentech a zaměstnancích působících na fakultě příklad použití: int main() { inf_system inf_system; inf_system.insert("Pepa", "Skoba", student, 602111222, "Francouzska 1, Praha"); inf_system.insert("Jarda", "Vomacka", student, 777123456, "Belgicka 28, Brno"); inf_system.insert("Franta", "Vomacka", teacher, 608456789, "Italska 11, Praha"); auto result = inf_system.find<2>(student); print_vector(result); auto count = inf_system.erase<1>("Vomacka"); //vrátí „2“ a smaže 2 řádky } void print_vector(const vector
& vector) { for (const auto& r : vector) { cout << get<0>(*r) << " " << get<1>(*r) << " " << get<2>(*r) << " " << get<3>(*r) << " " << get<4>(*r) << endl; } }
inf_system - má 5 sloupečků s hodnotami:
Jméno (std::string) Příjmení (std::string) Pozice (enum) – např. enum position { student, teacher, external_worker }; Telefon (size_t nebo int) Adresa (std::string)
◦ třída nemá pevné rozhraní, avšak použití by ideálně mělo odpovídat příkladu
funkce – podmínkou splnění úkolu je implementace tří funkcí
◦ insert – vloží nový řádek (záznam) do systému se všemi informacemi ◦ find – specifikován číslem sloupce, podle kterého se hledá
čísla sloupců jsou počítány od 0 parametr funkce je daného typu podle zvoleného sloupce vrátí seznam řádků ze systému (nejlépe odkazem (pointer *), const…) podle hledaného klíče v daném sloupci
◦ erase – opět specifikován číslem sloupce
parametr je správně typovaný podle vybraného sloupce vymaže všechny záznamy, u kterých se na dané pozici shoduje parametr s hodnotou záznamu vrací počet smazaných řádků
primární cíl – aby vše fungovalo správně
sekundární cíl – efektivita a úspora ◦ předpoklad – v systému se bude často využívat funkce find ◦ nutná implementace efektivního prohledávání struktury => zakomponování indexů (např. std::map<…> či multimap<…>) ◦ indexy je možné využít i pro funkci erase ◦ nutné zakomponovat opravy indexů po vykonání insert a erase ◦ také se zamyslete nad složitostí, paměťovou náročností, úhledností kódu a celkovou efektivitou vašeho řešení a snažte se ho optimalizovat
pro úspěšné splnění úkolu je nutné naimplementovat indexy!
Jak by mohla vypadat třída v hlavičkovém souboru
enum position { student, teacher, external_worker }; class inf_system { //first name, last name, position, telephone, address typedef std::tuple<std::string, std::string, position, size_t, std::string> row_def; typedef const row_def * row_def_const_ptr; template<size_t idx> using type = typename std::tuple_element::type; void insert(const std::string& first_name, const std::string& last_name, const position& position, const size_t& telephone, const std::string& address); template<size_t idx> std::vector find(const type& value) { ... } template<size_t idx> size_t erase(const type& value) { ... } };
nastudujte si práci s třídou std::tuple<…>
◦ std::tuple_element<…>::type, std::get<…>(…), std::make_tuple(…), ◦ std::forward_as_tuple(…), …
slajdy z přednášky o šablonách (template)
pro tvorbu indexů využijte ideálně polymorfismus (dědičnost)
např.
◦ předek nemusí být generický (šablona), potomek může být
class abstr_index { … }; template<size_t idx> class index : abstr_index { … };
//abstraktní předek
//potomek už může být pro konkrétní sloupec
různé sloupce se stejnými typy musí mít odlišné indexy
pozor na volání funkcí se správnými typy parametrů
správně ošetřit indexy pro různé instance systémů
◦ např. inf. systém má 3x typ std::string ◦ např. std::string vs char *
inf_system inf1; inf_system inf2; inf1.find<0>(…); inf2.find<0>(…);
správně ošetřit kopírování informačních systémů ◦ kopírování by mělo být řízené kontejnerovou logikou inf_system inf1;
inf1.insert(…); inf2 = inf1; inf2.find<0>(…);
termín: 12.1.2017 23:59
pozor na přeložitelnost bez chyb a ideálně warningů
◦ čtvtek před posledním cvičením ◦ nemusíte testovat na všech platformách - primárně Windows + VS
na začátek každého souboru vložte komentář typu // Karel Vomacka NPRG041 2016/2017 vaše řešení vložte do Grupíčku - neposílejte emailem! ◦ správné soubory do správných sloupečků! ◦ du1.h
definice třídy a implementace šablonových funkcí
◦ du1.cpp
implementace ostatních (nešablonových funkcí) ukázka použití informačního systému