Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo:laboratoare:12 [2018/12/10 22:50]
carmen.odubasteanu [Probleme]
poo:laboratoare:12 [2021/01/11 17:57] (current)
carmen.odubasteanu
Line 1: Line 1:
 ===== Laboratorul 12. ===== ===== Laboratorul 12. =====
 +
  
 ==== Probleme ==== ==== Probleme ====
Line 6: Line 7:
 === 1) Singleton === === 1) Singleton ===
  
-Realizati o mini-aplicatie in care veti construi o clasa ShopSingleton folosind design pattern-ul Singleton. Clasa va avea urmatorii membrii:  +Realizati o aplicatie in care veti construi o clasa **ShopSingleton** folosind design pattern-ul ​**Singleton**. Clasa va avea urmatorii membrii:  
-name (String) +  ​* ​name (String) 
-products (o lista de produse) +  ​* ​products (o lista de produse) 
-In acest caz veti avea o clasa Product care descrie un produs, caracterizat prin pret, care va fi float si un nume, care va fi un String.  +In acest caz veti avea o clasa **Product** care descrie un produs, caracterizat prin pret, care va fi float si un nume, care va fi un String. ​ 
-In ShopSingleton va exista o metoda void numita showProducts,​ care va lista produsele din magazin. Veti avea o clasa Test, in care veti avea urmatoarele metode: addProduct(Product) - veti adauga un produs in magazin, removeProduct(Product) - eliminarea unui produs din magazin, getCheapestProduct() - va returna produsul cel mai ieftin din magazin.+ 
 +In **ShopSingleton** va exista o metoda void numita ​**//showProducts//**, care va afisa produsele din magazin. ​ 
 +Veti avea o clasa Test, in care veti avea implementate ​urmatoarele metode: ​ 
 +  * addProduct(Product) - veti adauga un produs in magazin, ​ 
 +  * removeProduct(Product) - eliminarea unui produs din magazin, ​ 
 +  * getCheapestProduct() - va returna produsul cel mai ieftin din magazin 
 +Si un main in care veti testa aceste metode.
  
 === 2) Factory === === 2) Factory ===
  
-Modificati exercitiul anterior astfel: clasa Product va fi abstracta si va fi extinsa de urmatoarele clase, care vor diferi printr-o metoda getPriceReduced de tip float, care va returna pretul redus al unui produs, depinzand de categoria acestuia: Book (15\%)Food (20\%)Beverage (5\%)Computer (10\%).  +Modificati exercitiul anterior astfel: clasa **Product** va fi abstracta si va fi extinsa de urmatoarele clase, care vor diferi printr-o metoda ​**getPriceReduced** de tip float, care va returna pretul redus al unui produs, depinzand de categoria acestuia: ​   
-Clasa prin care se vor crea obiectele de tip Product se va numi ProductFactory si va avea o metoda +  * Book (15\%) 
- ​factory(String type, String nameProduct,​ float productPrice) ​  +  * Food (20\%) 
-care va returna un obiect de tip Product, construit cu productName si productPrice,​ in functie de tipul de produs dorit de utilizator, specificat prin parametrul type.+  * Beverage (5\%) 
 +  * Computer (10\%).  
 +Clasa prin care se vor crea obiectele de tip **Product** se va numi **ProductFactory** si va avea o metoda 
 +** factory(String type, String nameProduct,​ float productPrice) ​**  
 +care va returna un obiect de tip **Product**, construit cu **productName** si **productPrice**, in functie de tipul de produs dorit de utilizator, specificat prin parametrul ​**type**.
  
 === 3) Observer === === 3) Observer ===
-Implementati un mini-sistem de notificare ​de utilizatori ​abonati la un canal Youtube. Veti implementa o clasa-subiect numita Channel, care va reprezenta un canal si o clasa-observator numita User, care va reprezenta un utilizator. Clasa Channel va contine o lista de utilizatori abonati la canalul respectiv, un membru de tip String ce va reprezenta numele canalului si urmatoarele metode: +Implementati un mini-sistem de notificare ​a utilizatorilor ​abonati la un canal Youtube. Veti implementa o clasa-subiect numita ​**Channel**, care va reprezenta un canal si o clasa-observator numita ​**User**, care va reprezenta un utilizator. 
-    ​- ​void subscribe (User user) - se va adauga un utilizator in lista de abonati +Clasa **Channel** va contine o lista de utilizatori abonati la canalul respectiv, un membru de tip String ce va reprezenta numele canalului si urmatoarele metode: 
-    ​- ​void unsubscribe (User user) - se va sterge un utilizator din lista de abonati +  ​* ​void subscribe (User user) - se va adauga un utilizator in lista de abonati 
-    ​- ​void notify (String notification) - se vor trimite o notificare (mesaj de tip String) tuturor utilizatorilor din lista de abonati (de exemplu ca s-a incarcat un nou videoclip pe canal)+  ​* ​void unsubscribe (User user) - se va sterge un utilizator din lista de abonati 
 +  ​* ​void notify (String notification) - se va trimite o notificare (mesaj de tip String) tuturor utilizatorilor din lista de abonati (de exemplu ca s-a incarcat un nou videoclip pe canal) 
 +Testati clasele implementate intr-un main.
  
 === 4) Strategy === === 4) Strategy ===
  
-Implementati un mini-sistem de calcul al pensiilor lunare in functie de anii de vechime si pe baza unui salariu lunar dat. Interfata Strategy, care va contine o metoda calcul(int aniVechime, float salariu)care returneaza un float. Veti avea de implementat clasele: +Implementati un mini-sistem de calcul al pensiilor lunare in functie de anii de vechime si pe baza unui salariu lunar dat. Interfata ​**Strategy** va contine o metoda ​**calcul(int aniVechime, float salariu)** care returneaza un float. Veti avea de implementat clasele: 
-    ​- ​TwentyStrategy,​ care calculeaza pensia dupa formula aniVechime / 20 * salariu +  ​* ​TwentyStrategy,​ care calculeaza pensia dupa formula aniVechime / 20 * salariu 
-    ​- ​ThirtyStrategy,​ cu pensia calculata dupa formula aniVechime / 30 * salariu  +  ​* ​ThirtyStrategy,​ cu pensia calculata dupa formula aniVechime / 30 * salariu  
-    ​- ​FortyStrategy,​ cu pensia calculata ca aniVechime / 40 * salariu.+  ​* ​FortyStrategy,​ cu pensia calculata ca aniVechime / 40 * salariu.
 Creati o clasa numita Pensionar, care contine trei membri (int aniVechime, float salariu si Strategy strategy) si o metoda de tip float getPensie(),​ care va returna pensia calculata folosind strategiile enuntate anterior in urmatorul fel: Creati o clasa numita Pensionar, care contine trei membri (int aniVechime, float salariu si Strategy strategy) si o metoda de tip float getPensie(),​ care va returna pensia calculata folosind strategiile enuntate anterior in urmatorul fel:
-    - daca 20 <= aniVechime < 30, atunci se va folosi TwentyStrategy +  * daca 20 <= aniVechime < 30, atunci se va folosi TwentyStrategy 
-    ​- ​daca 30 <= aniVechime < 40, atunci se va folosi ThirtyStrategy +  ​* ​daca 30 <= aniVechime < 40, atunci se va folosi ThirtyStrategy 
-    ​- ​daca 40 <= aniVechime, atunci se va folosi FortyStrategy+  ​* ​daca 40 <= aniVechime, atunci se va folosi FortyStrategy 
 +Testati functionarea sistemului intr-un main.
  
 === 5) Visitor === === 5) Visitor ===
  
-Pornind de la exemplul prezentat in breviar la Visitor, implementati comenzile ls si cat pentru fisiere (clasele Ls si Cat). Clasele Fisier si Director mostenesc o clasa abstracta Repository, care este de tip Visitable, iar clasa Director contine o lista de Repository-uri,​ care reprezinta fisierele si folderele din folderul respectiv.  +Pornind de la exemplul prezentat in breviar la Visitor, implementati comenzile ls si cat pentru fisiere (clasele ​**Ls** si **Cat**).  
-Clasa Director va contine o metoda de tip void addChild(Repository rep), care va adauga un Repository in lista de Repository-uri din folder (aici puteti sa va folositi de clasa File, mai precis de una dintre metodele list(), care returneaza un array de String-uri de nume de fisiere si foldere din folderul curent, sau listFiles(),​ care returneaza o lista de obiecte de tip File (fisiere si foldere). + 
-In clasa Cat, la visit(Fisier), ​va veti folosi ​de citirea din fisiere pentru a afisa continutul unui fisier.+Clasele ​**Fisier** si **Director** mostenesc o clasa abstracta ​**Repository**, care este de tip **Visitable**, iar clasa **Director** contine o lista de **Repository**-uri, care reprezinta fisierele si folderele din folderul respectiv. ​ 
 + 
 +Clasa **Director** va contine o metoda de tip void **addChild**(Repository rep), care va adauga un Repository in lista de Repository-uri din folder (aici puteti sa va folositi de clasa **File**, mai precis de una dintre metodele list(), care returneaza un array de String-uri de nume de fisiere si foldere din folderul curent, sau listFiles(),​ care returneaza o lista de obiecte de tip File (fisiere si foldere). 
 + 
 +In clasa **Cat**, la visit(Fisier),​ veti folosi citirea din fisiere pentru a afisa continutul unui fisier. 
  
-<​hidden><​HTML>​+<​hidden>​ 
 +<​HTML>​
   <iframe src="​https://​ocw.cs.pub.ro/​courses/​_media/​poo/​laboratoare/​lab12_var_final.pdf"​ width="​640"​ height="​720"></​iframe>​   <iframe src="​https://​ocw.cs.pub.ro/​courses/​_media/​poo/​laboratoare/​lab12_var_final.pdf"​ width="​640"​ height="​720"></​iframe>​
 </​HTML>​ </​HTML>​
  
 +<​html>​
 +  <iframe src="​https://​ocw.cs.pub.ro/​courses/​_media/​poo/​laboratoare/​poo_lab12_v1.pdf"​ width="​640"​ height="​720"></​iframe>​
 +</​html>​
 +</​hidden>​
  
 +<​hidden>​
 {{:​poo:​laboratoare:​laborator12_schelet.zip|Schelet de laborator}} {{:​poo:​laboratoare:​laborator12_schelet.zip|Schelet de laborator}}
  
 Scopul vostru este să dezvoltați o aplicație care ajută elevii din clasa a 3-a să rezolve expresii artimetice. Aplicația voastră va primi ca input un String ce conține o expresie și va arăta elevului pas cu pas cum se rezolvă expresia. Această aplicație se va numi "​Arithmo"​. Formatul expresiilor de input va fi: **(operand operator operand)** unde operatorul poate fi ''​*,/,​-,​+''​ iar operanzii pot fi valori numerice sau alte expresii. Un posibl input poate fi ''​(2 + ( (9 / 3) * ( (5 * 2) - (6 * 1))))''​. Evolutia expresiei va fi: ''​(2 + (3 * (10 - 6))) -> (2 + (3 * 4)) -> (2 + 12) -> 14''​.</​hidden>​ Scopul vostru este să dezvoltați o aplicație care ajută elevii din clasa a 3-a să rezolve expresii artimetice. Aplicația voastră va primi ca input un String ce conține o expresie și va arăta elevului pas cu pas cum se rezolvă expresia. Această aplicație se va numi "​Arithmo"​. Formatul expresiilor de input va fi: **(operand operator operand)** unde operatorul poate fi ''​*,/,​-,​+''​ iar operanzii pot fi valori numerice sau alte expresii. Un posibl input poate fi ''​(2 + ( (9 / 3) * ( (5 * 2) - (6 * 1))))''​. Evolutia expresiei va fi: ''​(2 + (3 * (10 - 6))) -> (2 + (3 * 4)) -> (2 + 12) -> 14''​.</​hidden>​
poo/laboratoare/12.1544475036.txt.gz · Last modified: 2018/12/10 22:50 by carmen.odubasteanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0