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