Vaším úkolem je vytvořit jednoduchou databázi (dále jen db) 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.
Vytvořte třídu showroom.py
, která bude obsahovat níže specifikované třídy a metody.
Třída Car
má následující atributy: 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
)
Instance třídy Car
představují data, jež jsou uložena v každém uzlu (tj. 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 (typu Node
) v cestě, v případě že žádný další uzel neexistuje, pak je hodnota None
.
prevNode
- předchozí uzel (typu Node
) v cestě, v případě že předchozí uzel neexistuje, pak je hodnota None
.
data
- data, která jsou uložena v aktuálním uzlu (v našem případě typu 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 (head
) spojového seznamu hodnota nextNode = prevNode = None
. V případě prázdného spojového seznamu je hodnota hlavy None
.
Třída LinkedList
reprezentuje spojový seznam a drží si hlavičku (head
) spojového seznamu, pomocí které lze projít celý spojový seznam, to jest prohledat db. Tato třída může obsahovat i metody, které pracují se spojovým seznamem. Spojový seznam tedy implementujete jako třídu s vlastnimi atributy, ale metody pro obsluhu db můžete rovnou implementovat jako prosté funkce v souboru showroom.py
.
Níže je seznam funkcí, 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ů typu 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 typu 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
typu int
) a nové jméno vozu (name
typu string
). Ve spojovém seznamu najde auto se daným indetifikátorem a nahradí u něj jméno.
updateBrand(identification, brand)
- metoda na vstupu přijímá identifikátor vozu a novou značku vozu (brand
typu string
). Ve spojovém seznamu najde auto se daným indentifikátorem a nahradí u něj značku.
activateCar(identification)
- metoda na vstupu přijímá identifikátor vozu. Ve spojovém seznamu, najde auto se stejným identifikátorem a nastaví jeho atribut active = True
.
deactivateCar(identification)
- metoda na vstupu přijímá identifikátor vozu a ve spojovém seznamu, najde auto se stejným identifikátorem a nastaví jeho atribut 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 aktivních vozů (tj. active == True
).
updateName()
, updateBrand()
, activateCar()
, deactivateCar()
nepodaří najít vůz podle daného identifikátoru, metody vrátí None
.
init()
a add()
musí implementace zajistit, aby v případě kdy dva vozy mají stejnou pořizovací cenu, byly ve spojovém seznamu v pořadí v jakém byly vkládány.
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: getDatabase()
, getDatabaseHead()
. Zbývající 3 body jsou za správnou implementaci ostatních metod nad spojovým seznamem.