Differences

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

Link to this comparison view

poo:laboratoare:14 [2019/01/14 11:45]
carmen.odubasteanu [Aplicatie Design Patterns]
poo:laboratoare:14 [2022/12/22 20:23] (current)
carmen.odubasteanu
Line 1: Line 1:
-===== Laboratorul ​14. =====+===== Laboratorul ​13. =====
  
-==== Aplicatie Design Patterns ====+=== Problema 1 === 
 +Pornind de la diagrama data, implementati clasele si interfetele din diagrama si cele care mai sunt necesare pentru a putea  apoi sa construiti un obiect de tip **//​IceCream//​** ce contine doua toppinguri: **//​Chocolate//​** si **//​Vanilla//​**. Afisati pretul si descrierea acestei inghetate (design pattern-ul Decorator)
  
-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+In constructorul fiecarui topping, respectiv in constructorul **//​BasicIceCream//​** se va afisa un mesaj prin care se specifica ​ce se adauga.
  
-Un posibl input poate fi ''​(2 + ( (9 / 3) * ( (* 2) - (6 * 1))))''​+Preturi: basicIceCream 0.5, ciocolata ​1.5, vanilie 2.
  
-Evolutia expresiei va fi''​(2 + (* (10 6))) -> (2 + (3 4)-> (12-> 14''​.+Descriere metode: 
 +  * **getDescription()**: returneaza elementele componente ale inghetatei pana acum(adica lista tuturor componentelor adaugate anterior plus topping-ul curent)
 +  ​**getPrice()**: returneaza costul curent al inghetatei(suma tuturor elementelor adaugate anterior ​costul toppingului curent).
  
-<iframe src="​https://​ocw.cs.pub.ro/​courses/​_media/​poo/laboratoare/​lab12_var_final.pdf" width="​640"​ height="​720"></​iframe>​+{{:poo:laboratoare:uml.png?600|}}
  
-{{:​poo:​laboratoare:​lab12_var_final.pdf|}} 
  
-{{:​poo:​laboratoare:​laborator12_schelet.zip|Schelet de laborator}}+<note important>​Pentru a putea adauga functionalitate (in cazul de fata un topping) unui obiect, vom avea nevoie de o referinta catre obiectul respectiv in decorator.  
 +Un con (obiect de tipul BasicIceCream) fara topping este considerat tot o inghetata!</​note>​ 
 +<note warning>​ 
 +Pentru a putea adauga topping-uri avem nevoie de un con! 
 +</​note>​ 
 +//**Exemplu output:​**//​ 
 +<​code>​ 
 +Adding cone 
 +Adding choco 
 +Adding vanilla 
 +Ingrediente:​ cone, chocolate, vanilla 
 +Cost: 4.0 
 +</​code>​ 
 + 
 +=== Problema 2 === 
 +Sa se scrie un program pentru afisarea pe ecran a liniilor aflate pe pozitii impare dintr-un fisier text. Fiecare linie va fi precedata de numarul ei si un spatiu. In implementare,​ se va folosi un obiect de tip //​**LineNumberReader**//​. Tratati toate exceptiile care ar putea sa apara exact acolo unde apar! Atentie la inchiderea fisierelor – sa se faca chiar daca apare exceptie la citire! 
 + 
 +Pentru validarea acestei cerinte, puteti folosi fisierul text //​test01.in//​ pus la dispozitie in arhiva laboratorului. 
 + 
 +=== Problema 3 === 
 +Sa se scrie un program care citeste un text de la tastura si il salveaza intr-un fisier pe disc. Citirea se va face pana la introducerea cuvantului //​**exit**//​. In implementare se va uzita metoda //​**readLine()**//​ pentru un obiect de tip //​**DataInputStream**//​ sau //​**BufferedReader**//​. Tratati toate exceptiile care ar putea sa apara! 
 + 
 +=== Problema 4 === 
 +Sa se implementeze un program care citeste din fisierul //​test02.in//​ un text si determina numarul de cuvinte din text. Pentru citire se vor utiliza un obiect de tip //​**FileReader**//​ si unul de tip //​**StreamTokenizer**//​. 
 +<code java> 
 +FileReader in = new FileReader(new File("​test02.in"​));​ 
 +StreamTokenizer str = new StreamTokenizer(in);​ 
 +</​code>​ 
 + 
 +=== Problema 5 === 
 +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}} 
poo/laboratoare/14.1547459114.txt.gz · Last modified: 2019/01/14 11:45 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