Administrativ
Laboratoare
Tema
Teste
Resurse utile
Alte resurse
Arhiva Teme
Administrativ
Laboratoare
Tema
Teste
Resurse utile
Alte resurse
Arhiva Teme
Această pagină cuprinde exerciții care au fost taskuri de laborator și acum înlocuite cu altele.
Puteți folosi aceste exerciții pentru a vă exersa noțiunile învățate la curs și la laboratoare.
ComplexNumber
.ComplexNumber.java
. Aceasta va avea două campuri: re
si im
, ambele de tip float
.Operations.java
. Această clasă va implementa operațiile de adunare și înmulțire pentru numere complexe. Definiți în clasă Operations
câte o metodă pentru fiecare operație; Bookstore
.Book.java
cu următoarele atribute: title
, author
, publisher
, pageCount
.BookstoreTest.java
, pentru a testa viitoarele funcționalități ale bibliotecii. Completați această clasă, așa cum considerați necesar. Apoi, creați un obiect de tip carte și setați atributele introducând date de la tastatură. Pentru această folosiți clasa Scanner
:BookstoreCheck
, ce va conține două metode, cu câte 2 parametri de tipul Book
. String
BOOK_TITLE: [insert_book_title] BOOK_AUTHOR: [insert_book_author] BOOK_PUBLISHER: [insert_book_publisher]
Cu următoarele precizări:
add(float value)
, care adaugă valoarea value
la finalul vectorului. Dacă se depăşeşte capacitatea vectorului, acesta se va redimensiona la o capacitate dublăcontains(float value)
care returnează true
dacă value
există în cadrul vectoruluiremove(int index)
care elimină valoarea aflată în vector la poziţia specificată de index
(numerotarea incepând de la 0); se va da un mesaj dacă indexul este invalidget(int index)
care va returna elementul aflat în poziţia index
size()
care returnează numarul de elemente din vectorpublic String toString()
care va returna o reprezentare a tuturor valorilor vectorului ca un şir de caractereObject
se află în rădăcina arborelui de moștenire pentru orice clasă, orice clasă va avea acces la o serie de facilități oferite de Object
. Una dintre ele este metoda toString()
, al cărei scop este de a oferi o reprezentare a unei instanțe de clasă sub forma unui șir de caractere. Form
cu un membru color
de tip String
, o metoda getArea()
care pentru început va intoarce 0 și o metodă toString()
care va returna acestă culoare. Triangle
și Circle
: Triangle
va avea 2 membri height
si base
de tip float
. Circle
va avea membrul radius
de tip float
. Triangle
și Circle
, și apelați metoda toString()
pentru fiecare instanță.getArea()
pentru a intoarce aria specifica figuri geometrice.toString()
în cele două clase derivate, care să returneze tipul obiectului, culoarea si aria. De exemplu: Triangle
, se va afișa: “Triunghi: rosu 10” Circle
, se va afișa: “Cerc: verde 12.56”toString()
din clasele derivate astfel încât aceasta să utilizeze implementarea metodei toString()
din clasa de bază. equals
în clasa Triangle
. Justificați criteriul de echivalentă ales. equals
, a cărei implementare verifică echivalența obiectelor comparând referințele.Form
și populați-l cu obiecte de tip Triangle
și Circle
(upcasting). toString()
pentru elementele sale. Ce observați? Triangle
metoda printTriangleDimensions
și clasei Circle
metoda printCircleDimensions
. Implementarea metodelor constă în afișarea bazei si inaltimii respectiv razei. printTriangleDimensions
pentru Triangle
și printCircleDimensions
pentru Circle
). Pentru a stabili tipul obiectului curent folosiți operatorul instanceof
. Triangle
. Ce observați? instanceof
deloc.QueueAggregation
și QueueInheritance
pe baza clasei Array
furnizate de noi, utilizând, pe rând, ambele abordări: moștenire și agregare. Precizări: int
. QueueAggregation
și QueueInheritance
trebuie să ofere metodele enqueue
și dequeue
, specifice acestei structuri de date. Array
reprezintă un wrapper pentru lucrul cu vectori. Metoda get(pos)
întoarce valoarea din vector de la poziția pos
, în timp ce metoda set(pos, val)
atribuie poziției pos
din vector valoarea val
. Noutatea constă în verificarea poziției furnizate. În cazul în care aceasta nu se încadrează în intervalul valid de indici, ambele metode întorc constanta ERROR
definită în clasa. main
definită în clasa Array
conține exemple de utilizare a acestei clase. Experimentați! enqueue
va oferi posibilitatea introducerii unui număr întreg în capătul cozii (dacă aceasta nu este deja plină), în timp ce metoda dequeue
va înlătura elementul din vârful cozii și îl va întoarce (dacă coada nu este goală). În caz de insucces (coada plină la enqueue
, respectiv goală la dequeue
), ambele metode vor întoarce constanta ERROR
.ERROR
? (Hint: Dacă în coadă am un element egal cu valoarea constantei ERROR
?) Gândiți-vă la o rezolvare.get
și set
, în clasele QueueAggregation
și QueueInheritance
, în varianta ce utilizează moștenire? Ce problemă indică răspunsul? Furnizați o soluție la această problemă.
1. (2p) Implementaţi interfaţa Task
(din pachetul first
) în cele 3 moduri de mai jos.
OutTask.java
)RandomOutTask.java
)CounterOutTask.java
).Notă: Acesta este un exemplu simplu pentru Command Pattern
2. (3p) Interfaţa Container
(din pachetul second
) specifică interfaţa comună pentru colecţii de obiecte Task, în care se pot adăuga și din care se pot elimina elemente. Creaţi două tipuri de containere care implementează această clasă: 1. (1.5p) Stack
- care implementează o strategie de tip LIFO
2. (1.5p) Queue
- care implementează o strategie de tip FIFO
Evitaţi codul similar în locuri diferite!
Hint: Puteţi reţine intern colecţia de obiecte, utilizând clasa ArrayList din SDK-ul Java. Iată un exemplu de iniţializare pentru șiruri:
ArrayList<String> list = new ArrayList<String>();
3. (2p) Implementaţi interfaţa IFactory
(clasa ContainerFactory
, din pachetul third
) care conţine o metodă ce primește ca parametru o strategie (enum Strategy
) și care întoarce un container asociat acelei strategii. Din acest punct înainte, în programul vostru veţi crea containere folosind doar această clasă (nu puteţi crea direct obiecte de tip Stack sau Queue). Evitaţi instanţierea clasei Factory implementate de voi la fiecare creare a unui container! Notă:Acest mod de a crea obiecte de tip Container elimină problema care apare în momentul în care decidem să folosim o implementare diferită pentru un anumit tip de strategie și nu vrem să facem modificări și în restul programului. De asemenea o astfel de abordare este utilă când avem implementări care urmăresc scopuri diferite (putem avea un Factory care să creeze containere optimizate pentru viteză sau un Factory cu containere ce folosesc minimum de memorie). șablonul acesta de programare poartă denumirea de Factory Method Pattern.
4. (3p) Extindeţi clasa AbstractTaskRunner
(din pachetul fourth
) în 3 moduri:
PrintTimeTaskRunner
- care afișează un mesaj după execuţia unui task în care se specifică ora la care s-a executat task-ul (vedeți clasa Calendar).CounterTaskRunner
- incrementează un contor local care ţine minte câte task-uri s-au executat.RedoBackTaskRunner
- salvează fiecare task executat într-un container în ordinea inversă a execuţiei și are o metodă prin care se permite reexecutarea task-urilor.Schelet: lab4_schelet_2018.zip
Implementați un terminal bash simplu pornind de la scheletul de cod. Comenzile pe care va știi să le execute sunt: echo, cd, ls și history. Bash-ul va citi comenzi de la tastatură până când va primi comanda exit când se va închide (programul se termină).
1. (1.5p) Din clasa Bash vom publica comenzile prin interfața CommandPublisher. În acest sens în clasa Bash vom crea o clasă internă BashCommandPublisher ce implementează interfața CommandPublisher.
2. (1p) Un obiect de tipul Bash va avea:
3. (2p) În metoda start din Bash vom citi de la tastatură comenzi pe câte o linie folosind Scanner.
Thread t = new Thread() { public void run() { // Do some work } }; t.start();
4. (1p) Implementați comanda echo ca o clasă internă în BashUtils.
5. (1.5p) Implementați comanda cd care schimbă directorul curent.
6. (2p) Implementați comanda ls care afișează conținutul directorului curent currentDirectory
File folder = currentDirectory.toFile();
7. (1p) Implementați comanda history care afișează la consolă conținutul membrului StringBuffer history din Bash.
>history History is: ls | | cd .idea | ls | history |
accept
din Manager, rulați și explicați rezultatul execuției.java.nio
toate fișierele cu extensia “.class” dintr-un director. String
-uri şi va fi parametrizatǎ.Student
.nume
(de tip String
) şi medie
(de tip float
)toString
.Student
. Testaţi prin adǎugare de elemente duplicate, având aceleaşi valori pentru toate câmpurile, instanţiindu-le, de fiecare datǎ, cu new
. Ce observaţi?Student
suprascrieți metoda equals
astfel încât să se ţină cont de câmpurile clasei, şi încercaţi din nou. Ce observaţi?Student
, metoda equals
, cu o variantǎ care primeşte un parametru Student
, şi care întoarce întotdeauna false
.Student
şi iteraţi prin această colecţie, afişând la fiecare pas element.equals(element)
şi ((Object)element).equals(element)
(unde element
este numele de variabilă ales pentru fiecare element al colecţiei). Cum explicaţi comportamentul observat? Dacă folosiţi un iterator, acesta va fi şi el parametrizat.Gradebook
, de tip Map
, pentru reţinerea studenţilor dupǎ medie: cheile sunt mediile și valorile sunt liste de studenți. Gradebook va menţine cheile ordonate descrescǎtor. Extindeţi o implementare potrivitǎ a interfeţei Map
, care sǎ permitǎ acest lucru.List
) care va reţine toţi studenţii cu media rotunjitǎ egalǎ cu cheia. Considerǎm cǎ un student are media rotunjitǎ 8 dacǎ media sa este în intervalul [7.50, 8.49].Comparator
în constructor și îl va da mai departe constructorului clasei moștenite.add(Student)
, ce va adǎuga un student în lista corespunzǎtoare mediei lui. Dacǎ, în prealabil, nu mai existǎ niciun student cu media respectivǎ (rotunjitǎ), atunci lista va fi creatǎ la cerere.HashSet<Integer>
.add
şi addAll
. Pentru adǎugarea efectivǎ a elementelor, folosiţi implementǎrile din clasa pǎrinte (HashSet
).add
cât şi addAll
. Ce observaţi? Corectaţi dacǎ este cazul.LinkedList<Integer>
. Ce observaţi? Ce concluzii trageţi?finally
chiar şi în cazul unui return
din metoda.Exercițiile din această secțiune și din urmatoarea au ca temă comună realizarea unui joc controlat din consolă. Jocul constă dintr-o lume (aka hartă) în care se plimbă eroi de trei tipuri, colectează comori și se bat cu monștri. În acestă secțiune trebuie să implementați o parte din funcționalitățile jocului folosind patternurile Singleton, Factory și Observer, urmând ca în secțiunea următoare să terminați implementarea.
Schelet: Schelet
Detalii joc:
World
.Hero
și sunt de trei tipuri: Mage, Warrior, Priest.move
- se mută într-o zonă învecinatăattack
(de implementat în laboratorul următor)collect
- eroul ia comoara găsită în zona în care se aflăMain
.Hero
pentru fiecare tip de erou.toString
din Object
pentru fiecare erouattack
- deocamdată nu va omorî pe nimeni - puteți afișa ceva la consolăTreasureFactory
și HeroFactory
. Trebuie să implementăm două metode: createTreasure
în TreasureFactory
și o metodă de creare de eroi în HeroFactory
, fie ea createHero
.HeroFactory.createHero
, pasați ca parametru un Hero.Type
și un String
cu numele eroului și întoarceți un subtip de Hero
potrivit pentru tipul de erou.populateTreasures
din World
. Folosiți-vă de membrii map
și treasures
din World
. Trebuie să marcați pe hartă că aveți o comoară și să adăugați obiectul-comoară în lista de comori.add
din metoda main
. Trebuie să adăugați eroi acolo. Folosiți HeroFactory.createHero
.Observer
și Observable
în clasele potrivite.World
. Cazul start
din metoda main
.World
când eroii execută o acțiune. Aveți două TODO
-uri în clasa Hero
.World
trebuie să fie observabilă și să notifice pe observatorii săi atunci când a început jocul și când se schimbă ceva (e.g. s-a mutat un erou).
Această secțiune și cea precedentă au ca temă comună a exercițiilor realizarea unui joc controlat din consolă. Jocul constă dintr-o lume (aka hartă) în care se plimbă eroi de trei tipuri, colectează comori și se bat cu monștrii. În acestă secțiune terminam jocul inceput in cea precedenă folosind pattern-urile Strategy și Command.
Detalii joc:
GameState
.Hero
și sunt de trei tipuri: Mage, Warrior, Priest.move
- se mută într-o zonă învecinatăattack
- ataca un monstru cand se afla pe aceeasi pozitie cu elcollect
- eroul ia comoara găsită în zona în care se aflăMain
.move
.MoveCommand
care implementeaza interfata Command
. Urmariti TODO-urile din aceasta clasa. CommandManager
care va tine evidenta comenzilor si ordinea lor. Obstacle
precum si un ObstacleObserver
Can't move there !
si se va apela automat undo pe ultima comanda de move pentru a reveni in pozitia anterioara coliziunii. Acest feature de wall collision va fi implementat in ObstacleObserver