Université de Nice-Sophia Antipolis POLYTECH
ELEC4 2018–2019
Examen de Programmation C++
Durée : 1h30 Aucun document autorisé
Mobiles interdits Nom : Prénom :
1 Question 1
I1. On considère que la classestd::stringn’existe pas, et on souhaite développer une classeString pour représenter les chaînes de caractères. Complétez la classeStringsuivante :
c l a s s String { p r o t e c t e d:
char *s; // les caractères de la chaîne i n t lg ; // sa longueur
};
avec :
1. leconstructeurqui permet, par exemple, la déclarationString s1("toto");
2.le constructeurqui permet, par exemple, la déclarationString s2 = s1;(attention, on obtient une nouvelle chaîne de caractères)
3. l’opérateurqui permet, par exemple,s2 = s1;(attention, on obtient une nouvelle chaîne de caractères)
4. l’opérateurqui permet d’accéder ou de modifier le ième (06i < lg) caractère de la chaîne courante. Vous émettrez l’exceptionIndexExceptionsi l’indice est incorrect.
5. l’opérateurqui permet d’écrires2 + s2(concaténation de deux chaînes) 6. la surcharge de l’opérateur<<
Note : vous pouvez utiliser les fonctionsstrlen,strcpyetstrcatdu langage C (#include<cstring>)
#pragma once
#i n c l u d e <cstring >
#i n c l u d e <string >
#i n c l u d e < exception >
c l a s s IndexException : p u b l i c std :: exception { p u b l i c:
c o n s t char* what () c o n s t noexcept override { r e t u r n " Bad index ";
} };
1
c l a s s String { p r i v a t e:
v oi d dupliquer (c o n s t String &s) {
t h i s-> st = new char[t h i s-> lg = s. lg +1];
strcpy (t h i s->st , s. st );
} p r o t e c t e d:
char * st ; // les caractères de la chaîne i n t lg ; // sa longueur
p u b l i c: //
String (char *s= (char *) "") : st (s), lg ( strlen (s )) {}
// constructeur de copie
String (c o n s t String &s) { dupliquer (s ); } // surcharge de l’opérateur d’affectation
c o n s t String &o p e r a t o r=(c o n s t String &s) { dupliquer (s ); } // opérateur d’accès au ième caractère
char &o p e r a t o r[] (c o n s t i n t i) {
i f (i <0 || i >=t h i s-> lg ) throw IndexException ();
r e t u r n t h i s-> st [i ];
}
// opérateur de concaténation : renvoie *this+s
c o n s t String o p e r a t o r+(c o n s t String &s) c o n s t { String rs ;
rs . st = new char[ rs . lg = t h i s-> lg + s. lg +1];
strcpy ( rs .st ,t h i s-> st );
rs . st = strcat ( rs .st , s. st );
r e t u r n rs ; }
// surcharge de l’opérateur de l’opérateur d’écriture «
f r i e n d std :: ostream &o p e r a t o r< <( std :: ostream &f , c o n s t String &s) { f o r (i n t i =0; i <s. lg ; i ++) f << s. st [i ];
r e t u r n f;
} };
. . . .
2 Question 2
On dispose d’une classe abstraite génériqueListeet d’une classe d’implémentation générique ListeChaineequi l’implémente à l’aide d’une structure d’éléments dynamiques chaînés.
On souhaite implémenter unepileà l’aide d’une liste. On rappelle que les méthodes disponibles sur une liste sont :
i n t longueur () c o n s t;
v oi d inserer (c o n s t T &x , c o n s t i n t r );
v oi d supprimer (c o n s t i n t r );
c o n s t T & ieme (i n t r) c o n s t;
I 2. Écrivez en C++ la classe abstraite génériquePileavec les quatre méthodes abstraitesestVide, empiler,dépiler, etsommet.
2
#pragma once
template <typename T >
c l a s s Pile { p u b l i c:
v i r t u a l b o o l estVide () c o n s t =0;
v i r t u a l vo id empiler (c o n s t T& x) =0;
v i r t u a l vo id depiler () =0;
v i r t u a l c o n s t T& sommet () c o n s t =0;
};
. . . . I3. En vous servant de la classeListeChainee, écrivez en C++ la classe génériquePileChainee qui implémente unePileà l’aide d’une liste chaînée. Vous programmez le(s) constructeur(s) et les quatre méthodes de manipulation d’une pile. Vous émettrez l’exceptionPileVideExceptionsi nécessaire.
#pragma once
#i n c l u d e " ListeChainee . hpp "
#i n c l u d e " Pile . hpp "
#i n c l u d e < exception >
c l a s s PileVideException : p u b l i c std :: exception { p u b l i c:
c o n s t char* what () c o n s t noexcept override { r e t u r n " Pile vide ";
} };
template <typename T >
c l a s s PileChainee : p u b l i c Pile <T > { p r i v a t e :
ListeChainee <T > p;
p u b l i c:
PileChainee () {}
// méthodes de base de manipulation de la pile b o o l estVide () c o n s t override {
r e t u r n p. longueur ()==0;
}
v oi d empiler (c o n s t T &x) override { p. inserer (x , 1);
}
v oi d depiler () override {
i f (t h i s-> estVide ()) throw PileVideException ();
p. supprimer (1);
}
c o n s t T & sommet () c o n s t override {
i f (t h i s-> estVide ()) throw PileVideException ();
r e t u r n p. ieme (1);
3
} };
. . . . I 4. Écrivez en C++ la fonctionmainqui teste votre classePileChînee, et en particulier attrape une
exception.
i n t main () {
PileChainee < string > pi ; pi . empiler (" toto ");
pi . empiler (" titi ");
std :: cout << pi << std :: endl ;
std :: cout << pi . sommet () << std :: endl ; pi . depiler ();
pi . depiler ();
t r y {
std :: cout << pi . sommet () << std :: endl ; }
c a t c h ( PileVideException &e) {
std :: cerr << " La pile est vide !!! " << std :: endl ; }r e t u r n EXIT_SUCCESS ;
}
. . . .
4