======== HW 03 - Třídy a objekty ======== ^ Termín odevzdání | 28.4.2024 7:00 | ^ Možný bodový zisk | až 8b (4+4) | ^ Počet uploadů | 15 | ====== Zadání ====== Napište program, který bude vykonávat správu jednoduché knihovny. V knihovně se nacházejí dva druhy tiskovin * časopisy, popsané třídou ''Journal'' * instance mají atributy ''name'', ''volume'', ''issue'', ''year'' * knihy, popsané třídou ''Book'' * instance mají atribute ''name'', ''author'', ''year'' Kromě výše zmíněných atributů mají všechny objekty atribut ''id'', což je číslo odpovídající pořadí tiskoviny při načtení do databáze. ====== Vstup programu ====== Na standardním vstupu pak může být některý z následujících příkazů: * ''list'' - vypíše seznam všech položek v databázi * ''find:retezec'' - vypíše všechny položky databáze, které obsahují v některém z atributů text ''retezec'' * ''erase:rezezec'' - smaže položky databáze, které obsahují v některém z atributů text ''retezec'', nic nevypisuje * ''remove:id'' - odstraní z databáze položku s číslem ''id'', nic nevypisuje Kromě prvního příkazu potřebují všechny ostatní příkazy i argument. Pokud argument chybí, vypíše se na standardní výstup informace v následující podobě (chybějící argument příkazu ''find''): +----------------------------------------------------------+ | Command "find" expects some argument | +----------------------------------------------------------+ Pokud je na vstupu neznámý příkaz, vypíše se na standardní výstup upozornění v následujícím tvaru (neznámý příkaz ''delete''): +----------------------------------------------------------+ | Unknown command "delete" | +----------------------------------------------------------+ Pokud chce uživatel smazat záznam s ID, které neexistuje, , vypíše se na standardní výstup upozornění v následujícím tvaru: +----------------------------------------------------------+ | ID = 100 is not in the database | +----------------------------------------------------------+ ====== Výstup programu ====== Výstupem programu je tabulka, která obsahuje záznamy odpovídající aktuálnímu stavu databáze a příkazům na vstupu. Celková šířka tabulky je 60 znaků. Hlavička a patička tabulky využívají celou šířku. Řádky se záznamy obsahují dvě buňky, v první je číslo záznamu (''id''), v druhé je ve dvou řádcích formátovaný popis tiskoviny - viz příklady. U časopisů se pro druhý řádek používá formát ''year'', ''volume''(''issue''). ===== Bonus ===== Položky v databázi je možné řadit podle ''id'', ''name'' nebo ''year'' a to vzestupně ''asc'' (defaultní řazení) nebo sestupně ''desc''. Na standardním vstupu lze tedy očekávat některý z následujících příkazů * ''sort:year:desc'' - seřadí sestupně podle roku * ''sort:name'' - seřadí vzestupně podle názvu tiskoviny Příkaz ''sort'' očekává jako argument řadicí kritérium. Pokud je uvedeno jiné, než je implementováno, vypíše se na standardní výstup následující: +----------------------------------------------------------+ | Unknown sorting order | +----------------------------------------------------------+ Pokud je hodnota, podle které se porovnává, stejná, rozhoduje ''ID'' záznamu. ===== Inicializace knihovny ===== Hlavní funkce programu může začínat např. takto: Database db; db.add(new Journal("IEEE Transaction on Computers", "C-35", "10", "Oct. 1986")); db.add(new Journal("IEEE Transaction on Computers", "C-35", "11", "Dec. 1986")); db.add(new Journal("IEEE Transactions on Communications", "28", "8", "Aug. 1980")); db.add(new Book("Dva roky prazdnin", "Jules Verne", "1888")); db.add(new Book("Tajuplny ostrov", "Jules Verne", "1874")); db.add(new Book("Ocelove mesto", "Jules Verne", "1879")); K domácímu úkolu je ke stažení přiložen soubor, který obsahuje část kódu. Je v něm inicializace knihovny, ale také ideový návrh, jak by mohla vypadat struktura programu. Věnujte pozornost zejména správné dealokaci paměti při použití vektoru ukazatelů - nestačí jen smazat položku vektoru, ale je třeba i dealokovat paměť, na kterou tento ukazatel odkazuje. ===== Příklady ===== ==== pub01 ==== ^ Standardní vstup (cin) ^ Očekávaný výstup (cout) ^ | list remove | +----------------------------------------------------------+ | List of all records | +----+-----------------------------------------------------+ | 1 | IEEE Transaction on Computers | | | 1986, C-35(10) | +----+-----------------------------------------------------+ | 2 | IEEE Transaction on Computers | | | 1986, C-35(11) | +----+-----------------------------------------------------+ | 3 | IEEE Transactions on Communications | | | 1980, 28(8) | +----+-----------------------------------------------------+ | 4 | Dva roky prazdnin | | | 1888, Jules Verne | +----+-----------------------------------------------------+ | 5 | Tajuplny ostrov | | | 1874, Jules Verne | +----+-----------------------------------------------------+ | 6 | Ocelove mesto | | | 1879, Jules Verne | +----+-----------------------------------------------------+ | Total: 6 | +----------------------------------------------------------+ +----------------------------------------------------------+ | Command "remove" expects some argument | +----------------------------------------------------------+ | ==== pub02 ==== ^ Standardní vstup (cin) ^ Očekávaný výstup (cout) ^ | find:Jules Verne | +----------------------------------------------------------+ | Search for "Jules Verne" | +----+-----------------------------------------------------+ | 4 | Dva roky prazdnin | | | 1888, Jules Verne | +----+-----------------------------------------------------+ | 5 | Tajuplny ostrov | | | 1874, Jules Verne | +----+-----------------------------------------------------+ | 6 | Ocelove mesto | | | 1879, Jules Verne | +----+-----------------------------------------------------+ | Total: 3 | +----------------------------------------------------------+ | ==== pub03 ==== ^ Standardní vstup (cin) ^ Očekávaný výstup (cout) ^ | delete remove:100 remove:2 remove:4 list | +----------------------------------------------------------+ | Unknown command "delete" | +----------------------------------------------------------+ +----------------------------------------------------------+ | ID = 100 is not in the database | +----------------------------------------------------------+ +----------------------------------------------------------+ | List of all records | +----+-----------------------------------------------------+ | 1 | IEEE Transaction on Computers | | | 1986, C-35(10) | +----+-----------------------------------------------------+ | 3 | IEEE Transactions on Communications | | | 1980, 28(8) | +----+-----------------------------------------------------+ | 5 | Tajuplny ostrov | | | 1874, Jules Verne | +----+-----------------------------------------------------+ | 6 | Ocelove mesto | | | 1879, Jules Verne | +----+-----------------------------------------------------+ | Total: 4 | +----------------------------------------------------------+ | ==== bon_pub01 ==== ^ Standardní vstup (cin) ^ Očekávaný výstup (cout) ^ | erase:Jules sort:year list | +----------------------------------------------------------+ | List of all records | +----+-----------------------------------------------------+ | 3 | IEEE Transactions on Communications | | | 1980, 28(8) | +----+-----------------------------------------------------+ | 1 | IEEE Transaction on Computers | | | 1986, C-35(10) | +----+-----------------------------------------------------+ | 2 | IEEE Transaction on Computers | | | 1986, C-35(11) | +----+-----------------------------------------------------+ | Total: 3 | +----------------------------------------------------------+ | ==== bon_pub02 ==== | sort:name:desc list | +----------------------------------------------------------+ | List of all records | +----+-----------------------------------------------------+ | 5 | Tajuplny ostrov | | | 1874, Jules Verne | +----+-----------------------------------------------------+ | 6 | Ocelove mesto | | | 1879, Jules Verne | +----+-----------------------------------------------------+ | 3 | IEEE Transactions on Communications | | | 1980, 28(8) | +----+-----------------------------------------------------+ | 1 | IEEE Transaction on Computers | | | 1986, C-35(10) | +----+-----------------------------------------------------+ | 2 | IEEE Transaction on Computers | | | 1986, C-35(11) | +----+-----------------------------------------------------+ | 4 | Dva roky prazdnin | | | 1888, Jules Verne | +----+-----------------------------------------------------+ | Total: 6 | +----------------------------------------------------------+ | ====== Odevzdání ====== Do systému BRUTE odevzdejte zabalený archiv s *.cpp a případně *.hpp soubory s libovolným jménem. Všechny soubory musí být v kořenovém adresáři archivu. Veřejné příklady + Template: {{ :courses:b2b99ppc:hw:hw03.zip | HW03.zip}} ^ ^ Povinné i bonusové zadání ^ ^ Název v BRUTE | HW03 | ^ Soubor/y | jakékoliv množství *.cpp/*.hpp souborů | ^ Argumenty při spuštění | žádné | ^ Kompilace pomocí | g++ -pedantic -Wall -Werror -std=c++17 | ^ Procvičované oblasti | dědění a polymorfismus v C++, STL |