Ppoo Nou

  • December 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Ppoo Nou as PDF for free.

More details

  • Words: 4,419
  • Pages: 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 #include 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 << "("<
void main(){ Punct p(2,3); Complex c(8,9); cout<<(Complex)p<< endl<<(Punct)c<<endl; p=c; cout<
37. Analizati conceptul de clasa abstracta in urmatorul exemplu: An abstract queue // abselem.h #ifndef ABSTRACTELEM_H #define ABSTRACTELEM_H class AbstractElem{ public: virtual void display()=0; virtual void process()=0; }; #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;

*

Fifo

Person

AbstractElem

Car

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< 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 Fifo::Fifo(int nrmax):nrmax(nrmax){ first=free=nrelem=0;

support = new T [nrmax-1]; } template void Fifo::put(T e){ support[free]=e; free= ++free % nrmax; nrelem++; } template T Fifo::get(){ return support[first]; } template void Fifo::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<
cout<<"A Car:"; display(); } Fifo queuePerson(3); Fifo 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 #include 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<getName()<<endl; cout<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 class complex{ public: complex(double r){real=r; imag=0;} void assign (double r, double i){real= r; imag=i;} void print(){cout<
(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 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< 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<<<endl; cout<<++(++i)<<endl<<<endl; cout<<--(--i)<<endl<<<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 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<
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 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<
-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 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<
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
61. Analizati conceptul de polimorfism generic in programul // Definition of the template must be in //the same file with main function template 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 // 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 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<
m=100*n; cout<<100*n<<endl; // x=100; y=200; cout<
// 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 #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<

Related Documents

Ppoo Nou
December 2019 18
Ppoo...2003
May 2020 7
Nou-noticia
April 2020 11
Nou Cursimmct
April 2020 18
Ex Ppoo Mai 09
May 2020 8
Nou Barris Taller D'idees
December 2019 5