======== HW 03 - Třídy a objekty ========
^ Termín odevzdání | 17.4.2022 23:59 CEST |
^ 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 |