7. úkol - Simple car database
Vaším úkolem je vytvořit jednoduchou databázi aut. K implementaci použijte spojový seznam. Databáze aut má metodu na její vytvoření z předem definovaného pole, metodu na vložení automobilu do db, metodu na úpravu názvu již vloženého automobilu, metodu na úpravu značky již vloženého automobilu a metodu na změny stavu již vloženého automobilu. Pro zjednodušení není umožňěno měnit cenu automobilu. Dále databáze disponuje metodou, která umí vypočítat celkovou hodnotu aut v showroomu. Databáze má také metodu, která vrátí hlavičku spojového seznamu, spojový seznam samotný a metodu, která databázi vymaže. Více informací o metodách níže.
Pro databázi platí následující omezení: V DB nejsou žádná ID vícekrát. V DB jsou záznamy vždy seřazeny podle ceny od nejnižší po nejvyšší a to v pořadí v jakém byly vkládány.
Pro spojový seznam platí následující omezení: Každý uzel vidí na svého předka a na svého následníka. V každém uzlu jsou uložena všechna data o konkrétním automobilu.
K vyhodnocení používáme python verze 3.
Datová struktura
Vytvořte třídu showroom.py, která bude obsahovat níže specifikované třídy a metody.
CAR
Třída Car má následující proměnné: identification, name, brand, price, active:
identification - jednoznačný identifikátor vozu (int)
name - název vozu (string)
brand - značka (string)
price - cena (int)
active - příznak, zdali je vůz aktivní (boolean)
Nebo-li třída Car jsou data, která jsou uložena v každé Node.
Node
Třída Node reprezentuje uzel ve spojovém seznamu. V našem případě má následující proměnné: nextNode, prevNode, data. Níže je popis jednotlivých proměnných:
nextNode - další uzel v cestě (Node), v případě že žádný další uzel neexistuje pak je hodnota None.
prevNode - předchozí uzel v cestě (Node), v případě že předchozí uzel neexistuje pak je hodnota None.
data - data, která jsou uložena v aktuálním uzly. (Car) Každý uzel musí obsahovat data.
V případě posledního uzlu ve spojovém seznamu je hodnota nextNode = None, v případě prvního uzlu ve spojovém seznamu je hodnota prevNode = None, v případě jednoprvkového seznamu je v proměných hlavy spojového seznamu hodnota nextNode=prevNode = None. V případě prázdného spojového seznamu je hodnota hlavy None
LinkedList
Třída LinkedList reprezentuje spojový seznam a drží si hlavičku spojového seznamu, pomocí které lze projít celý spojový seznam. Nebo-li prohledat DB. Tato třída může obsahovat i metody, které pracují se spojovým seznamem. Spojovy seznam tedy implementujete jako tridu s vlastnimi promenymi, ale metody pro obsluhu DB muzete rovnou implementovat jako proste funkce v souboru showroom.py
Metody
Níže je seznam metod, které musí databáze poskytovat (očekáváme je v souboru showroom.py), včetně jejich definice a popisu.
init(cars) - metoda příjímá pole objektů Car a na jejich základě vytvoří spojový seznam.
getDatabase() - metoda vrátí celý spojový seznam (LinkedList)
getDatabaseHead() - metoda vrátí hlavičku spojového seznamu (Node)
clean() - metoda vyčistí spojový seznam
add(car) - metoda na vstupu přijímá objekt Car a vloží ho na správné místo ve spojovém seznamu.
updateName(identification,name) - metoda na vstupu přijímá identifikátor vozu (identification - int) a nové jméno vozu (name - string) a ve spojovém seznamu najde auto se stejným indetifikátorem a nahraní u něj jméno
updateBrand(identification,brand) - metoda na vstupu přijímá identifikátor vozu (identification - int) a novou zančku vozu (brand- string) a ve spojovém seznamu najde auto se stejným indetifikátorem a nahraní u něj značku
activateCar(identification) metoda na vstupu přijímá identifikátor vozu (identification - int) a ve spojovém seznamu najde auto se stejným identifikátorem a nastaví mu hodnotu active = True
deactivateCar(identification) metoda na vstupu přijímá identifikátor vozu (identification - int) a ve spojovém seznamu najde auto se stejným identifikátorem a nastaví mu hodnotu active = False
calculateCarPrice - metoda vrátí aktuální cenu všech vozů ve spojovém seznamu. Cena všech vozů se počítá jako součet cen jednotlivých vozů. Při výpočtu bereme v potaz pouze aktivní vozy (active = True)
V případě, že se metodám updateName, updateBrand, activateCar, deactivateCar nepodaří najít vůz podle daného identifikátoru, metody vrátí return None.
Nutné podmínky
V DB mohou být pouze auta s unikátním ID. - není nutné ověřovat - testovací data jsou ,,dostatečně slušeně vychována,,
Auto v DB jsou vždy seřazené podle ceny (vzestupně) - musíte zajistit v rámci vaší implementace.
Při metodě init a add platí, že v případě kdy dva vozy mají stejnou pořizovací cenu tak jsou ve spojovém seznamu v pořadí v jakém byly vkládány - musíte zajistit v rámci vaší implementace.
V DB neexistuje záznám, který nemá data - musíte zajistit v rámci vaší implementace.
Bodování
Za úlohu je možné získat 7 bodů. 4 body jsou za správné vytvoření spojového seznamu metodou init, za správnou implementaci metody clean a za správné implementace metod, které vrací spojový seznam a jeho hlavičku. Jedná se tedy o tyto metody: getDatabase getDatabaseHead, clean, init. Zbývající 3 body jsou za správnou implementaci ostatních metod nad spojovým seznamem.
Termín odevzdání
Úterní cvičení: 21.11.2017
Páteční cvičení: 1.12.2017
Vždy před začátkem vašeho cvičení.
Aby jste nemuseli na cvičení je nutné odevzdat tento úkol za plný počet bodů. Pro úterní cvičení do 14.11.2017 a pro páteční cvičení do 24.11.2017. Vždy před začátkem vašeho cvičení