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<inf_system::row_def_const_ptr>& 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<idx, row_def>::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<row_def_const_ptr> find(const type<idx>& value) {... } }; template<size_t idx> size_t erase(const type<idx>& 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) předek nemusí být generický (šablona), potomek může být např. 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 např. inf. systém má 3x typ std::string pozor na volání funkcí se správnými typy parametrů např. std::string vs char * správně ošetřit indexy pro různé instance systémů 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 čtvtek před posledním cvičením pozor na přeložitelnost bez chyb a ideálně warningů 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