This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:genericitate [2021/10/03 20:45] florin.mihalache [Exerciții] |
poo-ca-cd:laboratoare:genericitate [2023/12/17 19:13] (current) florin.subtirica [Exerciții] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 11: Genericitate ===== | + | ===== Laboratorul 10: Genericitate ===== |
==== Obiective ==== | ==== Obiective ==== | ||
Line 260: | Line 260: | ||
</code> | </code> | ||
+ | ==== Exemple genericitate ==== | ||
+ | Probabil nu sunteți familiari încă cu termenul de “GPU Computing” (utilizarea unui procesor grafic pentru accelerarea calculelor), dar probabil ați exploatat una dintre întrebuințările ei, mai exact jocurile video. | ||
+ | |||
+ | Jocurile video sunt create cu ajutorul unor engine-uri grafice, care în esență nu reprezintă altceva decât aplicații care realizează o multitudine de operații matematice: plotări de grafice, interpolări, operații matriceale/vectoriale, derivări etc. | ||
+ | |||
+ | Aceste operații matematice pot fi făcute pe diferite tipuri de date. O matrice poate acceptă int-uri (exemplu: camera jucătorului), float-uri / double-uri (exemplu: setarea opacității unei texturi), char-uri (exemplu: reprezentarea text box-urilor pentru dialog) etc. În loc să creem câte o clasă care să adere fiecărui tip, putem scrie o singură dată o clasă care să reprezinte o matrice și care să accepte mai multe tipuri de date prin genericitate. Acest lucru devine foarte util dacă dorim să creem o bibliotecă întreagă pentru operații matematice avansate (exemplu: Jscience), fără să ne repetăm codul doar pentru a crea clase și metode specifice unor tipuri de date. | ||
==== Exerciții ==== | ==== Exerciții ==== | ||
+ | Scheletul laboratorului poate fi descărcat de aici: {{:poo-ca-cd:laboratoare:oop_lab10.zip|}} | ||
- | - **(7 puncte)** Implementați o structură de date de tipul ''MultiMapValue<K, V>'', pe baza [[https://github.com/oop-pub/oop-labs/tree/master/src/lab11 | scheletului]], care reprezintă un ''HashMap<K, ArrayList<V>>'', unde o cheie este asociată cu mai multe valori. Modalitatea de stocare a datelor este la alegere (moștenire sau agregare) și să folosiți funcționalitățile din HashMap. În schelet aveți următoarele metode de implementat: | + | Laboratorul trebuie rezolvat pe platforma LambdaChecker, fiind găsit [[https://beta.lambdachecker.io/contest/21 | aici]]. |
+ | |||
+ | - **(6 puncte)** Implementați o structură de date de tipul ''MultiMapValue<K, V>'', pe baza scheletului, care reprezintă un ''HashMap<K, ArrayList<V>>'', unde o cheie este asociată cu mai multe valori. Modalitatea de stocare a datelor este la alegere (moștenire sau agregare) și să folosiți funcționalitățile din HashMap. În schelet aveți următoarele metode de implementat: | ||
- **(1 punct)** ''add(K key, V value)'' - adaugă o valoare la o cheie dată (valoarea este adăugate în lista de valori asociate cheii, dacă cheia și lista nu există, atunci lista va fi creată și asociată cheii. | - **(1 punct)** ''add(K key, V value)'' - adaugă o valoare la o cheie dată (valoarea este adăugate în lista de valori asociate cheii, dacă cheia și lista nu există, atunci lista va fi creată și asociată cheii. | ||
- | - **(0.5 puncte)** ''void addAll(K key, List<V> values)'' - adaugă valorile din lista de valori dată ca parametru la lista asociată cheii. | + | - **(1 puncte)** ''void addAll(K key, List<V> values)'' - adaugă valorile din lista de valori dată ca parametru la lista asociată cheii. |
- | - **(0.5 puncte)** ''void addAll(MultiMapValue<K, V> map)'' - adaugă intrările din obiectul MultiMapValue dat ca parametru în obiectul curent (this). | + | - **(1 puncte)** ''void addAll(MultiMapValue<K, V> map)'' - adaugă intrările din obiectul MultiMapValue dat ca parametru în obiectul curent (this). |
- **(0.5 puncte)** ''V getFirst(K key)'' - întoarce prima valoare asociată cheii (dacă nu există, se întoarce null). | - **(0.5 puncte)** ''V getFirst(K key)'' - întoarce prima valoare asociată cheii (dacă nu există, se întoarce null). | ||
- **(0.5 puncte)** ''List<V> getValues(K key)'' - se întoarce lista de valori asociată cheii. | - **(0.5 puncte)** ''List<V> getValues(K key)'' - se întoarce lista de valori asociată cheii. | ||
Line 272: | Line 281: | ||
- **(0.5 puncte)** ''List<V> remove(K key)'' - se șterge cheia, împreună cu valorile asociate ei, din MultiMapValue. | - **(0.5 puncte)** ''List<V> remove(K key)'' - se șterge cheia, împreună cu valorile asociate ei, din MultiMapValue. | ||
- **(0.5 puncte)** ''int size()'' - se întoarce mărimea MultiMapValue. | - **(0.5 puncte)** ''int size()'' - se întoarce mărimea MultiMapValue. | ||
- | - **(2 puncte)** implementați testele din schelet (sunt marcate cu TODO). | + | |
- | - **(4 puncte)** Să considerăm interfața ''Sumabil'', ce conține metoda ''void addValue(Sumabil value)''. Această metodă adună la valoarea curentă (stocată în instanța ce apelează metoda) o altă valoare, aflată într-o instanță cu același tip. Pornind de la această interfață, va trebui să: | + | - **(4 puncte)** Implementați o structură de date de tipul Tree<T> (Arbore binar de căutare) pe baza scheletului. Analizați modalitatea de utilizare a bounded wildcards, explicați necesitatea lor laborantului (fie în cadrul orei de laborator, fie la nivel de comentariu în cod). În schelet aveți următoarele metode de implementat: |
- | - definiți clasele ''MyVector3'' și ''MyMatrix'' (ce reprezintă un vector cu 3 coordonate și o matrice de dimensiune 4 x 4), ce implementează ''Sumabil''. | + | - **(1 puncte)** ''void addValue(T value)'' - adaugă o valoare în arborele binar de căutare. |
- | - scrieți o **metodă generică** ce primește o colecție generică cu elemente de tipul Sumabil și returnează suma tuturor elementelor din colecție. Trebuie să utilizați //bounded types//. Care trebuie să fie, deci, antetul metodei? | + | - **(0.5 puncte)** ''void addAll(List<T> values)'' - adaugă valorile dintr-o listă în arborele binar de căutare. |
- | - **(1 punct)** Copiați implementarea de la MultiMapValue în LambdaChecker și dați submit. | + | - **(1.5 puncte)** ''HashSet<T> getValues(T inf, T sup)'' - colectează valorile din arbore între o limită inferioară și superioară într-o colecție de tipul HashSet. |
+ | - **(0.5 puncte)** ''int size()'' - se întoarce numărul de elemente inserate în arbore. | ||
+ | - **(0.5 puncte)** ''boolean isEmpty()'' - se întoarce dacă există vreun element inserat în arborele binar sau nu. | ||
====Referinţe==== | ====Referinţe==== |