This shows you the differences between two versions of the page.
|
poo:laboratoare:12 [2018/12/10 22:59] carmen.odubasteanu |
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 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. | + | In **ShopSingleton** va exista o metoda void numita **//showProducts//**, care va afisa produsele din magazin. |
| - | Veti avea o clasa Test, in care veti avea urmatoarele metode: | + | Veti avea o clasa Test, in care veti avea implementate urmatoarele metode: |
| * addProduct(Product) - veti adauga un produs in magazin, | * addProduct(Product) - veti adauga un produs in magazin, | ||
| * removeProduct(Product) - eliminarea unui produs din magazin, | * removeProduct(Product) - eliminarea unui produs din magazin, | ||
| - | * getCheapestProduct() - va returna produsul cel mai ieftin din magazin. | + | * getCheapestProduct() - va returna produsul cel mai ieftin din magazin |
| + | Si un main in care veti testa aceste metode. | ||
| === 2) Factory === | === 2) Factory === | ||
| Line 29: | Line 31: | ||
| === 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. | + | 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. |
| 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: | 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 subscribe (User user) - se va adauga un utilizator in lista de abonati | * void subscribe (User user) - se va adauga un utilizator in lista de abonati | ||
| * void unsubscribe (User user) - se va sterge un utilizator din lista de abonati | * void unsubscribe (User user) - se va sterge un utilizator din 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 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 | ||
| Line 45: | Line 48: | ||
| * 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**). |
| + | |||
| + | 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). | 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. | 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> | ||