This is an old revision of the document!


Laboratorul 03.

Problema 1

Definiti o clasa Fractie care modeleaza lucrul cu fractiile. Membrii acestei clase sunt:

  • doua atribuite de tip double pentru numaratorul fractiei, respectiv numitorul ei;
  • constructorul cu doi parametri de tip double, pentru setarea celor doua parti ale fractiei (numarator si numitor);
  • un constructor fără parametri care apeleaza constructorul anterior;
  • o metoda, cu un singur parametru, de calcul a sumei a doua fractii;
  • o metoda toString uzitata pentru afisarea pe ecran a valorii fractiei;
  • o metoda equals, cu un parametru de tip Object, care va returna true daca fractiile sunt egale, respectiv false in sens contrar;
  • o metoda main pentru testarea functionalitatii clasei.

Consultati exemplul prezentat la curs pentru numere complexe!

Problema 2

Un produs este caracterizat prin nume (String), pret (double) si cantitate (int). Un magazin are un nume (String) si contine 3 produse. Creati clasele Produs si Magazin corespunzatoare specificatiilor de mai sus. In fiecare clasa, implementati constructorul potrivit, astfel incat caracteristicile instantelor sa fie setate la crearea acestora. \par Clasa Produs contine o metoda toString, care va returna un String sub forma “Produs nume_produs pret_produs cantitate” si o metoda getTotalProdus care va returna un double, produsul dintre cantitate si pret. Clasa Magazin contine o metoda toString care afiseaza toate componentele magazinului (va apela metoda toString pentru fiecare produs) si o metoda getTotalMagazin care va calcula suma totalurilor produselor si o va returna. Creati, intr-o metoda main, un obiect de tip Magazin, uzitand obiecte anonime in cadrul instantierii.

Patrat p = new Patrat(new Point(0, 0), new Dimension(5, 5));

Problema 3

Sa se defineasca o clasa MyQueue care sa descrie o structura de date de tip coada. Datele clasei (private):

  • un obiect de tip MyArray (clasa inclusa in arhiva laboratorului);
  • o constanta (Infinit) avand valoarea 9500;
  • indicele primului element din coada;
  • indicele ultimului element din coada;
  • numarul de elemente din coada.

Constructorul clasei:

  • constructor fara parametri care se ocupa de initializarile membrilor.

Metodele clasei:

  • int getSize() = are ca rezultat numarul de elemente din coada;
  • void enqueue(int value) = adauga o valoare in coada;
  • int dequeue() = intoarce primul element din coada si il elimina, incrementand indicele corespunzator, fara a elimina efectiv elementul din obiectul de tip MyArray (Infinit - coada vida);
  • boolean isEmpty() = verifica daca este vida coada;
  • String toString() = afisarea elementelor din structura de date.

Pentru verificare, se va folosi clasa TestBonus din arhiva laboratorului.

Problema 4

Definiti o clasa Numar care are ca membru un numar intreg si contine metodele descrise mai jos. Implementati metodele astfel incat fiecare metoda sa efectueze o singura adunare. Instantiati un obiect de tip Numar in metoda main si apelati metodele implementate. Ce principiu POO este evidentiat in acest exercitiu?

//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);

Problema 5

Sa se implementeze ierarhia de clase descrisa prin urmatoarea diagrama:

Clasa Schedule contine o metoda care calculeaza durata calatoriei in minute. Stiind algoritmul de calcul al pretului unui bilet de calatorie, sa se implementeze o metoda, in clasa Train, care calculeaza pretul unui bilet. Valoarea unui bilet este egala cu X * durata_calatoriei, unde $X$ este egal cu $1$ pentru cursele interne si $2$ pentru cursele internationale. Clasa Route va contine un constructor cu 2 parametri si o metoda care primeste ca parametru un obiect de tip Route si verifica daca sunt de tip tur - retur cele doua rute, rezultatul fiind de tip boolean. Clasa ClockTime contine o metoda, cu un parametru de tip ClockTime, si compara doua momente de timp, rezultatul fiind un int.

Adaugati o metoda main pentru testarea claselor implementate, utilizand exemplele oferite. Definiti un constructor potrivit pentru instantierea unui obiect de tip Train, in care sa apelati constructorii definiti in clasele Route, Schedule si ClockTime.

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

Problema 6

Implementati clasa Punct care defineste un punct din spatiul 2D.

Datele clasei (private):

  • doua nr. intregi reprezentand cele doua coordonate ale punctului.

Conctructorul clasei:

  • un constructor fara parametri care instantiaza punctul O(0, 0).

Metodele clasei:

  • int getX() = intoarce abscisa punctului;
  • void setX(int x) = seteaza abscisa punctului;
  • int getY() = intoarce ordonata punctului;
  • void setY(int y) = seteaza ordonata punctului;
  • String toString() = returneaza un String de forma \textit{(x, y)};
  • double distance(int, int) = calculeaza distanta dintre 2 puncte;
  • double distance(Punct p1) = calculeaza distanta dintre 2 puncte.

Creati o clasa Test, in acelasi pachet cu clasa Punct, care contine o metoda main care calculeaza distanta dintre punctele A(1, 2) si B(-1, 3).

Puteti accesa datele clasei Punct in metoda main din clasa Test?

Problema 7

Sa se defineasca o clasa Graph care sa descrie un graf ponderat orientat care are nodurile numerotate de la 0.

Datele clasei (private):

  • o matrice cu componente de tip int (matricea costurilor);
  • o constanta (Infinit) avand valoarea 9500;
  • numarul de noduri.

Constructorul clasei:

  • constructor cu un parametru intreg (numarul de noduri din graf)

Metodele clasei:

  • int getSize() = are ca rezultat numarul de noduri din graf;
  • void addArc(int v, int w, int cost) = adauga un arc la graf (intre v si w, avand costul cost);
  • boolean isArc(int v, int w) = verifica daca exista arc intre v si w in graf;
  • toString() = afisarea grafului (se va alege o varianta intuitiva de afisare a grafului);
  • int[][] floydWarshall() = implementarea algoritmului \textit{Floyd - Warshall} pentru determinarea drumurilor de cost minim in graf;
  • void main(String[]) = metoda main pentru testarea functionalitatii clasei implementate.

Pentru verificare, se va crea graful din figura de mai jos. Se va afisa graful, uzitand metoda toString implementata, si se va determina distanta minima dintre doua noduri folosind algoritmul Floyd - Warshall.

public int[][] floydWarshall() {
	int result[][];
	result = new int[this.nrVarfuri][this.nrVarfuri];
	int k, i, j;
	for(i = 1; i <= this.nrVarfuri; i++) {
		for(j = 1; j <= this.nrVarfuri; j++) {
			if(i == j) {
				result[i][j] = 0;
			} else if(this.isArc(i, j)) {
				result[i][j] = this.matrice[i][j];
			} else {
				result[i][j] = Infinit;
			}
		}
	}
	for(k = 1; k <= this.nrVarfuri; k++) {
		for(i = 1; i <= this.nrVarfuri; i++) {
			for(j = 1; j <= this.nrVarfuri; j++) {
				int dist;
				dist = result[i][k] + result[k][j];
				if(result[i][j] > dist) {
					result[i][j] = dist;
				}
			}
		}
	}
	return result;
}
poo/laboratoare/03.1530623046.txt.gz · Last modified: 2018/07/03 16:04 by mihai.nan
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