Laboratorul 13.

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)

In constructorul fiecarui topping, respectiv in constructorul BasicIceCream se va afisa un mesaj prin care se specifica ce se adauga.

Preturi: basicIceCream 0.5, ciocolata 1.5, vanilie 2.

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).

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!

Pentru a putea adauga topping-uri avem nevoie de un con!

Exemplu output:

Adding cone
Adding choco
Adding vanilla
Ingrediente: cone, chocolate, vanilla
Cost: 4.0

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.

FileReader in = new FileReader(new File("test02.in"));
StreamTokenizer str = new StreamTokenizer(in);

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.

Arhiva laborator

poo/laboratoare/14.txt · Last modified: 2022/12/22 20:23 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