Differences

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

Link to this comparison view

poo:laboratoare:13 [2021/01/17 19:06]
carmen.odubasteanu
poo:laboratoare:13 [2026/01/12 08:46] (current)
george.tudor1906
Line 1: Line 1:
-===== Laboratorul 13. ===== 
  
-=== Problema 1 - Singleton  ​===+===== Laboratorul 13 – Fluxuri I/O. Funcționale =====
  
-Implementați o clasa **Catalog** care conține o lista cu obiecte de tip **Course**.  +{{:​poo:​laboratoare:​arhiva_13.zip|Arhiva laborator}}
-Va trebui sa va asigurați ca pentru aceasta clasa va putea exista o singura instanța care sa poata fi accesata din orice clasa a proiectului. Implementati metoda **toString** pentru clasa **Catalog**.+
  
-<code java> +=== Problema 1 ===
-public class Catalog { +
-       // TODO -- Adaugati aici implementarea exercitiului +
-+
-public class Course { +
-+
-</​code>​+
  
-=== Problema 2 - Factory === +Să se scrie un program pentru afișarea pe ecran a liniilor aflate pe poziții impare 
-Pornind ​de la clasa abstracta **User**, definiți clasele **Student**,​ **Parent**, **Assistant** ​și **Teacher** care vor moșteni clasa **User**:+dintr-un fișier text. Fiecare linie va fi precedată ​de numărul ei și un spațiu.
  
-<code java> +În implementarese va folosi un obiect de tip **LineNumberReader**.
-public abstract class User { +
-  private String firstNamelastName; +
-  public User(String firstName, String lastName) { +
-    this.firstName = firstName;​ +
-    this.lastName = lastName; +
-  } +
-  public String toString() { +
-    return firstName + " " + lastName; +
-  } +
-+
-</​code>​+
  
-Pentru a putea realiza o instanțiere ușoara a obiectelor pentru aceste tipuri de clase, veți implementa o clasa **UserFactory** ​care va avea o metoda __statica__ ​**createUser** ce va returna un obiect de tip **User** (se va folosi șablonul de proiectare **Factory**).+Cerințe: 
 +  * Tratați toate excepțiile ​care ar putea să apară exact acolo unde apar! 
 +  ​Atenție la închiderea fișierelor – să se facă chiar dacă apare excepție la citire!
  
-Pentru ​testare folositi clasa **Test** de mai jos, in care veti comenta cerintele neimplementate inca:+Pentru ​validarea acestei cerințeputeți folosi fișierul text //test01.in// pus la 
 +dispoziție în arhiva laboratorului.
  
-<code java> +=== Problema ​2 ===
-class Test { +
-    public static void main(String[] args) { +
-        //testare exercitiu ​2 +
-        User studentA ​UserFactory.createUser("​Student",​ "​A",​ "​Popescu"​);​ +
-        User studentB ​UserFactory.createUser("​Student",​ "​B",​ "​Ionescu"​);​ +
-        User studentC ​UserFactory.createUser("​Student",​ "​C",​ "​Ionescu"​);​+
  
-        User mother = UserFactory.createUser("​Parent",​ "​MAC",​ "​Ionescu"​);​ +Să se scrie un program care citește un text de la tastatură și îl salvează într-un 
-        User father = UserFactory.createUser("​Parent",​ "​MAC",​ "​Ionescu"​);​ +fișier pe discCitirea se va face până la introducerea cuvântului **exit**.
-        +
-        User teacher = UserFactory.createUser("​Teacher",​ "​Teacher",​ "​Georgescu"​);​ +
-        User assistant = UserFactory.createUser("​Assistant",​ "​Assistant",​ "​Popescu"​);​ +
-         +
-        //testare exercitiu 3+5 +
-        Course course = new Course.CourseBuilder("​POO"​).teacher((Teacher) teacher) +
-       ​.assistant((Assistant) assistant).grade(new Grade("​POO",​ (Student) studentA, 4d,5d)) +
-       ​.grade(new Grade("​POO",​ (Student) studentB,​3d,​3d)).strategy(new BestExamScore()).build();​ +
-         +
-        System.out.println("​Curs:​ "+ course); +
-        System.out.println("​Best Student:"​ + course.getBestStudent());​ +
-         +
-        //testare exercitiu 1+3+5 +
-        Catalog catalog = Catalog.getInstance();​ +
-        catalog.addCourse(course);​ +
-          +
-        //testare exercitiu 4 +
-        ((Student) studentB).setMother((Parent) mother); +
-        ((Student) studentB).setFather((Parent) father); +
-        ((Student) studentC).setMother((Parent) mother);+
  
-        catalog.addObserver((Parentmother); +În implementare se va utiliza metoda **readLine()** pentru un obiect de tip 
-        ​catalog.addObserver((Parent) father); +**DataInputStream** sau **BufferedReader**
-        catalog.notifyObservers(new Grade("​POO",​ (Student)studentB,​2.5d,​3d));​ + 
-         +Tratați toate excepțiile care ar putea să apară!
-        //testare exercitiu 6 +
-        HashMap<​Teacher,​ ArrayList<​Pair<​Student,​ String, Double>>>​ examScores=new HashMap<>​();​ +
-        ArrayList<​Pair<​Student,​ String, Double>>​ ar1=new ArrayList<>​();​ +
-        ar1.add(new Pair(studentA,"​POO",​3.6d));​ +
-        examScores.put((Teacher)teacher,​ar1);​ +
-         +
-        HashMap<​Assistant,​ ArrayList<​Pair<​Student,​ String, Double>>>​ partialScores= new HashMap<>​();​ +
-        ArrayList<​Pair<​Student,​ String, Double>>​ ar2=new ArrayList<>​();​ +
-        ar2.add(new Pair(studentC,"​POO",​4.6d));​ +
-        partialScores.put((Assistant)assistant,​ar2);​ +
-     +
-       ​Visitor v=new ScoreVisitor(examScores,​partialScores);​ +
-        +
-        v.visit((Teacher)teacher);​ +
-        System.out.println("​Actualizare teacher:"​ + catalog); +
-                 +
-        v.visit((Assistant)assistant);​ +
-        System.out.println("​Actualizare assistant:"​ + catalog); +
-        +
-    } +
-} +
-</​code>​+
  
 === Problema 3 === === Problema 3 ===
  
-=== Problema 4 ===+Să se implementeze un program care citește din fișierul //​test02.in//​ un text și 
 +determină numărul de cuvinte din text.
  
-=== Problema 5 ===+Pentru citire se vor utiliza un obiect de tip **FileReader** și unul de tip **StreamTokenizer**.
  
 <code java> <code java>
Line 103: Line 40:
 </​code>​ </​code>​
  
-{{:poo:laboratoare:​arhiva_13.zip|Arhiva laborator}}+=== Problema 4 – Funcționale === 
 + 
 +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ă. 
 + 
 +Veți porni implementarea de la clasa **ListUtil**,​ pusă la dispoziție în arhiva laboratorului.
  
poo/laboratoare/13.1610903203.txt.gz · Last modified: 2021/01/17 19:06 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