Differences

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

Link to this comparison view

poo:laboratoare:03 [2017/10/30 20:59]
127.0.0.1 external edit
poo:laboratoare:03 [2020/10/20 11:33] (current)
carmen.odubasteanu [Problema 1]
Line 1: Line 1:
 ===== Laboratorul 03. ===== ===== Laboratorul 03. =====
  
 +====Problema 1====
 +Definiți o clasă **//​Fractie//​** care modelează lucrul cu fracțiile. Membrii acestei clase sunt:
 +  * două atribuite de tip **//int//** pentru numărătorul fracției, respectiv numitorul ei;
 +  * constructorul cu doi parametri de tip //​**int**//,​ pentru setarea celor două parți ale fracției (numărător și numitor);
 +  * un constructor fără parametri care apelează constructorul anterior;
 +  * o metodă, cu un **singur** parametru, de calcul a sumei a două fracții;
 +  * o metodă **//​toString//​** uzitată pentru afișarea pe ecran a valorii fracției;
 +  * o metodă **//​equals//​**,​ cu un parametru de tip **//​Object//​**,​ care va returna **//​true//​** dacă fracțiile sunt egale, respectiv **//​false//​** în sens contrar;
 +  * o metodă **//​main//​** pentru testarea funcționalității clasei.
  
 +<note important>​Consultați exemplul prezentat la curs pentru numere complexe!</​note>​
 +
 +
 +
 +
 +====Problema 2====
 +Un produs este caracterizat prin nume (**//​String//​**),​ preț (//​**double**//​) și cantitate (**//​int//​**).
 +Un magazin are un nume (//​**String**//​) și conține 3 produse. ​
 +Creați clasele **//​Produs//​** și //​**Magazin**//​ corespunzătoare specificațiilor de mai sus. În fiecare clasă, implementați constructorul potrivit, astfel încât caracteristicile instanțelor să fie setate la crearea acestora.
 +Clasa //​**Produs**//​ conține o metodă //​**toString**//,​ care va returna un //​**String**//​ sub forma **"​Produs <​nume_produs>​ <​preț_produs>​ <​cantitate>"​** și o metodă **//​getTotalProdus//​** care va returna un **//​double//​**,​ produsul dintre cantitate și preț. Clasa //​**Magazin**//​ conține o metodă //​**toString**//​ care va returna String-ul corespondent tuturor componentelor magazinului și o metodă //​**getTotalMagazin**//​ care va calcula suma totalurilor produselor și o va returna. ​
 +Creați, într-o metodă //​**main**//,​ un obiect de tip //​**Magazin**//,​ uzitând obiecte anonime în cadrul instanțierii.
 +
 +<note tip>
 +<code java>
 +Patrat p = new Patrat(new Point(0, 0), new Dimension(5,​ 5));
 +</​code>​
 +</​note>​
 +
 +====Problema 3====
 +Să se definească o clasă **//​MyQueue//​** care să descrie o structură de date de tip coadă.
 +Datele clasei (private):
 +  * un obiect de tip **//​MyArray//​** (clasa inclusă în arhiva laboratorului);​
 +  * o constantă (//​**Infinit**//​) având valoarea $9500$;
 +  * indicele primului element din coadă;
 +  * indicele ultimului element din coadă;
 +  * numărul de elemente din coada.
 +
 +Constructorul clasei:
 +  * constructor fără parametri care se ocupă de inițializările membrilor.
 +
 +Metodele clasei:
 +  * **//int getSize()//​** = are ca rezultat numărul de elemente din coadă;
 +  * **//void enqueue(int value)//** = adaugă o valoare în coadă;
 +  * **//int dequeue()//​** = întoarce primul element din coadă și îl elimină, incrementând indicele corespunzător,​ fără a elimina efectiv elementul din obiectul de tip **//​MyArray//​** (//​**Infinit**//​ - coada vidă);
 +  * **//boolean isEmpty()//​** = verifică dacă este vidă coada;
 +  * **//String toString()//​** = String cu elementele din structura de date.
 +
 +Pentru verificare, se va folosi clasa de mai jos.
 +
 +<code java>
 +class MyArray {
 +    private int v[];
 +    private int size;
 +    ​
 +    public MyArray() {
 +        this(100);
 +    }
 +    ​
 +    public MyArray(int length) {
 +        size = 0;
 +        v = new int[length];​
 +    }
 +    ​
 +    public int get(int poz) {
 +        if(poz < size) {
 +            return v[poz];
 +        } else {
 +            return -1;
 +        }
 +    }
 +    ​
 +    public void set(int pos, int value) {
 +        v[pos] = value;
 +        size++;
 +    }
 +    ​
 +    public int getSize() {
 +        return size;
 +    }
 +}
 +
 +
 +class Test {
 +    public static void main(String args[]) {
 +        MyQueue queue = new MyQueue();
 +        queue.enqueue(7);​
 +        queue.enqueue(8);​
 +        queue.enqueue(10);​
 +        queue.enqueue(-1);​
 +        queue.enqueue(2);​
 +        System.out.println(queue);​
 +        System.out.println(queue.dequeue());​
 +        System.out.println(queue.getSize());​
 +        System.out.println(queue);​
 +        queue.enqueue(9);​
 +        queue.enqueue(queue.dequeue());​
 +        queue.enqueue(11);​
 +        queue.enqueue(22);​
 +        System.out.println(queue);​
 +        while(!queue.isEmpty()) {
 +            System.out.print(queue.dequeue() + " ");
 +        }
 +        System.out.println(""​);​
 +        System.out.println(queue);​
 +    }
 +}
 +</​code>​
 +
 +====Problema 4====
 +Definiți o clasă **//​Numar//​** care are ca membru un număr întreg și conține metodele descrise mai jos. Implementați metodele astfel încât fiecare metodă să efectueze o singură adunare. ​
 +Instanțiați un obiect de tip **//​Numar//​** în metoda //​**main**//​ și apelați metodele implementate.
 +Ce principiu POO este evidențiat în acest exercițiu?
 +<note important><​code java>
 +//​returneaza suma dintre nr (membrul clasei) si a
 +public int suma(int a);
 +//​returneaza suma dintre nr, a si b
 +public int suma(int a, int b);
 +//​returneaza suma dintre nr, a, b si c
 +public int suma(int a, int b, int c);
 +//​returneaza suma dintre nr, a, b, c si d
 +public int suma(int a, int b, int c, int d);
 +</​code></​note>​
 +
 +
 +====Problema 5====
 +Implementați clasa **//​Punct//​** care definește un punct din spațiul 2D.
 +
 +**Datele clasei (private):​**
 +  * două nr. întregi reprezentând cele două coordonate ale punctului.
 +
 +**Conctructorul clasei:**
 +  * un constructor fără parametri care instanțiază punctul ''​O(0,​ 0)''​.
 +
 +
 +**Metodele clasei:**
 +  * ''​int getX()''​ = întoarce abscisa punctului;
 +  * ''​void setX(int x)''​ = seteaza abscisa punctului;
 +  * ''​int getY()''​ = întoarce ordonata punctului;
 +  * ''​void setY(int y)''​ = setează ordonata punctului;
 +  * ''​String toString()''​ = returnează un String de forma ''​(x,​ y)'';​
 +  * ''​double distance(int,​ int)''​ = calculează distanța dintre 2 puncte;
 +  * ''​double distance(Punct p1)''​ = calculează distanța dintre 2 puncte.
 +
 +Creați o clasă **//​Test//​**,​ în același pachet cu clasa **//​Punct//​**,​ care conține o metodă **//​main//​** care calculează distanța dintre punctele ''​A(1,​ 2)''​ si ''​B(-1,​ 3)''​.
 +
 +
 +Puteți accesa datele clasei //​**Punct**//​ în metoda //​**main**//​ din clasa //​**Test**//?​
 +
 +====Problema 6====
 +Să se definească o clasă **//​Graph//​** care să descrie un graf ponderat orientat care are nodurile numerotate de la $1$.
 +
 +**Datele clasei (private):​**
 +  * o matrice cu componente de tip int (matricea costurilor) - matrice;
 +  * o constantă (**//​Infinit//​**) având valoarea 9500;
 +  * numărul de noduri - n .
 +
 +**Constructorul clasei:**
 +  * constructor cu un parametru întreg (numărul de noduri din graf)
 +
 +**Metodele clasei:**
 +  * ''​int getSize()''​ = are ca rezultat numărul de noduri din graf;
 +  * ''​void addArc(int v, int w, int cost)''​ = adaugă un arc la graf (între $v$ și $w$, având costul $cost$);
 +  * ''​boolean isArc(int v, int w)''​ = verifică dacă există arc între $v$ și $w$ în graf;
 +  * ''​toString()''​ = afișarea grafului (se va alege o variantă intuitivă de afișare a grafului);
 +  * ''​int[][] floydWarshall()''​ = implementarea algoritmului \textit{Floyd - Warshall} pentru determinarea drumurilor de cost minim în graf;
 +  * ''​void main(String[])''​ = metoda main pentru testarea functionalității clasei implementate.
 +
 +Pentru verificare, se va crea graful din figura de mai jos. Se va afișa graful, uzitând metoda **//​toString//​** implementată,​ și se va determina distanța minimă dintre două noduri folosind algoritmul **Floyd - Warshall**.
 +Folosiți scheletul de mai jos:
 +
 +{{ :​poo:​laboratoare:​graf.png |}}
 +<code java>
 +class Graph {
 +    //....
 +
 +    public int[][] floydWarshall() {
 + int result[][];
 + result = new int[n+1][n+1];​
 + int k, i, j;
 + for(i = 1; i <= n; i++) {
 + for(j = 1; j <= n; j++) {
 + if(i == j) {
 + result[i][j] = 0;
 + } else if(isArc(i, j)) {
 + result[i][j] = matrice[i][j];​
 + } else {
 + result[i][j] = Infinit;
 + }
 + }
 + }
 + for(k = 1; k <= n; k++) {
 + for(i = 1; i <= n; i++) {
 + for(j = 1; j <= n; j++) {
 + int dist;
 + dist = result[i][k] + result[k][j];​
 + if(result[i][j] > dist) {
 + result[i][j] = dist;
 + }
 + }
 + }
 + }
 + return result;
 + }
 +
 + public static void main(String args[]) {
 + Graph g = new Graph(4);
 + g.addArc(1,​ 3, 2);
 + g.addArc(1,​ 2, 3);
 + g.addArc(2,​ 4, 6);
 + g.addArc(2,​ 3, 2);
 + System.out.println(g);​
 + System.out.println("​Floyd-Warshall"​);​
 + int [][] my_matrix = g.floydWarshall();​
 + System.out.println("​distanta minima dintre nodurile 1 si 4 este "+ my_matrix[1][4]);​ // rezultat - 9
 + }
 +}
 +</​code>​
 +
 +====Problema 7====
 +
 +Să se implementeze ierarhia de clase descrisă prin următoarea diagramă: ​
 +
 +{{:​poo:​laboratoare:​clase1.png|}}
 +
 +Clasa **//​Schedule//​** conține o metodă care calculează durata călătoriei în minute. Știind algoritmul de calcul al prețului unui bilet de călătorie,​ să se implementeze o metodă, în clasa **//​Train//​**,​ care calculează prețul unui bilet. Valoarea unui bilet este egală cu **//X * durata_călătoriei//​**,​ unde $X$ este egal cu $1$ pentru cursele interne și $2$ pentru cursele internaționale. Clasa **//​Route//​** va conține un constructor cu $2$ parametri și o metodă care primește ca parametru un obiect de tip **//​Route//​** și verifică dacă sunt de tip tur - retur cele două rute, rezultatul fiind de tip **//​boolean//​**. Clasa **//​ClockTime//​** conține o metodă, cu un parametru de tip **//​ClockTime//​**,​ și compară două momente de timp, rezultatul fiind un //​**int**//​.
 +
 +Adaugați o metodă //​**main**//​ pentru testarea claselor implementate,​ utilizând exemplele oferite. Definiți un constructor potrivit pentru instanțierea unui obiect de tip //​**Train**//,​ în care să apelați constructorii definiți în clasele //​**Route**//,​ //​**Schedule**//​ și //​**ClockTime**//​.
 +
 +<​code>​
 +[local] [origin (departure)] -> [destination (arrival)]
 +true Bucuresti Nord (9:35) -> Constanta (12:02)
 +true Bucuresti Nord (5:45) -> Iasi (12:49)
 +false Bucuresti Nord (23:45) -> Sofia (17:00)
 +</​code>​
poo/laboratoare/03.1509389957.txt.gz · Last modified: 2017/12/22 15:13 (external edit)
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