This shows you the differences between two versions of the page.
poo:laboratoare:15 [2023/01/17 20:08] mihai.nan [Aplicatie Design Patterns] |
poo:laboratoare:15 [2023/01/17 20:09] (current) mihai.nan |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 14. ===== | ===== Laboratorul 14. ===== | ||
+ | |||
+ | |||
+ | Realizați o arhitectură unificată, similară cu Collections, pentru manipularea listelor care să conțină: | ||
+ | * interfața //**Function**//, parametrizată corespunzător, care conține o metodă //**execute**//, având ca parametru un obiect de tip //**A**// și un rezultat de tip //**B**//, unde //**A**// și //**B**// sunt două tipuri formale; | ||
+ | * interfața //**Addition**// folosită pentru a calcula suma a două numere de tip //**T**//, unde //**T**// este un subtip al lui //**Number**// (aceasta va conține o metodă //**zero**// care va întoarce elementul neutru al operației de adunare și o metodă //**add**//, care primește două obiecte de tip //**T**// și returnează suma lor); | ||
+ | * doi algoritmi polimorfici: //**reverse**// care inversează elementele unei liste și //**sum**// care calculează suma elementelor din listă; acești algoritmi trebuie să poată fi folosiți pe implementări diferite de liste, deoarece le abordează la nivel de interfață; | ||
+ | * o serie de metode care au un comportament similar cu funcționalele din paradigma funcțională. În cadrul acestei paradigme, funcțiile sunt valori de ordinul 1 ce pot fi manipulate ca orice altă valoare, iar funcționalele sunt funcții care manipulează alte funcții, primindu-le ca argumente sau returnându-le ca rezultat, în functie de cum e nevoie, fiind foarte utile în aplicarea anumitor modele de calcul des folosite. | ||
+ | |||
+ | Veți porni implementarea de la clasa **//ListUtil//**, pusă la dispoziție în arhiva laboratorului. | ||
+ | |||
+ | Explicatii pentru functionale: | ||
+ | |||
+ | -**foldl**(function, init, list)- returnează rezultatul aplicării functiei function pe rând asupra unui element din listă si a unui acumulator init. Ordinea folosirii elementelor din listă este de la stânga la dreapta; | ||
+ | Exemplu: | ||
+ | foldl(f(x, y) = x + y, 5, [0, 1, 2, 3]) => 11 | ||
+ | |||
+ | -**foldr**(function, init, list)- are un comportament similar cu foldl, însă ordinea folosirii elementelor din listă este de la dreapta la stânga; | ||
+ | Exemplu: | ||
+ | foldr(f(x, y) = y, 4, [0, 1, 2, 3]) => 0 | ||
+ | |||
+ | -**map**(function, list)- returnează lista rezultatelor aplicării unei functii f asupra fiecărui element dintr-o listă; | ||
+ | Exemplu: | ||
+ | map(f(x) = 2*x,[0, 1, 2, 3]) => [0, 2, 4, 6] | ||
+ | |||
+ | -**filter**(predicat, list)- returnează lista elementelor dintr-o listă care satisfac un predicat p (un predicat îl vom percepe ca o functie care are un rezultat de tip Boolean); | ||
+ | Exemplu: | ||
+ | filter(f(x) = x % 2 == 0, P[0, 1, 2, 3]) => [0, 2] | ||
+ | |||
+ | -**reduce**(function, list)- aplică functia pentru primele două elemente din lista, apoi pentru rezultatul obtinut anterior si urmatorul element si tot asa; | ||
+ | Exemplu: | ||
+ | reduce(f(x, y) = x + y, [47, 11, 42, 13]) => 113 | ||
+ | |||
+ | -**all**(predicat, list)- primeste un predicat (metoda ce are ca rezultat un boolean) si verifică dacă toate elementele din listă satisfac predicatul; | ||
+ | Exemplu: | ||
+ | all(f(x) = x > 0, [0, 1, 2, 3]) => True ; | ||
+ | all(f(x) = x % 2 == 0, [0, 1, 2, 3]) => False | ||
+ | |||
+ | -**any**(predicat, list)- primeste un predicat si verifică dacă exista cel putin un element în lista care satisface predicatul. | ||
+ | Exemplu: | ||
+ | any(f(x) = x < 0,[1, 2, 3, 4]) => False ; | ||
+ | any(f(x) = x % 2 == 0,[1, 2, 3]) => True | ||
+ | |||
+ | Pentru testare, completati exemplele din clasa Test. | ||
+ | |||
+ | <hidden> | ||
+ | <HTML> | ||
+ | <iframe src="https://ocw.cs.pub.ro/courses/_media/poo/laboratoare/laborator_13.pdf" width="740" height="720"></iframe> | ||
+ | </HTML> | ||
+ | </hidden> | ||
+ | |||
+ | {{:poo:laboratoare:arhiva_13.zip|Arhiva laborator}} | ||
+ | |||
+ | |||
+ | |||
<hidden> | <hidden> |