Devoir Surveillé de Programmation Orientée Objets

École Nationale des Sciences de l'Informatique (ENSI)
Page 1 sur 6Lecteur de document UniversityLib

Devoir Surveillé de Programmation Orientée Objets

École Nationale des Sciences de l'Informatique (ENSI) · Programmation, Informatique · exam

Voir tous les documents en programmation

UNIVERSITE DE LA MANOUBA

----- -----

ECOLE NATIONALE DES SCIENCES

DE L'INFORMATIQUE

ANNEE UNIVERSITAIRE

2011-2012

Devoir surveill

Mati re : Programmation Orient e Objets

Niveau : II1

Enseignants : K. BEN RHOUMA, A. BEN HASSINE, W. CHAKER, O.

FAKHFAKH, I. FLISS, S. MTIBAA

Bar me : 3+ 7 + 10

Date : 17 mars 2012

Dur e: 2H

Documents : non autoris s

Nb pages : 8

Nom & Pr nom :................................................................................. Groupe :......................

Il sera tenu compte de la pr sentation et de la clart de vos r ponses

Exercice n 1

Donnez un tableau indiquant la valeur des variables g1, ptr, ptr1, et a apr s chacune des instructions

num rot es de 1 6.

int g1=2;

int *ptr;

int *& f3(int x)

{

int *& f3(int x=7);

int *f1(int &x)

{

int res=++x;

return (&res);

}

int &f2(int *p)

{

p=&g1;

(*p)++;

return *f3();

}

x++;

(*ptr)+=x;

return ptr;

}

void main()

{

1. ptr=&g1;

2. int &a=*ptr;

3. int *ptr1=f1(a);

4. *ptr1=f2(ptr);

5. (*ptr1)++;

6. a++;

}

Publicité

1/6

Exercice n 2

Soit les deux classes A et B suivantes :

class A {

int att;

public :

A () {

att = 0;

cout << "A::A()" << endl;

}

A (int n) {

att = n;

cout << "A::A(int) avec n=" << n <<

endl;

}

A (const A& a) {

att = a.att;

cout << "A::A(A&)" << att << endl;

}

class B

{

A ab;

int * i ;

public:

B() {

i= new int;

cout << "B::B()" << endl;

}

B(int a) {

cout << "B::B(" << a << ")" <<

endl;

i= new int;

ab = a;

}

B (A& t) : ab(t) {

cout << "B::B(A&) avec t" << endl;

}

void operator= (const A& a) {

att = a.att;

cout << "affectation d'un A avec " <<

att << endl;

}

A::~A()

{

cout << "A::~A()" << endl;

}

void afficher() const

{

cout << "A::afficher(" << att << ")"

<< endl;

Publicité

}

};

~B() {

cout << "B::~B()" << endl;

delete i;

}

A get_att() const {

return ab;

}

void afficher() const {

cout << "B::afficher()" << endl;

A a;

a.afficher();

}

};

Pour chacune des instructions suivantes appartenant un m me bloc, donnez sil y a lieu : laffichage

produit et ventuellement la ou les erreurs dans la gestion de la m moire (violation et/ou fuite) en

expliquant les causes.

A a1;

A a2(1);

A a3=a1;

a1=a2;

B b1(2);

b1.afficher();

b1.get_att().afficher();

B *b2;

b2->afficher();

b2= new B(5);

*b2=a3 ;

2/6

b1=*b2 ;

B b3 = b1 ;

Fin du bloc

Exercice n 3 :

Lobjectif de cet exercice est de d finir en C++ une mani re d valuer une expression. Une expression

est une suite de variables combin es par un ensemble d'op rateurs. Exemple E= A+B*C ; Pour viter

les parenth ses et garantir une criture non ambigu et une valuation facile, nous nous basons sur des

expressions post fix es. Dans ces expressions, lordre des priorit s des op rateurs est d termin par la

position des op rateurs dans les expressions. Donc, on naura pas chercher la priorit entre les

op rateurs. Dans les expressions post fix es lop rateur est plac apr s les op randes. Dans ce cas E

devient E= ABC * +. Ces expressions peuvent tre facilement valu es en utilisant les piles. Nous

consid rons dans le cadre de ce probl me que les op randes de lexpression valuer sont des

polyn mes.

Nous nous proposons donc, de consid rer le programme principal suivant :

int main ()

{

Polynome A(2), B(4), C(3), Poly_res ;

A.initialiser() ;

B.initialier() ;

C.initialiser() ;

Publicité

Expression E;

E= ABC *+ ;

Poly_res= E.evaluer_poly() ;

//affichage du polyn me r sultat

Return 0 ;

}

Premi re partie :

Nous proposons en premier lieu de d finir une classe Polynome permettant de manipuler

(addition, multiplication, soustraction, &) les polyn mes une variable et coefficients entiers

caract ris par un tableau dynamique de coefficients entiers tab et un degr N (entier) :

Un polyn me a une variable est de la forme : A= a0x^0+a1x^1+a2x^2+...+aNx^N avec Ne0 aN`0

o les ai sont les coefficients du polyn me.

Pour simplifier, on d finira seulement les op rations sur les polyn mes qui sont utiles pour

l valuation de lexpression, cest- -dire additionner deux polyn mes, multiplier deux polyn mes,

soustraire deux polyn mes. On se propose de d finir toutes ces op rations uniquement par des

op rateurs (+, , -). Rappelons que pour A= 5x^0-3x^1+ 1x^2 et B= 0x^0-2x^1+ 4*x^2

A+B=5x^0-5x^1+ 5*x^2

A-B=5x^0-1x^1-3*x^2

AB=0x^0-10x^1+ 26x^2- 14x^3+4x^4

Travail faire

Donnez la d claration et limpl mentation de la classe Polynome. Il sagit de :

1) D finir les attributs n cessaires de la classe Polynome.

2) Donner le corps du constructeur ayant un argument N (degr du polyn me et qui par d faut est

gal 0).

3/6

3) Nous proposons dajouter une m thode dinitialisation init du polyn me. Cette m thode

permet lutilisateur de saisir au clavier le degr du polyn me et ses coefficients.

Donnez la d claration + le corps de la m thode init.

4) Pensez-vous quil est utile de d finir un destructeur ? Dans laffirmative, donnez son corps.

5) Donnez les d clarations et les impl mentations de toutes les op rations de manipulation de

polyn me. Notez que toutes ces op rations doivent tre d finies uniquement par des

op rateurs (+, *, -).

4/6

Nom & Pr nom :.......................................................................... Groupe :......................

6) Pour laffichage dun polyn me de degr N, il sagit de lafficher sous la forme

a0x^0+a1x^1+a2x^2+...+aNx^N. Par exemple pour un polyn me P de degr 3, avec tab= {1,

2, 1, 3}, laffichage sera :

1 x^0+ 2 x^1+1 x^2+3 x^3.

Donnez la d finition et limpl mentation dune m thode ou dune fonction permettant laffichage

dun polyn me (vous pouvez choisir entre la d finition dune m thode affichage ou bien la surcharge

de lop rateur << permettant laffichage dun polyn me par le biais de flux d'E/S (iostream).)

Deuxi me partie :

Nous nous proposons maintenant de d finir une classe Expression repr sentant les expressions

post fix es. Dans ce probl me, une expression post fix e est form dun ensemble dop randes

polynomiales suivi dun ensemble dop rateurs (+, *, -). Les op randes de lexpression sont stock s

dans une pile de polyn mes et ses op rateurs sont stock s dans une pile dop rateurs. Pour cela nous

nous basons sur les d finitions des classes Pile_oper (Pile dop rateurs consid r s comme des

caract res), Pile_poly (Pile de polyn mes) suivantes :

Class Pile_oper {

public:

Publicité

Pile_poly {

public:

Pile_oper ();

~Pile_oper ();

~ Pile_poly ();

Pile_poly ();

void empiler(char);

char depiler();

bool estVide();

char getSommet();

int size();

char *tab;

int taille;

private:

void empiler(Polynome);

Polynome depiler();

bool estVide();

Polynome getSommet();

int size();

private:

Polynome *tab;

int taille;

int indice;

} ;

int indice;

} ;

Pour simplifier, on se contentera de d finir les op rations de base sur les expressions savoir la

construction et la destruction en plus des op rations daffectation dexpression et d valuation des

expressions. Laffectation dune expression revient parcourir lexpression affect e (source) de

gauche droite et de :

" Empiler les op randes que l'on rencontre dans la pile des polyn mes de lexpression

destination.

" Empiler les op rateurs que l'on rencontre dans la pile des op rateurs de lexpression

destination.

L valuation dune expression est donn e gr ce la m thode evaluer_poly() qui permet d valuer une

expression et retourne un polyn me r sultat suivant , il sagit de :

" D piler un op rateur de la pile des op rateurs

" Lorsque l'on rencontre un op rateur binaire (+, *, -), il faut:

" D piler les deux derniers polyn mes stock s dans la pile des polyn mes

" Appliquer lop rateur sur les polyn mes d pil s

" Empiler le r sultat dans la pile des polyn mes

" Continuer le d pilement de la pile des op rateurs et lapplication de lop rateur, une fois la pile

des op rateurs est vide, le polyn me r sultat devrait tre d pil et affich .

Travail faire

7) Donnez la d claration (fichier dent te .h) de la classe Expression.

5/6

8) Donnez limpl mentation de cette classe (le fichier .cpp).

6/6