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. StringBOOK_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 indexsize() 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 ObstacleObserverCan'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