Documente Academic
Documente Profesional
Documente Cultură
Grupa: 214
Proiect 8
TAD DicționarOrdonat – implementare folosind o tabelă de dispersie / rezolvare coliziuni prin liste
independente.
Enunț
Pizza Delivery
Să se creeze o aplicație care ajută un angajat de la o Pizzerie să distribuie corect cutiile de pizza pe
anumită stradă. La fiecare casă el poate lăsa un anumit număr de cutii. Aplicația permite adăugarea
unui număr de cutii pentru o anumită casă, iar fiecărei case i se asociază o cheie corespunzătoare
numărului în cadrul străzii. De asemenea, aplicația permite ștergerea și căutarea unui număr de cutii
de pizza pentru o anumită casă și afișarea numărului de case de pe stradă.
1) TAD DicționarOrdonat
Domeniu:
OD = { od | od este un dictionar ordonat cu elemente e = (c, v), c de tip Tcheie, v de tip
TValoare}
adaugă(od, c, v)
pre: od OD, cTCheie, v TValoare,
post: od’ OD, od’=od+(c,v) (se adaugă în dictionar perechea (c, v))
caută(od, c, v)
pre: od OD, c TCheie
post: v TValoare e valoarea asociată cheii v
-1 în cazul in care nu exista cheia c
șterge(od, c)
pre: od OD, c TCheie
post: perechea (c, v) este ștearsă din dictionar, dacă c od
v TValoare
dim(od)
pre: od OD
post: dim=dimensiunea dicționarului od (numărul de elemente)
vid(od)
pre: od OD
post: vid= adevărat în cazul în care od e dicționarul vid
fals în caz contrar
iterator(od, i)
{se creează un iterator pe dictionarul od}
pre: od OD
post: od I i este iterator pe dicționarul od
Domeniu:
I = { i | i – iterator pe od OD }
Operații:
creeazăIterator(od, i)
pre: od OD
post: I I, current referă primul nod din dictionar
următor(i)
pre: i I
post: i I, current referă următorul nod din dictionar, față de cel referit de current
valid(i)
pre: i I
post: valid = adevărat dacă current referă o poziție validă din dictionar
fals în caz contrar
element(i, e)
pre: i I, valid(i)
post: e de tip TElement , e este elemntul curent
3) TNod
Operatii:
creeazaTNod(nod, c, v, pnod)
pre: nod ∈ TNod, c ∈ TCheie, v ∈ TValoare, pnod ∈ PNod;
post: s-a creat nod ∈ TNod;
getElement(nod)
pre: nod ∈ TNod
post: getElement = e ∈ TElement, elemental in cadrul nodului
getCheie(nod)
pre: nod ∈ TNod
post: getCheie = c ∈ TCheie, cheia elementului
getValoare(nod)
pre: nod ∈ TNod
post: getValoare = v ∈ TValoare, valoarea elementului
TElement
• c: TCheie (derivat din TComparabil)
• v: TValoare
• R ⸦ TCheie × TCheie
TNod
• e: TElement
• urm: ↑TNod
Iterator DO
• od: OD
• current: ↑TNod
DO (DicționarOrdonat)
• od: TFuncție (funcția de dispersie)
• n: Întreg
• l: ↑TNod[0… n-1]
• R: Relații
PNod: ↑TNod
TNod
DictionarOrdonat
Complexitate:
Caz favorabil: ϴ(1) – perechea se afla pe prima pozitie in lista din tabela
Caz mediu: O(k), k = numarul perechilor din lista de pe pozitita i din tabela, cheia c
se poate afla pe oricare din pozitiile listei
Caz defavorabil: ϴ(k), k = numarul perechilor din lista de pe pozitia i din tabela,
cheia c se afla pe ultima pozitie in lista ce incepe de pe pozitia i
Functie sterge(od, c)
i <- od.d(c)
Daca od.l[i] = NIL atunci
sterge<-fals
break
SfDaca
Altfel
Daca [l[i]].e.c = c atunci
p<- l[i]
l[i]<- [l[i]].urm
dealoca(p)
sterge<- adevarat
break
SfDaca
aux1<- od.l[i]
aux2<-[od.l[i]].urm
CatTimp aux2≠ NIL si ([aux2].e.c ≠c ) executa
aux1<-aux2
aux2<-[aux2].urm
SfCatTimp
Daca aux2 ≠ NIL atunci
[aux1].urm<-[aux2].urm
dealoca(aux2)
sterge<-adevarat
break
SfDaca
SfAltfel
Sterge<-false
SfSubalgoritm
Iterator
Proiectarea aplicatiei
In implementarea aplicatiei am creat clasa Repository care gestioneaza toate
actiunile care se pot face asupra Dictionarului. De asemenea am creat si o clasa UI
care face legatura intre utlizator si aplicatie.
Repository
od: OD
it: I
UI
rep: Repository
Operatii Repository
Adauga( c, v)
pre: c ∈ TCheie, v ∈ TValoare;
post: Adauga = adevarat, daca s-a adaugat (c,v) in dictionarul rep.d
fals, altfel
Sterge( c)
pre: c ∈ TCheie,
post: Sterge = adevarat, daca s-a sters (c,v) din dictionarul rep.d
fals, altfel
NumarCutiiCasa(c)
pre: c ∈ TCheie
post: NumarCutiiCasa = v ∈ TValoare, valoarea asociata cheii c
NumarCase()
post: nrCase = n, n ∈ N;
n = numerul de chei ale dictionarului;
Functie nrCase() (Complexitate ϴ(n))
nrCase<-dim(rep.md)
SfSubalgoritm
TotalCutii()
post: TotalCutii = suma valorilor din dictionar
ToateComenzile()
post: ToateComenzile = vector de elemente TElement
Operatii UI
showMenu( ui)
pre: ui∈ UI;
post:
SfDaca
showMenu(ui)
run(ui,comanda)