Sunteți pe pagina 1din 19

Examen 10 subiecte: DIN C++ CATE 8 SUBIECTE ; DIN DIAGRAME UML 2 SUBIECTE - 2010 PPOO

1. Analizati cu atentie urmatorul fragment de cod sursa. Alegeti observatia corecta ? - 20 points -
restanta
class Sir
{
int len;
char *p;
public:
Sir(char * s=NULL)
{
p = NULL;
len =0;
if(s)
{
len = strlen(s);
p = new char[len+1];
strcpy_s(p,len+1, s);
}
}
~Sir(){ if (p) delete[] p; }
};
int main(int argc, char* argv[])
{
while(true)
{
Sir * ps = new Sir("Programare in C++");
delete ps;
}
return 0;
}

a) codul este sintactic corect , se compileaza dar nu se executa


B) codul este corect , se compileaza dar ruleaza la infinit
c) Nu se afiseaza nimic, codul nu se compileaza
d) Se compileaza si ruleaza pana cand se epuizeaza memoria, este eliminat de sistem
e) Se compileaza dar nu se executa si afiseaza un mesaj de eroare

2) Ex. Restanta - 20 points


Analizati cu atentie urmatorul fragment de cod sursa. Deduceti ce calcul efectueaza sablonul urmator si
se va afisa pe ecran?
template <int N, int LO=1, int HI=N>
class Calcul {
public:
enum { mid = (LO+HI+1)/2 };
enum { result = (N<mid*mid) ? Calcul<N,LO,mid-1>::result
: Calcul<N,mid,HI>::result };
};
//pentru cazul cand LO == HI
template<int N, int M>
class Calcul<N,M,M> {
public:
enum { result = M };
};
int main(int argc, char* argv[])
{
int x = Calcul<10>::result;
cout << x<< endl;
return 0;
}
a) 1
b) 2
C) 3
d) 4
e) 5

3) EX Examen : Analizati cu atentie urmatorul fragment de cod sursa.


Precizati care este ordinea de apel a constructorilor. Ce se va afisa pe ecran?

class Baza
{
public:
Baza(){ cout<<"B::B()"<<endl;}
Baza(Baza &b){ cout<<"B::B(B&)"<<endl;}
~Baza(){ cout<<"B::~B()"<<endl;}

};

int main (int argc, char* argv[])


{
Baza a;
Baza b = a;
Baza c(b);

return 0;
}
a)B::B(B&)
B::B(B&)
B::B(B&)

b)B::B()
B::B(B&)
B::B(B)

c)B::B()
B::B(B)
B::B(B&)

D) B::B()
B::B(B&)
B::B(B&)

e)B::B()
B::B()
B::B()

Pentru ca :
Baza a;=B::B()
Baza b = a;=B::B(B&)
Baza c(b);=B::B(B&)
4) Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a
constructorilor. Ce se va afisa pe ecran? 10 point

class Clasa1
{
public:
Clasa1(){ cout<<"C1::C1()"<<endl;}
};
class Clasa2
{
public:
Clasa2() { cout<<"C2::C2()"<<endl;}
};
class System
{
Clasa1 ob1;
Clasa2 ob2;
public:
System() { cout<<"S::S()"<<endl;}
};
int main (int argc, char* argv[])
{
System a;
return 0;
}
a) S::S()
C1::C1()
C2::C2()

b) S::S()
C2::C2()
C1::C1()

C) C1::C1()
C2::C2()
S::S()

d) S::S()

e ) C1::C1()
C2::C2()
5 ) Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a
destructorilor. Ce se va afisa pe ecran? - 10 points

class Clasa1
{
public:
~Clasa1(){ cout<<"C1::~C1()"<<endl; }
};
class Clasa2
{
public:
~Clasa2(){ cout<<"C2::~C2()"<<endl;}
};
class System
{
Clasa1 ob1;
Clasa2 ob2;
public:
System():ob2(),ob1(){ }
virtual ~System(){ cout<<"S::~S()"<<endl;}
};
int main (int argc, char* argv[])
{
System a;
return 0;
}
a) C2::~C2()
C1::~C1()
S::~S()

b) C1::~C1()
C2::~C2()
S::~S()

c) S::~S()

d) S::~S()
C1::~C1()
C2::~C2()

E) S::~S()
C2::~C2()
C1::~C1()
5A) .Exercitiu examen
Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel pe ecran a
destructorilor. Ce va afisa pe ecran ?

#include <iostream>

using namespace std;


class Clasa1
{ public:
~Clasa1(){ cout <<"C1::~C1()" <<endl; }
};
class Clasa2
{
public:
~Clasa2(){ cout <<"C2::~C2()" <<endl; }
};
class System
{
Clasa2 ob1;
Clasa1 ob2;
public:
System():ob1(),ob2(){ }
virtual ~System() { cout << "S::~S()" <<endl;}
};
int main (int argc, char* argv[] )
{
System a;
return 0;
}

Raspuns:
a) S::~S()
C1::~C1()
C2::~C2()
6) Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este ordinea de apel a
destructorilor. Ce se va afisa pe ecran?

class W
{
public:

virtual ~W(){ cout<<"W::~W()"<<endl;}


};

class R
{
public:

virtual ~R(){ cout<<"R::~R()"<<endl;}


};
class File: public W, public R
{
public:

virtual ~File(){ cout<<"File::~File()"<<endl;}


};
int main (int argc, char* argv[])
{

R* f = new File();
delete f;
return 0;
}

a) R::~R()
W::~W()
File::~File()

b) File::~File()
W::~W()
R::~R()

C) File::~File()
R::~R()
W::~W()

d) File::~File()
R::~R()
R::~R()
7) Ex restanta
Precizati care este ordinea de apel a constructorilor si destructorilorl Ce se va afisa pe ecran?

Class Baza
{
public:
Baza( ) { cout<<”B::B ( ) “ ( ) <<endl; }
~ Baza( ) { cout<<”B::~ B ( ) “ ( ) <<endl; }

};
class Derivat : public Baza

public:
Derivat ( ) { cout<<”D: : D ( ) « <<endl>>
~Derivat ( ) { cout<<”D:: ~D ( ) « <<endl>>
};
int main ( int argc, char* argv[]
};

Baza *s = new Derivat ( ) ;


Delete s;
Return 0;

a) D::D()
B::B()
B::~B()

b) D::D()
B::B()
B::~B()
D::D()

c) B::B()
B::~B()

D) B::B()
D::D()
B::~B()

e) B::B()
D::D()
D::~D()
B::~B()
Raspuns : D
8) Examen : Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este efectul apelarii
metodei Create(), ce varianta a functiei se va apela si ce se afiseaza pe ecran?
class Baza2
{
public:
Baza2(){ Create(); }
~Baza2(){ Create(); }

void Build(){Create(); }

virtual void Create(int d = 0x10)


{
cout<<"B::Create: d = "<< d << endl;
}
};

class Derivat2:public Baza2


{
public:
Derivat2(){ }

virtual void Create(int d = 0x100)


{
cout<<"D::Create: d = "<< d << endl;
}
};
int main (int argc, char* argv[])
{
Baza2 *p = new Derivat2();
p->Build();
delete p;
return 0;
}

Raspuns:
B::Create: d = 16
D::Create: d = 16
B::Create: d = 16

9) EX Examen : Analizati cu atentie urmatorul fragment de cod sursa. Precizati care este efectul
apelarii metodei Create(), ce varianta a functiei se va apela si ce se afiseaza pe ecran?

Cod:
class A
{
protected:
int dim;
public:
A(){ cout<<"A::A()"<<endl;}

virtual ~A(){ cout<<"A::~A()"<<endl;}


void Create(int d = 0x10)
{
dim = d;
cout<<"A::Create("<<dim<<")"<<endl;
}
};

class B: public A
{
public:
B(){ cout<<"B::B()"<<endl;}
virtual ~B(){ cout<<"B::~B()"<<endl;}
virtual void Create(int d = 0x100)
{
dim = d;
cout<<"B::Create("<<dim<<")"<<endl;
}
};
int main(int argc, char* argv[])
{
A* p = new B();
p->Create( );
delete p;
return 0;
}

Raspuns:
A::Create(16)

10. Ex examen
Fie urmatorul program
class A{
public:
void s(){cout<<"void A::s()"<<endl;}
void s(int i){i++;cout<<"void A::s(int)"<<endl; }
virtual void v(){cout<<"virtual void A::v()"<<endl;}
virtual void v(int i){i++;cout<<"virtual void A::v(int)"<<endl;}
};
Care afirmatie este corecta:
A. Definitia virtual void v()supraincarca definitia virtual void v(int i)
b. Definitia virtual void v(int i) este incorecta deoarece exista o definitie pentru metoda v.
c. void v() este metoda ce va fi legata static.
d. in expresia p->v(); metoda v este legata static

11) EX Examen : Fie urmatoarea specificare de clasa: Cod:

class AbstractList{
public:

virtual void erase()=0;


virtual void put(AbstractElem* ae)=0;
virtual AbstractElem* get()=0;
virtual int isEmpty()=0;
virtual int isFull()=0;
};

Care declarare este corecta:


A) AbstractList *pa; -Corect
c) AbstractList *pa=new AbstractList();
d) AbstractList *pa=&a;

12) Ex restante si examen - 5 points - Fie urmatoarea specificare de clasa:

class AbstractList{
public:
virtual void erase()=0;
virtual void put(AbstractElem* ae){};
virtual AbstractElem* get(){};
virtual int isEmpty(){};
virtual int isFull(){};
};
Care afirmatie este corecta:

a) AbstractList este o clasa concreta


B)AbstractList este o clasa abstracta - Corect
c) isEmpty() este metoda virtuala pura
d) obiectele clasei pot fi construite cu AbstractList();

13) EX Examen :
Fie urmatorul program:
class A{
public:

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


void s(int i){i++;cout<<"void A::s(int)"<<endl; }

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


virtual void v(int i)
{i++;cout<<"virtual void A::v(int)"<<endl;}

};
class B:public A{
public:
// 1. supraincarcare metoda statica
int s(){cout<<"int B::s()"<<endl; return 1;}

// 2. specializare metoda statica


void s(int i){i++;cout<<"void B::s(int)"<<endl; }

// 3. specializare metoda virtuala


virtual void v(int i){i++;cout<<"virtual void B::v(int)"<<endl;}

// 4. supraincarcare metoda virtuala,


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

Care definitie este incorecta:


1.
2.
3.
4. // 4.supraincarcare metoda virtuala, - Corect
int void v(){count<<"int B::()"<<endl;return 1;}
14) EX Examen :
Fie urmatorul program:

class A{
public:
void m(){cout<<"A:m()"<<endl;};
virtual void v(){cout<<"A:v()"<<endl;};
};
class B: public A{
private:
void m(){cout<<"B:m()"<<endl;};
virtual void v(){cout<<"B:v()"<<endl;};
};

void main(){
A a,*p;
B b;
b.m();
b.v();

p=&b;
p->m();
p->v();

}
Care expresie este corecta:
a) b.m();
b) b.v();
c) p->f();
D) p->m(); - Corect
Raspunsul este p->m ( pentru ca p->f nu exista iar b.m si b.v sunt private.)

15) Ex restanta - 5 points

Fie urmatorul program:

class A{
public:
void m(){cout<<"A:m()"<<endl;};
virtual void v(){cout<<"A:v()"<<endl;};
};
class B: public A{
private:
void m(){cout<<"B:m()"<<endl;};
virtual void v(){cout<<"B:v()"<<endl;};
};
void main(){
A a,*p;
B b;
b.m();
b.v();
p=&a; p->m(); p->v();
p=&b; p->m(); p->v();
}
Care expresie este incorecta:
a) p=&a;
B) b.m();
c) p->m();
d) p->v();

16) EX Examen :

Fie programul :

#include <iostream.h>
class Cerc{
public:
Cerc(float r):raza(r){}
float getRaza(){return raza;}
void operator++(){raza++;}
private:
float raza;
};
class Cilindru: public Cerc{
public:
Cilindru(float raza, float inaltime):Cerc(raza), inaltime(inaltime){};
void operator++(){inaltime++;}
float getInaltime(){return inaltime;}
private:
float inaltime;
};
void main(){
Cerc *pc;
Cilindru c(1,5);
pc=&c;
++ *pc;
cout<<pc->getRaza()<<" "<<c.getInaltime()<<endl;
getch();
}
Programul afiseaza :
25
17) EX Examen :
Fie urmatoarea specificare de clase:

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;
};
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;
};

Metoda Complex:: operator float() este utilizata pentru :


a) Conversia unui numar real in obiect Complex
b) Conversia unui obiect Complex in obiect Punct
C) Conversia obiectelor Complex in numere reale
d) Conversia unui obiect Punct in obiect Complex

18) EX Examen
Fie programul:
class Persoana{
public:
Persoana(char * n){nume=n;}
void afisare(){cout<<nume<<endl;}
char *nume;
};
Constructorul Persoana(char *) poate fi utilizat pentru:
a. Conversia obiectelor Persoana in siruri de caractere
B Conversia sirurilor de caractere in obiecte Persoana
c. Construirea de siruri de caractere
d. Conversia obiectelor Complex in obiecte Persoana
EX. 19) Fie urmatoarea specificare de clase:
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;
};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;
}; Metoda Complex::
Conversia unui obiect Punct in obiect Complex

Ex. 20)
Fie programul:
class Persoana{
public:
Persoana(char * n){nume=n;}
void afisare(){cout<<nume<<endl;}
char *nume;
};
Constructorul Persoana(char *) poate fi utilizat pentru:
Conversia sirurilor de caractere in obiecte Persoana

Ex 21)
Fie urmatoarea specificare de clase:

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;
};
class Complex{
public:
Complex(float x=0, float y=0)x(x),y(y)()
operator Complex();
operator float(){return x;}
private:
float x,y;
};
Metoda Complex: operator float() este utilizata pentru:
Conversia unui obiect Complex in obiect Punct

Ex. 22)

Fie urmatorul program:


// Constructor cu semantica prin referinta
// Operatorul = este cel implicit
#include <iostream.h>
class C{
public:
C(int n=0, int v[]);
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= v;
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
a[0]= -100;
cout<<x<<endl;
}                                   
Programul afiseaza: -100 2 3   

Ex 23 ) EX Restante

Fie urmatorul program:


class C{
public:
C(int n=0, int v[]);
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= v;
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
a[0]=-100;
cout<<(x=y)<<endl;
}
Programul afiseaza:
a) 100 2 3
b) -100 2 3
C) 10 20
d)1 2 3

Ex 24
Fie urmatorul program:
// Constructor cu semantica prin referinta
// Operatorul = este cel implicit
#include <iostream.h>
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;
};
C::C(int n, int v[]) {
dim=n;
pi= v;
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
x=y;
y.set(0,-1000);
cout<<x<<endl;
}
Programul afiseaza: -1000 20

Ex 25.
Fie programul:
#include <iostream.h>
class Cerc{
public:
      Cerc(float r):raza(r){}
      float getRaza(){return raza;}
      Cerc operator++(){raza++;return *this;}// return by value
      Cerc operator--(){raza--;return *this;}// return by value
private:
      float raza;
};
void main(){
      Cerc c(1.0);
      cout<<(++(++c)).getRaza()<<” ”;     
      cout<<c.getRaza()<<” ”;             
      cout<<(--(--c)).getRaza()<<” ”;     
      cout<<c.getRaza()<<” ”;             
}              Programul afiseaza :    3 2 0 1   

Ex 26
Fie programul :
// Constructor cu semantica prin referinta
// Operatorul = cu semantica prin valoare si stergere destinatie
#include <iostream.h>
class C{
public:
C(int n=0, int v[]);
C& C::operator=(C& x);
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= v;
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
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;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
x=y ;
b[0]=-1000;
cout<<x<<endl;
} Programul afiseaza: 10 25
Ex 27)

Raspuns : ?

Nu este C ! si nici A, POATE D


Ex 28 - Raspuns 120

S-ar putea să vă placă și