• Aucun résultat trouvé

Université de Nice-Sophia Antipolis POLYTECH

N/A
N/A
Protected

Academic year: 2022

Partager "Université de Nice-Sophia Antipolis POLYTECH"

Copied!
2
0
0

Texte intégral

(1)

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

(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

Références

Documents relatifs

Avec la notation de pointeur, écrivez en C la fonction somme qui prend en paramètre une chaîne de caractères qui représente un entier naturel et qui renvoie la somme de ses

Écrivez de façon itérative la fonction itos qui renvoie la conversion d’un entier positif ou nul passé en paramètre, en sa représentation sous forme d’une chaîne de

Écrivez un programme qui lit sur l’entrée standard une opération arithmétique formée de 2 entiers et d’un caractère ( ’+’ , ’-’ , ’*’ ou ’/’ ) et qui écrit sur

Écrivez la fonction creerFichDates qui lit un fichier de texte contenant la suites d’entiers, et qui crée un fichier de dates valides (de type Date ).. Sans l’écrire, vous

Au lieu de retirer, à chaque itération, 1 diviseur au dividende et d’incrémenter de 1 le quotient, le diviseur est multiplié successivement par 2 pour trouver son plus grand

qui prend en paramètre une chaîne de caractères, et qui remplace chaque chiffre par le caractère ’_’ dans celle-ci.. La fonction renvoie un pointeur sur le 1er caractère de

Il est nécessaire d’écrire un destructeur pour libérer explicitement la mémoire occupée par le tableau et les 3 points du triangle

En utilisant, la classe std::ifstream et ses méthodes is_open , get , eof et close , écrivez la classe FileInputStream qui permet de lire un fichier d’octets (et uniquement