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: 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
courses/b2b99ppc/hw/hw03.txt · Last modified: 2024/02/15 15:21 by nentvond