Examen 2014
Examen 2014
Examen 2014
Note preliminaire:
Nous vous invitons a commenter le code et les reponses. En particulier, en cas dambiguite
de comprehension dune question, ajoutez toutes remarques et illustrations supplementaires
permettant dexpliquer votre demarche.
Sauf mention contraire explicite, on supposera que lon dispose dun systeme Linux stan-
dard fonctionnant correctement sur un PC recent 32 ou 64 bits (identiques aux conditions
de TP des PC de CPE: int etant encode sur 4 octets, pointeurs etant encodes respective-
ment sur 4(/8) octets sur 32(/64) bits).
On supposera que le code C++ est compile avec une version recente de g++ sous la norme
C++11 (ou ulterieure) identique aux conditions de TP des PC de CPE (avec loption -
std=c++0x).
On supposera dans chaque cas que les #include des en-tete standards necessaires a la
bonne compilation et execution des programmes decrits sont correctement installes et
appeles (ex. iostream, string, etc).
1
4ETI IMI [C++], 2013/2014, session 1
1 References
[15min max] 3 points
Soit le programme suivant:
4 int main()
5 {
6 int a=5;
7 f1(a);
8 f1(2*a);
9 f1(5);
10 f2(a);
11 f2(2*a);
12 f2(5);
13 f2(f1(a));
14 f1(f2(a));
15 }
Question 1 Indiquez (sur votre copie) pour chacune des lignes entre 7 et 14 si la ligne correspondante
est valide ou bien genere une erreur de compilation.
2 STL
[25min max] 3 points
Soit le programme suivant.
1 struct index
2 {
3 int x,y;
4 index(int x_arg,int y_arg):x(x_arg),y(y_arg){}
5 };
6
7 struct comparator
8 {
9 bool operator()(const index& i0,const index& i1) const
10 {
11 return i0.x+N*i0.y < i1.x+N*i1.y;
12 }
13 const int N=5;
14 };
15
16 int main()
17 {
18 std::vector<std::map<index,float,comparator> > T(2);
19 T[0][index(4,1)]=1.4;
20 T[0][index(3,0)]=2.1;
21 T[0][index(3,2)]=-1.1;
22 T[1][index(0,0)]=4.2;
23
24 return 0;
25 }
Question 2 Ecrivez un parcours complet sur lensemble des valeurs contenus dans la variable T. On
affichera ces valeurs dans lordre du vecteur puis de la map. On pourra utiliser les iterateurs. On
supposera que ce parcours est ecrit a partir de la ligne 23 de la fonction main().
Question 3 Ecrivez la trace dexecution correspondante, cest a dire, lordre dans lequel les valeurs vont
safficher.
3 Classe et template
[40 min max] 7 points
On souhaite definir une classe pouvant designer un nombre x irrationnel de maniere exacte
si il secrit sous la forme x = a + b n, avec a, b et n des nombres entiers.
On suppose pour cela que lon definit une classe dont les attributs prives sont a et b. n est
un parametre template de la classe.
On suppose que cette classe definit deux constructeurs. Un constructeur vide qui initialisera
les valeurs a et b a 0, et un constructeur ou lon passera deux parametres entiers initialisant a
et b.
Question 8 On souhaite que lappel a x0() renvoit la valeur approchee de ce nombre sous la forme
dun flottant. Donnez len-tete de la fonction ou methode permettant de realiser cela. Sous quelle forme
est-il le plus judicieux de definir le parametre de retour: float, float&, ou const float& ?
Supposons que x1 soit un nombre de type nombre_exact valant 3 + 6 2.
Question 11 Lorsque le parametre template n vaut 0, il est inutile de stocker la valeur correspondant a
la partie irrationelle. Afin de pouvoir economiser en espace memoire, definissez une specialization de la
classe nombre_exact qui ne stocke pas ce parametre lorsque n est nul.
4 Heritage
[40 min max] 7 points
On donne une classe Menu specialisee dans la gestion dun menu en mode texte. Elle
prend en charge laffichage du menu, la saisie du choix de lutilisateur, et lexecution du traite-
ment correspondant au choix de lutilisateur. Cette classe utilise des objets OptionMenu munis
dune methode Executer qui est appelee par lobjet Menu lors du choix de cette option.
Pour utiliser cette classe, il faut donc definir des classes derivees dOptionMenu et les ajouter
dans le menu. La classe OptionQuitter est definie pour gerer la sortie de lapplication.
Voici la declaration et la definition de ces differentes classes :
class OptionMenu
{
std::string Nom;
public:
bool fin=false;
while(!fin)
{
Afficher();
std::cout<<"Choix ? "<<std::endl;
unsigned int choix=-1;
std::cin>>choix;
if(choix<size())
fin=at(choix)->Executer();
else
std::cout<<"Choix invalide"<<std::endl;
}
}
char reponse;
std::cin>>reponse;
if(reponse==o)
return true;
return false;
}
Question 12 Schematisez graphiquement la relation entre les differentes classes de lapplication (dia-
gramme des classes). Expliquez pourquoi la methode Executer de la classe OptionMenu est virtuelle
pure.
Question 13 Ecrire une fonction principale (main) permettant dutiliser la classe Menu avec la seule
option Quitter. Donnez un resultat dexecution.
On souhaite desormais realiser une classe OptionEssai permettant de gerer une option
notee Essai dans le menu propose. Lorsque lon choisira Essai dans le nouveau menu, on af-
fichera simplement la phrase Vous avez selectionne loption essai.
Question 14 Declarez et definir en C++ la classe OptionEssai ainsi que ses methodes. Donnez la
nouvelle fonction principale permettant dutiliser cette classe.