Sunteți pe pagina 1din 30

Subiecte pentru PPOO

1. Încapsularea datelor în C++. Nivele de protecŃie private, protected, public.


2. Caracteristicile obiectelor: atribute şi metode. Exemplu: clasa Persoana.
3. Crearea obiectelor. Constructori
a. IniŃializare sistematică a obiectelor
b. Supraîncărcare: Persoana(), Persoana(char*), Persoana(char*, int)
c. Semantica prin referinŃă. Obiecte cu resurse partajate (comune).
d. Semantica prin valoare
4. Constructor prin copiere. Exemplu: Persoana(Persoana &).
5. Fenomenul „memory leak” (epuizare memorie) în cazul semanticii prin valoare.
6. Obiecte „fantomă”.
7. Eliminarea obiectelor. Destructori. Evitare “memory leak”.
8. Transferul obiectelor ca argumente sau rezultat.
a. Obiecte temporare.
b. Transferul prin valoare (by value)
i. Cazul pointer
c. Transferul prin referinŃă (by reference, &)
9. Caracteristici statice ale unei clase
a. Specificatorul de clasă de memorare “static”
b. Atribuite statice. Exemplu de utilizare.
c. Metode statice.
d. Legarea externă şi legarea internă a identificatorilor din fişierele C++
i. Declarare cu specificatorul static
ii. Declarare cu specificatorul extern
10. Modificatorul de acces const
11. FuncŃii şi clase prietene ale unei clase.
12. Specificarea claselor în fişiere header (*.h).
a. Directivele ifndef, define, endif pentru evitarea includerilor repetate
13. Supradefinirea (supraîncărcarea) metodelor.
14. Necesitatea supradefinirii funcŃiilor şi metodelor: funcŃiile void swap (float, float)
void swap (int, float), void swap (float, int), void swap (int, int)
15. Supradefinirea (supraîncărcarea) operatorilor.
a. Necesitate
b. Exemplu: clasa Complex.
c. Supraîncărcarea operatorilor ca metode
d. Supraîncărcarea operatorilor ca funcŃii prietene
16. Supraîncărcarea operatorului de atribuire
a. Suparincărcarea predefinită (by default) cu semantica prin referinŃă. Obiecte cu
resurse partajate
b. Supraîncărcare cu semantică prin valoare. Evitarea obiectelor cu resurse partajate
i. Exemplu: clasa Persoana
17. Supraîncărcarea operatorilor de inserŃie (<<) şi de extracŃie ( >>)
a. Clasele ostream, istream. Obiectele cout, cin.
b. Exemplu: clasele Persoana si Complex.
18. Supraîncărcarea operatorilor unari ++, --.
19. Clasa FIFO (coada)
20. Clasa LIFO (stiva)
21. Conversii implicite la compilare:
a. La evaluarea unei expresii
b. La atribuire
c. La transferul argumentelor
22. Conversii explicite cu operatorii de tip “cast”: (int), (float)
23. Conversii de tip definite de programator
a. Conversie de la un tip predefinit la un tip clasa
i. Exemplu. Clasa Complex şi tipul float
ii. Constructor cu un singur parametru, de tip predefinit
b. Conversie de la un tip clasa la un tip predefinit
i. Exemplu. Clasa Complex şi tipul float
ii. Supradefinirea operatorului cast (int), (float)
c. Conversie de la un tip clasă la alt tip clasă.
i. Exemplu. clasa Complex şi clasa Punct2D
ii. Constructor cu un singur parametru, de tip predefinit
iii. Supradefinirea operatorului cast (Complex), (Punct2D).
d. InterdependenŃa dintre conversii şi supradefinirea operatorilor.
24. Moştenire. Clase derivate.
a. Ierarhie de subtip: clasa, subclasă.
b. Moştenire simplă, moştenire multiplă
c. Controlul accesului: public, protected, private.
d. Exemplu: Persoana, Student, Angajat, StudentAngajat.
25. Constructori şi desctructori pentru clasa derivată.
26. Constructor de copiere în clasa derivată
27. Redefinirea (specializarea) metodelor din subclase.
28. Compatibilitatea dintre o clasă şi o subclasă.
a. Conversii de tip
29. Legare statică (static, early binding) şi legare dinamică (dynamic, late binding) a metodelor.
a. Legare statică implicită
b. Metode virtuale: cuvântul cheie “virtual”.
30. Polimorfismul de subtip
a. Expresia polimorfă p->m(), m metodă virtuală.
31. AplicaŃie polimorfism: Structuri de date eterogene .
a. Exemplu. Lista FIFO cu obiecte Persoana, Student, Angajat sau StudentAngajat
b. Exemplu. Lista LIFO cu obiecte Persoana, Student, Angajat sau StudentAngajat
32. AplicaŃie polimorfism: FuncŃii generale, ce pot fi utilizate cu argumente de tipuri care au fost
create ulterior.
a. Exemplu: funcŃia display(Persoana *), cu utilizare display(new Student()) etc. sau
display(new OriceSubtipPersoana())
33. Clase abstracte.
a. Exemplu clasa abstracta AbstractList, cu operatiile put, erase, item, isFull,
isEmpty
34. Clase abstracte şi aplicaŃii abstracte. Şablonul Factory
a. Exemplu: aplicaŃie cu AbstractList; specializare pentru utilizare cu FIFO, LIFO
etc.
35. Polimorfism generic: template
a. FuncŃii generice
b. Clase generic
c. ComparaŃie polimorfism de subtip si polimorfism generic

36. Analizati mecanismele de conversie din urmatorul program:


#include <conio.h>
#include <iostream.h>
class Complex;
class Punct{
public:
Punct(float x=0, float y=0):x(x),y(y){}
operator Complex();
operator float(){return x;}
private:
float x,y;
friend ostream& operator<<(ostream &stream, const Punct &p );
};
class Complex{
public:
Complex(float x=0, float y=0):x(x),y(y){}
operator Punct(){return Punct(x,y);}
operator float(){return x;}
private:
float x,y;
friend ostream& operator<<(ostream &stream, const Complex &c );
friend Punct::operator Complex();
};

// in varianta aceasta, Punct::operator Complex nu trebuie declarata functie prietena


//Punct::operator Complex(){ return Complex(x,y);}

Punct::operator Complex(){//functie friend a clasei Complex


Complex c; c.x=x;c.y=y;
return c;
}
ostream& operator<<(ostream &stream, const Punct &p ){
stream << "("<<p.x<<","<<p.y<<")";
return stream;
}
ostream& operator<<(ostream &stream, const Complex &c ){
stream <<c.x<<"+"<<c.y<<"*i";
return stream;
}
void main(){
Punct p(2,3);
Complex c(8,9);
cout<<(Complex)p<< endl<<(Punct)c<<endl;
p=c; cout<<p<<endl;
p=1;
cout<<p<<endl;
int i=p; cout<<i<<endl;
c=p=1;
(Punct)((Complex)p);
getch();
}

37. Analizati conceptul de clasa abstracta in urmatorul exemplu:


An abstract queue

// abselem.h Fifo * AbstractElem


#ifndef ABSTRACTELEM_H
#define ABSTRACTELEM_H
class AbstractElem{
public:
virtual void display()=0;
virtual void process()=0;
}; Person Car
#endif

//fifo.h
#ifndef FIFO_H
#define FIFO_H
#include "abselem.h"

class Fifo{
public:
Fifo(int nrmax=0);
void put(AbstractElem *);
AbstractElem* get();
void remove();

private:
int nrmax;
int nrelem;
int first;
int free;
AbstractElem* *support;
};
#endif

//elements.h
#include "abselem.h"
#include "iostream.h"
class Person: public AbstractElem{
public:
Person(char *name);
virtual void display();
virtual void process();
private:
char *name;

};
class Car: public AbstractElem{
public:
Car(char *name);
virtual void display();
virtual void process();
private:
char *name;

};

//driver.cpp
#include "elements.h"
#include "fifo.h"
Fifo queue(3);
void main(){
queue.put(new Person("Tudor"));
queue.put(new Person("Andrei"));
queue.put(new Car("B-39-TDR"));
queue.get()->process(); queue.remove();
queue.get()->process(); queue.remove();
queue.get()->process(); queue.remove();
}

//fifo.cpp
#include "fifo.h"
Fifo::Fifo(int nrmax):nrmax(nrmax){
first=free=nrelem=0;
support = new AbstractElem* [nrmax-1];
}
void Fifo::put(AbstractElem * pe){
support[free]=pe; free= ++free % nrmax; nrelem++;
}
AbstractElem* Fifo::get(){
return support[first];
}
void Fifo::remove(){
first= ++first % nrmax;
--nrelem;
}

//elements.cpp
#include "elements.h"
Person::Person(char *name):name(name){};
void Person::display(){cout<<name<<endl;}
void Person::process(){
cout<<"A Person: ";
display();
}
Car::Car(char *name):name(name){};
void Car::display(){cout<<name<<endl;}
void Car::process(){
cout<<"A Car:";
display();
}

38. Analizati conceptul de polimorfism generic in urmatorul program:


#include "iostream.h"
template <class T>
class Fifo{
public:
Fifo(int nrmax=0);
void put(T);
T get();
void remove();

private:
int nrmax;
int nrelem;
int first;
int free;
T* support;
};

template <class T>Fifo<T>::Fifo(int nrmax):nrmax(nrmax){


first=free=nrelem=0;
support = new T [nrmax-1];
}
template <class T> void Fifo<T>::put(T e){
support[free]=e; free= ++free % nrmax; nrelem++;
}
template <class T> T Fifo<T>::get(){
return support[first];
}
template <class T> void Fifo<T>::remove(){
first= ++first % nrmax;
--nrelem;
}

class Person {
public:
Person(char *name);
Person(); //necesar pentru a intializa tablouri
virtual void display();
virtual void process();
private:
char *name;

};

class Car {
public:
Car(char *name);
Car();
virtual void display();
virtual void process();
private:
char *name;

};

Person::Person(char *name):name(name){};
Person::Person(){};
void Person::display(){cout<<name<<endl;}
void Person::process(){
cout<<"A Person: ";
display();
}
Car::Car(char *name):name(name){};
Car::Car(){};
void Car::display(){cout<<name<<endl;}
void Car::process(){
cout<<"A Car:";
display();
}

Fifo<Person> queuePerson(3);
Fifo<Car> queueCar(3);
void main(){
queuePerson.put(Person("Tudor"));
queuePerson.put(Person("Andrei"));
queueCar.put(Car("B-39-TDR"));
queuePerson.get().process(); queuePerson.remove();
queueCar.get().process(); queueCar.remove();
queuePerson.get().process(); queuePerson.remove();
}

39. Explicati de ce in programul urmator este creat doar un singur obiect, chiar daca exista doua
expresii S::create().
//singleton
// constructor private
#include <iostream.h>
#include <conio.h>
class S{
public:
static S* create(){
if(i==0){
refS=new S(); i++;
}
return refS;
}
void setName(char *s){name=s;}
char* getName(){return name;}
static int getNr(){return nr;}

private:
static S* refS;
static int i;
static int nr;
S(){nr++;}
char *name;

};
int S::i=0;
int S::nr=0;
S* S::refS=0;
void main(){
S *o1, *o2;
o1=S::create();
o2=S::create();
o1->setName("Matematica");
o2->setName("Informatica");
cout<<o1->getName()<<endl;
cout<<o2->getName()<<endl;
cout<<S::getNr()<<endl;
getch();
}

40. In programul urmator, precizati care din instructiunile


(y+z).print();
(y+1).print();
(1+y).print();
(y-1).print();
(1-y).print();
sunt corecte. Comentati motivul pentru care cea incorecta este
semnalata de compilator.

#include <math.h>
#include <iostream.h>
class complex{
public:
complex(double r){real=r; imag=0;}
void assign (double r, double i){real= r; imag=i;}
void print(){cout<<real<<"+"<<imag<<"i"<<endl;}
double give_real(){return real;}
double give_imag(){return imag;}
complex operator +( complex z) {
real+=z.real;imag+=z.imag; return *this;
}

private:
double real, imag;
};

complex operator-(complex a, complex b){


complex c(0);
c.assign(a.give_real()-b.give_real(),a.give_imag()-b.give_imag());
return c;
}

void main(){
complex z(1), y(1);
z.assign(2,3); y.assign(3,4);
cout<<"start"<<endl;
z.print(); y.print();
(y+z).print();
(y+1).print();
(1+y).print();
(y-1).print();
(1-y).print();
}

41.
Fie clasa
class deque{
public:
void reset(){top=bottom=MAX_LEN/2; top--;}
private:
char s[MAX_LEN];
int bottom, top;
};
care descrie o coada cu doua capete.
Declarati si implementati metodele
adauga_dreapta, adauga_stanga, elimina_dreapta, elimina_stanga, este_vida, este_plina

42. Urmatoarele instructiuni de declarare sunt incorecte. Comentati.


struct brother{
char name[20];
int age;
struct sister sib;
}a;
struct sister{
char name[20];
int age;
struct brother sib;
}a;

43.
Explicati diferenta dintre structura
struct A{int i,j,k;};
si clasa
class A{int i,j,k;};
De ce nu este utila clasa A?
Folosind cuvantul cheie public, adaptati declararea clasei A
astfel incat ea sa fie echivalenta cu structura A.
44.
Explicati erorile semnalate la compilarea urmatorului program
class Punct{
public:
Punct(){x=0; y=0;}
Punct(int xx=0){x=xx;y=0;}
Punct(int xx, int yy=0){x=xx; y=yy;}
private:
int x,y;
};

void main(){
Punct p;
Punct p1(1);
Punct p2(1,2);
}
45.
Explicati erorile la executarea programului urmator
Modificati constructorul de copiere pentru a elimina aceste erori
#include <iostream.h>
class X{
public:
X(int i=0){p=new int; if(p) *p=i;}
X(const X &r){p=r.p;}
~X(){if(p){delete p; p=0;}}
void show(){cout<<*p<<endl;}
private:
int *p;
};

void main(){
X *o1,*o2;
o1=new X(1);
o2=new X(*o1);
o1->show(); delete o1;
o2->show(); delete o2;
}
46.
In programul urmator, supradefiniti operatorul << astfel incat cout<<i sa afiseze
valoarea atributului i.x
Precizati si explicati rezultatele afisate la executarea programului astfel obtinut

#include <iostream.h>
class C{
public:
C(int i=0){x=i;}
C& operator++(){++x; return *this;}
C operator--(){--x; return *this;}
private:
int x;
};
void main(){
C i;
cout<<i<<endl;
cout<<++(++i)<<endl<<i<<endl;
cout<<--(--i)<<endl<<i<<endl;
}
47.
Inlocuiti . . . in clasa Stack, astfel incat metodele push si pop sa asigure tratarea
exceptiilor. Numarul maxim de elemente din vectorul supporteste dat de expresia
suport.length.
Scrieti o aplicatie in care sa tratati exceptiile lansate de push si pop.

class Stack{
int varf;
Object suport[];
void push(Object x). . .{. . .}
Object pop(). . .{. . .}
void init(int s){
varf=0;
support=new Object[s];
}
Stack(int s){. . .}
}

48.
Se consideră următorul program C++, în formă incompletă:

#include <iostream.h>
class E{
public:
E(int i=0):i(i){}
int i;
};
class B{
public:
B(E *pe):pe(pe){cout<<"B::B(E*)"<<endl;}
B& operator=(const B &b){
pe->i=b.pe->i;
cout<<"B::op="<<endl;
return *this;
}
// 1…?
private:
E *pe;
};

class D:public B{
public:
D(E *pe, E *pf):B(pe),pf(pf){cout<<"D::D(E*,E*)"<<endl;}
// 2...?
private:
E *pf;
};
void main(){
E e0(0),e1(1), e10(10), e11(11);
B b0(&e0), b1(&e1);
cout<<b0; // instr 1
cout<<endl<<b1<<endl;
cout<<"----"<<endl;

D d0(&e0,&e10), d1(&e1,&e11);
cout<<d0 ; // instr 2
cout<<endl<<d1<<endl;
cout<<"----"<<endl;

d0=d1;
cout<<d0<<endl<<d1<<endl;
cout<<"----"<<endl;

e10.i=100; e11.i=111;
cout<<d0<<endl<<d1<<endl;
cout<<"----"<<endl;

}
1. Se cere să supraîncărcaŃi operatorul de inserŃie << astfel ca prin executarea
instrucŃiunilor //instr 1 şi //instr 2 să se afişeze 0 şi respectiv 0;10
2. SupraîncărcaŃi in clasa D operatorul de atribuire astfel ca prin executarea
programului să se obŃină următoarele rezultate:

B::B(E*)
B::B(E*)
0
1
----
B::B(E*)
D::D(E*,E*)
B::B(E*)
D::D(E*,E*)
0;10
1;11
----
B::op=
D::op=
1;11
1;11
----
1;111
1;111
49. Se consideră următoarea interfaŃă Java, în care sunt definite câteva operaŃii
elementare asupra listelor de obiecte:
interface ListOperations{
public void add(Object o);// adauga un obiect in lista
// returneaza, fara a sterge,
// elementul curent din lista
public Object currentElement();
public void delete();// sterge elementul curent
}

Se cere să implementaŃi această interfaŃă printr-o clasă Queue ale cărei obiecte sunt
liste eterogene First In First Out (cozi circulare, în care elementul current are cea mai
mare vechime în listă şi este indicat de cursor).
Aceste liste sunt observabile în sensul următor: când cursorul este deplasat, noul
element curent este transmis către toate obiectele observatoare (aici includem şi cazul
în care se adugă un element într-o listă vidă).
Obiectele observatoare sunt din clasa QueueObserver, pe care trebuie de asemenea s-o
definiŃi.
Completând corespunzătot //…1, //…2, //…3 şi //…4, programul test de mai jos
trebuie să afişeze rezultatele următoare:

100
100
Tudor
Andrei

class Queue //. . .1


public Queue(int mD){maxDim=mD; v=new Object[maxDim];}

//. . .2
//atributes
private int free=0; //pozitia libera
private int cursor=0;// pozitia cu elementul util
// 0<=numberOfElements<=maxDim,
//numarul real de elemente din coada
private int numberOfElements=0;
private Object v[];
private int maxDim;
}

class QueueObserver //. . .3


public QueueObserver(Queue q){obsQ=q;}
//. . .4

// atributes
private Queue obsQ; // coada observabila

public class ObservableList{


public static void main(String[] args){
Queue q=new Queue(4);
QueueObserver qO= new QueueObserver(q);
q.addObserver(qO);
q.add(new Integer(100));
q.add("Tudor");
q.add("Andrei");
q.add(new Integer(400));
System.out.println(q.currentElement());
q.delete();
q.add(new Integer(500));
q.delete();
q.add(new Integer(100));

}
}

50.
Definiti clasa NumereRationale, ale carei obiecte sunt numere rationale. DefiniŃi
metode şi operatori astfel încât executarea programului următor:

#include “rational.h”
void main(){
NumereRationale x(10, -20);
cout<< x << “ ; “ << 3 * x << “ ; “ << x * 2 << “ ; “<< x * x<< endl;
}
să afişeze linia:

-1/2 ; -3/2 ; -1 ; 1/4

51.
Completati specificarea clasei C si implementati metodele si operatorii astfel incat
prin executarea programului sa se obtina rezultatele indicate prin comentarii.
#include <iostream.h>
class C{
public:
void set_x(int x){
*px=x;
}
void set_y(int y){
*py=y;
}
private:
int *px;
int *py;
};

void main(){
C m, n(1,2);
cout<<m<<endl; // x=0; y=0;
cout<<n<<endl; //x=1; y=2;
m=n*100;
cout<<n*100<<endl; // x=100; y=200;
cout<<n<<endl; //x=1; y=2;
m=n;
n.set_x(100);n.set_y(200);
cout<<m<<endl; //x=100; y=2
52. }
Se consideră clasa următoare:
class C{
public:
C(int n=1, int v[]);
void set(int i, int val){
pi[i]=val;
}
// alte metode si operatori
private:
int dim;
int *pi;
};
şi programul:
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);

// prima afisare
cout<<x<<endl; //1; 2; 3;
a[0]=10;

// a doua afisare
cout<<x<<endl; //1; 2; 3;

// a treia afisare
cout<<(x=y)<<endl;
y.set(0,1000);

// a patra afisare
cout<<x<<endl;

cout<<(x=x)<<endl;
}

-ImplementaŃi operatorul de inserŃie, astfel încat // prima afisare


să producă rezultatele din comentariu.
-ImplementaŃi constructorul astfel încât // a doua afisare
să producă rezultatele din comentariu. DiscutaŃi semantica prin referinŃă şi semantica
prin valoare.
-Presupunem că operatorul de atribuire din // a treia afisare este cel predefinit.
PrecizaŃi ce se afişează la // a treia afisare şi la // a patra afisare. ExplicaŃi rolul
operatorului de atribuire la obŃinerea acestor rezultate.
-Fie următoarea schiŃă de supraîncărcare a operatorului de atribuire:
C& C::operator=(C& x){
delete[] pi;
// completari
}
CompletaŃi implementarea operatorului de atribuire astfel încât // a treia
afisare şi // a patra afisare să producă aceleaşi rezultate.

-ModificaŃi implementarea de la punctual 3 astfel încât expresiile cout<<x şi


cout<<(x=x) sa aibă acelaşi efect (afişarea valorilor lui x)

53.
Fie următoarea specificare a clasei Stiva_forma_preliminara:
class Stiva_forma_preliminara{
public:
Stiva_forma_preliminara (int n);
// constructor, construieste o stiva
// ce poate contine maximum n caractere
void adauga( char c); // modificator, adauga un caracter in stiva
char varf(); // interogare, da caracerul din varful stivei
protected:
int i;
private:
int n;
char *s;
};

Se cere să se implementeze această clasă astfel încât următorul program de încercare:

Stiva_forma_preliminara s(5);
void main(){
adauga(‘C’);
cout<<s.varf();
adauga(‘+’);
cout<<s.varf();
adauga(‘+’);
cout<<s.varf()<<endl;
}
să afişeze rezultatul următor:
C++
54.
Se cere să se specifice şi să se implementeze o clasa Stiva astfel încât următorul
program de încercare:

Stiva s(5);
void main(){
adauga(‘C’);
cout<<s.varf();
adauga(‘+’);
cout<<s.varf();
adauga(‘+’);
cout<<s.varf()<<endl;
s.elimina();
s.elimina();
cout<<s.varf()<<endl;

}
să afişeze rezultatul următor:
C++
C
55.
Să se utilizeze arhitectura Model View Controller pentru a crea o interfaŃă grafică ce
conŃine:
• un buton prin acŃionarea căruia este incrementat cu o unitate un număr natural
de maximum 3 cifre;
• o linie în care este afişată valoarea obŃinută prin incrementare.
Dacă prin incrementare este atinsă valoarea 1000, este semnalată o excepŃie. După
aceasta acŃionarea butonului nu mai modifică valoarea afişată.
Se impun următoarele cerinŃe:
• obiectele Controller pot avea ca atribute obiecte Model şi View
• obiectele View nu pot avea atribute de tip Model sau Controller.
IndicaŃie. Clasa principală este:
// file MVC.java
public class MVC{
public static void main(String[] args){
View v=new View();
Model m= new Model();
Controller c= new Controller(v,m);
}
}
56.
Completati specificarea clasei C si implementati metodele si operatorii astfel incat
prin executarea programului sa se obtina rezultatele indicate prin comentarii.
#include <iostream.h>
class C{
public:
void set_x(int x){
*px=x;
}
void set_y(int y){
*py=y;
}
private:
int *px;
int *py;
};
void main(){
C m, n(1,2);
cout<<m<<endl; // x=0; y=0;
cout<<n<<endl; //x=1; y=2;
m=n*100;
cout<<n*100<<endl; // x=100; y=200;
cout<<n<<endl; //x=1; y=2;
m=n;
n.set_x(100);n.set_y(200);
cout<<m<<endl; //x=100; y=2
}

57. Fie urmatorul program Java:

// Model View Controller

import java.awt.*;
import java.awt.event.*;
class Model{
private int x=0;
public Model(){};
public void increment(){x++;}
public void decrement(){x--;}
public int get_x(){return x;}
}
public class View extends Frame{
protected Button binc;
protected Button bdec;
protected Model m;
private Controller c;
protected TextField tf;
public static void main(String args[]){
Frame f= new View();
}
public View(){
setTitle("Exemplu Model-View-Controller");

binc= new Button("A");


add("North",binc);

bdec= new Button("B");


add("South",bdec);

m=new Model();

c=new Controller(this);
//
//

tf=new TextField(10);
add("Center",tf);

setSize(100,250);
setVisible(true);
}
}

class Controller implements ActionListener{


private View vw;
public Controller(View v){
vw=v;
}
}

Se cere:
a) Implementati clasa Controller astfel incat
prin actionarea butonului A sa se mareasca cu o unitate atributul vw.m.x iar la
actionarea butonului B atributul vw.m.x sa sa devina zero (valorile vor fi afisate in
campul tf).
b) Adaugati instructiuni de instalare a evenimentelor, utilizand obiectul c.
c) Descrieti dispunerea in fereastra a componentelor

58.
Fie următoarea schiŃă a unui program Java ce implementează un cronometru. Se
intenŃionează ca pe monitor să fie afişat, din 5 în 5 secunde, timpul scurs de la
pornirea sa (măsurat tot în secunde), sub forma următoare:
0 5 10 15 20 25 ...
Se cere să indicaŃi instrucŃiunile pe care le propuneŃi în locurile 1-????, 2-???? şi 3-
???? pentru ca programul să funcŃioneze conform acestei descrieri.

// fisier Cronometru.java
import java.util.*;
class Oscilator extends Thread {
long secunda=0;
public void run(){
while(true){
try {sleep (1000);} catch (Exception e){}
secunda++;
}
}
public long getSecunda(){return secunda;}

class MecanismCronometru extends Observable{


Oscilator osc=new Oscilator();
long timp= -1;
MecanismCronometru(){osc.start();}
void porneste(){
long timpNou;
while(true){
// in continuare, daca timpul din osc s-a schimbat
// el este inregistrat in variabila timp
// si sunt notificati observatorii
1-????

}
}
}

class Cadran implements Observer{


Afisare af;
public Cadran(Afisare loc){af=loc;}
public void update(Observable o, Object arg){
// tineti cont ca ((MecanismCronometru)o) este obiectul
// care a notificat schimbarea atributelor sale
2-????

}
}

interface Afisare{
public void afiseaza(long i);
}

class AfisarePeMonitor 3-????

public class Cronometru{


MecanismCronometru m;
Cadran c1;
public Cronometru(){
m=new MecanismCronometru();
c1= new Cadran(new AfisarePeMonitor());
m.addObserver(c1);
m.porneste();
}
public static void main(String[] args){
Cronometru pobeda=new Cronometru();

}
59.
Se consideră următoarea interfaŃă Java, în care sunt definite câteva operaŃii elementare
asupra listelor de obiecte:
interface ListOperations{
public void add(Object o);// adauga un obiect in lista
// returneaza, fara a sterge,
// elementul curent din lista
public Object currentElement();
public void delete();// sterge elementul curent
}
Se cere să implementaŃi această interfaŃă printr-o clasă Queue ale cărei obiecte sunt
liste eterogene First In First Out (cozi circulare, în care elementul current are cea mai
mare vechime în listă şi este indicat de cursor).
Aceste liste sunt observabile în sensul următor: când cursorul este deplasat, noul
element curent este transmis către toate obiectele observatoare (aici includem şi cazul
în care se adugă un element într-o listă vidă).
Obiectele observatoare sunt din clasa QueueObserver, pe care trebuie de asemenea s-o
definiŃi.
Completând corespunzătot //…1, //…2, //…3 şi //…4, programul test de mai jos
trebuie să afişeze rezultatele următoare:

100
100
Tudor
Andrei

class Queue //. . .1


public Queue(int mD){maxDim=mD; v=new Object[maxDim];}

//. . .2
//atributes
private int free=0; //pozitia libera
private int cursor=0;// pozitia cu elementul util
// 0<=numberOfElements<=maxDim,
//numarul real de elemente din coada
private int numberOfElements=0;
private Object v[];
private int maxDim;
}

class QueueObserver //. . .3


public QueueObserver(Queue q){obsQ=q;}
//. . .4

// atributes
private Queue obsQ; // coada observabila

public class ObservableList{


public static void main(String[] args){
Queue q=new Queue(4);
QueueObserver qO= new QueueObserver(q);
q.addObserver(qO);
q.add(new Integer(100));
q.add("Tudor");
q.add("Andrei");
q.add(new Integer(400));
System.out.println(q.currentElement());
q.delete();
q.add(new Integer(500));
q.delete();
q.add(new Integer(100));

}
}

60.

Se consideră clasa următoare:


class C{
public:
C(int n=0, int v[]);
void set(int i, int val){pi[i]=val;}
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
unde constructorul este implementat prin
C::C(int n, int v[]) { dim=n; pi=v;}

şi programul de test:
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
a[0]= -100;
cout<<x<<endl;
cout<<(x=y)<<endl;
y.set(0,-1000);
cout<<x<<endl;
cout<<(x=x)<<endl;
}
Se cere:
1. să implementaŃi operatorul de inserŃie, astfel încat prin:
int a[]={1,-2,-30}; C x(3,a); cout<<x;
să se afişeze: (1, –2, -30)
2. să precizaŃi ce se afişează prin executarea programului şi să explicaŃi rolul
constructorului implementat prin referinŃă şi al operatorului de atribuire la
obŃinerea acestor rezultate; (răspunsul fără explicaŃii nu este luat în
considerare)
3. Să presupunem că operatorul = este supraîncărcat prin:

C& C::operator=(C& x){


//stergerea valorior din vectorul destinatie,
//care oricum vor fi modificate
delete[] pi;
// atribuire
dim=x.dim;
pi=new int[dim];
for(int j=0; j<dim; j++){pi[j]=x.pi[j];}
return *this;
}
ExplicaŃi rezultatele afişate de program în aceste condiŃii, subliniind
diferenŃele faŃă de punctual 2.
4. ModificaŃi implementarea de la punctual 3 astfel încât expresiile cout<<x şi
cout<<(x=x) sa aibă acelaşi efect (afişarea valorilor lui x)

61. Analizati conceptul de polimorfism generic in programul

// Definition of the template must be in


//the same file with main function

template <class T>


void swap(T &x, T &y)
{
T t=x;
x=y;
y=t;
}

int main(){
typedef struct{
int x;
int y;
}complex;
int x,y;
complex c,d;
swap(x,y);
swap(c,d);

return 0;
}

62.
Să se utilizeze arhitectura Model View Controller pentru a crea o interfaŃă grafică ce
conŃine:
• un buton prin acŃionarea căruia este incrementat cu o unitate un număr natural
de maximum 3 cifre;
• o linie în care este afişată valoarea obŃinută prin incrementare.
Dacă prin incrementare este atinsă valoarea 1000, este semnalată o excepŃie. După
aceasta acŃionarea butonului nu mai modifică valoarea afişată.
Se impun următoarele cerinŃe:
• obiectele Controller pot avea ca atribute obiecte Model şi View
• obiectele View nu pot avea atribute de tip Model sau Controller.
IndicaŃie. Clasa principală este:
// file MVC.java
public class MVC{
public static void main(String[] args){
View v=new View();
Model m= new Model();
Controller c= new Controller(v,m);
}
}

63.
Fie următorul program C++:
#include <iostream.h>
// legare statica versus legare dinamica
class A{
public:

void st(){cout<<" A::st()"<<endl;}


virtual void vrt(){cout<<" A::vrt()"<<endl;}
void stafis(){cout<<" A::stafis()"<<endl; st(); vrt(); }
virtual void vrtafis(){cout<<" A::vrtafis()"<<endl; st(); vrt();}
};
class B: public A{
public:

int st(){cout<<" B::st()"<<endl; return 1;}


virtual void vrt(){cout<<" B::vrt()"<<endl;}
void stafis(){cout<<" B::stafis()"<<endl; st(); vrt(); }
virtual void vrtafis(){cout<<" B::vrtafis()"<<endl; st(); vrt();}
};

void main(){
A *p;
cout<<"Obiect A"<<endl;
p=new A();
p->st();
p->vrt();
p->stafis();
p->vrtafis();

cout<<"Obiect B"<<endl;
p=new B();
p->st();
p->vrt();
p->stafis();
p->vrtafis();
}

Ce se afişează prin executarea sa? ExplicaŃi mecanismul de legare a metodei la


implementare pentru fiecare linie afişată.

64.
Să se specifice şi să se implementeze, în C++ sau Java, o clasă ale carei obiecte sunt
persoane cu o anumită identitate. Identitatea nu este încă bine precizată, dar ar putea
conŃine elemente precum nume, prenume, adresă, CNP etc. ce urmează a fi stabilite
ulterior.
Clasa dispune de o metodă void afisare() prin care este afişată identitatea unei
persoane.
65.
Fie urmatorul program Java:

// Model View Controller

import java.awt.*;
import java.awt.event.*;
class Model{
private int x=0;
public Model(){};
public void increment(){x++;}
public void decrement(){x--;}
public int get_x(){return x;}
}
public class View extends Frame{
protected Button binc;
protected Button bdec;
protected Model m;
private Controller c;
protected TextField tf;
public static void main(String args[]){
Frame f= new View();
}
public View(){
setTitle("Exemplu Model-View-Controller");

binc= new Button("A");


add("North",binc);

bdec= new Button("B");


add("South",bdec);

m=new Model();

c=new Controller(this);
binc.addActionListener(c);
bdec.addActionListener(c);

tf=new TextField(10);
add("Center",tf);

setSize(100,250);
setVisible(true);
}
}

class Controller implements ActionListener{


private View vw;
public Controller(View v){
vw=v;
}
public void actionPerformed(ActionEvent e){
Button source=(Button)e.getSource();
if (source==vw.binc) vw.m.increment();
else if(source==vw.bdec) vw.m.decrement();
vw.tf.setText(String.valueOf(vw.m.get_x()));
}
}

Se cere:
a. Descrieti dispunerea in fereastra a componentelor si efectul actionarii
butoanelor A si B.
b. Descrieti procedeul Model-View-Controller
c. Modificati programul,folosind interfata WindowListener si metoda sa
public void windowClosing(WindowEvent e), astfel incat actionarea
butonului x din coltul din dreapta sus sa inchida fereastra.

66.
Completati specificarea clasei C si implementati metodele si operatorii astfel incat
prin executarea programului sa se obtina rezultatele indicate prin comentarii. Ce se
afisează prin ultima instrucŃiune?_
#include <iostream.h>
class C{
public:
C(C &c){
*c.px=0;
*c.py=0;
}
void set_x(int x){
*px=x;
}
void set_y(int y){
*py=y;
}
private:
int *px;
int *py;
};
void f(C c){}
void main(){
C m, n(1,2);
cout<<m<<endl; // x=0; y=0;
cout<<n<<endl; //x=1; y=2;
m=100*n;
cout<<100*n<<endl; // x=100; y=200;
cout<<n<<endl; //x=1; y=2;
m=n;
n.set_x(100);n.set_y(200);
cout<<m<<endl; //x=100; y=2
f(m);
cout<<m<<endl; // ce afiseaza ?
}
67.
a. ImplementaŃi următoarea schiŃă a claselor CoadaCirculara, DepasireCapacitate şi
ListaVida şi completaŃi blocurile catch astfel încât prin executarea programului
TestCoadaCirculara să se obŃină efectul specificat prin comentarii.
Obiectele clasei CoadaCirculara sunt cozi (fifo) asupra cărora se fac operaŃii de
adăugare-extragere-interogare.
ObservaŃie. Locurile în care se intervine sunt
//?? 1 …//?? 8
b.ImplementaŃi o interfaŃă grafică alcătuită din trei butoane (adaugă, elimina şi
element) prin care sa se realizeze interacŃiunea cu o coada. Elementele cozii
sunt siruri de caractere ce vor fi preluate şi afişate în alte componente ale
interfeŃei (TextField). La implementarea metodei actionPerformed nu se vor
folosi instrucŃiuni if sau switch.

public class CoadaCirculara{


// interfata
public CoadaCirculara(int n, String s) //?? 1
public void adauga(Object ob) //?? 2
public void elimina() //?? 3
public Object element()//?? 4
public String nume(){return nume;}
// atribute
private Object v[];
private int maxDim; // numarul maxim de elemente
private int prim=0;//pozitia primului element din lista
private int ultim=-1;
//pozitia elementului adaugat ultima data
//lista are elementele in vectorul v, de la prim la ultim,
//in sensul acelor de ceasrnic
private int numarElemente=0;
// numarul de elemente din coada
private String nume; // un nume pentru coada circulara
}

class DepasireCapacitate //?? 5


class ListaVida //?? 6

// programul TestCoadaCirculara
public class TestCoadaCirculara{
public static void main(String [] args){
CoadaCirculara a=new CoadaCirculara(3, "LISTA A");
CoadaCirculara b=new CoadaCirculara(4, "LISTA B");
try{
a.adauga("1");
a.adauga(b);
a.adauga(new Integer(-10));
// In acest moment, a=("1",b,-10)
// si "1" este primul element
System.out.println(a.element());
// s-a afisat "1"
a.elimina(); //a=(b,-10)
System.out.println(((CoadaCirculara)a.element()).nume());
// s-a afisat "LISTA B"
a.adauga("1"); //a=(b,-10,"1")
a.elimina();
a.elimina();
a.elimina();
b.adauga("X");
// a=() si b=("X")
System.out.println(a.element() );
// Se afiseaza mesajul:
// Exceptie ListaVida in LISTA A
// si programul se termina
System.out.println(b.element() );
}
catch(DepasireCapacitate e){
System.out.println //?? 7
}
catch(ListaVida e){
System.out.println //?? 8
}

}
}

68.
69. In urmatorul program (incomplet):
a. Implementati constructorul Cilindru
b. Implementati operator-- astfel ca efectul sa fie
decrementarea razei si inaltimii cilindrului
c. Se poate inlocui expresia lungime()*inaltime prin
2*PI*raza*inaltime?
d. Explicati rezultatele afisate de liniile //1, //2, //3, //4 si //5

#include <iostream.h>
#define PI 3.14
class Cerc{
public:
Cerc(float r):raza(r){}
virtual float arie(){return PI*raza*raza;}
float lungime(){return 2*PI*raza;}
Cerc operator++(){raza++;return *this;}
Cerc& operator--(){raza--;return *this;}

private:
float raza;
};
class Cilindru: public Cerc{
public:
Cilindru(float raza, float inaltime);
virtual float arie(){return lungime()*inaltime;}
Cilindru& operator--();
private:
float inaltime;
};
void main(){
Cerc c(1.0), *pc;
pc=new Cilindru(0.0,5.0);
cout<<(++(++c)).lungime()<<endl; //1
cout<<c.lungime()<<endl; //2
cout<<(--(--c)).lungime()<<endl; //3
cout<<c.lungime()<<endl; //4
cout<<(++(*pc)).arie()<<endl; //5