Sunteți pe pagina 1din 35

TSE 1

Programmation oriente objet en C++ Exercices dapplication du cours


Christophe DUCOTTET Professeur

Telecom Saint-Etienne 25 rue du Docteur Rmy Annino 42000 Saint-Etienne Email : ducottet@univ-st-etienne.fr

UTILISATION DU FASCICULE
Ce fascicule dexercice est destin accompagner le cours de Programmation oriente objet en C++. Il sera utilis pendant les cours pour illustrer les notions qui sont prsentes et en travaux dirigs pour mettre en pratique ces notions.

EXERCICES DU COURS
La premire partie du fascicule contient les noncs des exercices proposs la fin de chaque sance de cours. Vous devez prparer lexercice de la sance n pour la sance n+1. Vous pourrez ainsi vrifier que vous avez bien compris les points de cours prsents. En cas de besoin, vous pouvez poser des questions sur le forum du portail pdagogique. Chaque exercice est corrig au dbut de la sance n+1. A cette occasion, les rponses aux questions poses en cours et sur le forum sont donnes.
TRAVAUX DIRIGES

La deuxime partie du fascicule contient les noncs des exercices des 5 sances de travaux dirigs (TD). Pendant ces sances les exercices seront tudis et implants sur machine. Vous devez prparer chaque sances de TD. Vous pouvez pour cela remplir les cadres rponse de lnonc du TD et/ou prparer vos fichiers sources sur clef USB. Pendant la sance, vous devrez complter et modifier ces rponses et dposer tous vos fichiers sources (.cpp + .h avec commentaires) sur le portail dans une archive au format zip.

EXERCICES SUPPLEMENTAIRES
La troisime partie du fascicule contient des exercices classs en fonction des chapitres du cours. Ils pourront tre traits en guise dentranement (ils ne seront pas corrigs).

-3-

Exercices du cours
A prparer avant chaque sance de cours

-5-

SEANCE 1
a) Ecrire un programme qui manipule un tableau dynamique de rels pour stocker les notes dun tudiant. Ce programme sera dcompos en 3 parties : 1. On demande le nombre de notes et on dclare le tableau 2. On demandes les notes et on les stocke dans le tableau 3. On calcule la moyenne puis on affiche le rsultat. Rcrire le programme prcdent en utilisant un tableau gr par la classe TableauInt.

SEANCE 2
Dans cet exercice, on utilisera la classe TableauInt du cours pour manipuler des tableaux dentiers. a) b) Ecrire une fonction ConcatenerTableaux ayant 2 tableaux t1 et t2 en paramtres et qui agrandit le tableau t1 pour lui ajouter la fin les lments de t2. Ecrire une fonction SeparerTableaux ayant en paramtre 2 tableaux t1 et t2 et une taille n. Elle devra raccourcir le tableau t1 pour quil ne contienne que les n premiers lments et transfrer les lments supprims dans le tableau t2. Ecrire un programme permettant de tester les fonctions prcdentes.

b)

c)

-7-

SEANCE 3
Reprendre les questions de lexercice de la sance 2 en utilisant le modle de classe vector de la STL pour manipuler des tableaux dentiers.

SEANCE 4
Exercice 4.1 En utilisant la classe string de la STL, crire une fonction ExtrairePremierMot qui, partir dune chane en paramtre dentre, retourne (en paramtre de retour) une chane contenant le premier mot de la chane dentre (caractres jusquau premier espace). Exercice 4.2 Pour manipuler l'ensemble des tudiants de TSE, on utilise la classe Etudiant donne en exemple dans le paragraphe 1.3 du cours. a) Quelle modification doit-on faire dans cette classe pour pouvoir crer un tableau d'tudiants partir du modle de classe vector de la STL ? Comment se fait alors l'initialisation d'un tudiant dans le tableau ? Donner un exemple d'utilisation prsentant la dclaration d'un tableau, l'ajout de plusieurs tudiants, et l'affichage de tous les tudiants. Reprendre la question b) partir d'un tableau de pointeurs (en utilisant toujours le modle).

b) c)

-8-

SEANCE 5
On reprend lexemple du paragraphe 3.2.2 du cours : il sagit dcrire une application capable de saisir les notes d'un tudiant pour un ensemble de matires que suit cet tudiant, puis de calculer la moyenne gnrale de l'tudiant. Les diffrents cas dutilisation identifis pour lapplication sont : 1. 2. 3. a) b) ajout d'une matire, saisie des notes pour lensemble des matires, calcul de la moyenne gnrale.

SEANCE 6
Dans lapplication de gestion des notes (exercice de la sance 5), on veut concevoir deux classes permettant de rpondre aux 3 cas dutilisation : la classe Matiere qui est conue pour grer les caractristiques dune matire : nom de la matire, coefficient, note obtenue pour cette matire ; la classe Semestre qui permet de regrouper les matires que suit un tudiant, puis den calculer la moyenne. a) b) c) Faire un diagramme de classe en utilisant une relation dassociation multiple entre les 2 classes prcdentes (ne pas faire figurer les mthodes des classes). Identifier les mthodes permettant de rpondre aux cas dutilisation, dterminer leurs paramtres et crire un programme principal. Donner le diagramme de classe dtaill de chaque classe.

Faire le diagramme de collaboration correspondant au cas 2 : saisie des notes. On pourra pour cela utiliser des objets dj identifis dans le cas 1. Prciser le rle des objets et des messages intervenant dans ce diagramme.

-9-

SEANCE 7
Dans le contexte des exercices des sances 5 et 6, on sintresse la conception et limplantation en C++ de la classe Semestre. Cette classe sera conue comme un agrgat multiple dobjets de classe Matiere. La classe Matiere ne sera pas tudie dans lexercice. a) b) c) Faire le diagramme de classe de ces deux classes sans faire figurer les champs ni les mthodes de la classe Matiere. Ecrire un programme de test. Dclarer la classe Semestre, dfinir son constructeur, son destructeur, et sa mthode AjouterMatiere.

SEANCE 8
Soit la classe Point dfinie par : class Point { int X; int Y; public : Point(int x=0,int y=0) {X=x;Y=y;} void Afficher() {cout<<"Point ("<<X<<", "<<Y<<")"<<endl;} int LireX() {return X;} int LireY() {return Y;} }; a) On veut dfinir une classe PointN drive de la classe Point qui associe un nom un point (le nom est un objet string). Elle devra avoir un constructeur et une mthode ChangerNom pour changer le nom du point. Donner le diagramme de classe et l'implantation de la classe en C++. Rajouter une mthode AfficherN qui affiche les caractristiques du PointN (nom et coordonnes). Redfinir la mthode Afficher pour afficher les caractristiques dun PointN. Donner un exemple dutilisation.

b) c)

- 10 -

SEANCE 9
On veut crire un programme qui affiche une table donnant les valeurs de sin(x) pour x compris entre 0 et 360 degrs. On devra demander l'utilisateur quel incrment en degrs il souhaite et avec quelle prcision il veut voir afficher les valeurs (nombre de chiffres aprs la virgule). La table sera alors affiche sur 2 colonnes correspondant x (en degr) et la valeur de sin(x). Les colonnes devront tre bien alignes l'affichage. a) b) Ecrire le programme en utilisant les fonctions d'entres-sorties du C++. Modifier le programme pour crire les rsultats dans un fichier texte plutt que sur la console standard.

SEANCE 10
On se place dans le contexte de lapplication de gestion des notes des exercices des sances 6 et 7. On veut ajouter aux deux classes Matiere et Semestre deux mthodes Sauver(os : ofstream&) et Charger(is : ifstream&) responsables respectivement de la sauvegarde et de la relecture sur flux fichier (en mode texte) des donnes gres par ces classes. a) b) c) Ecrire un programme de test illustrant lutilisation des mthodes Charger et Sauver de la classe Semestre. Dfinir les 2 mthodes Charger et Sauver de la classe Matiere. Dfinir les 2 mthodes Charger et Sauver de la classe Semestre.

- 11 -

SEANCE 11
Dans cet exercice, on utilise la mise en uvre d'une liste d'entiers utilisant les classes ListeInt et ElementListe du paragraphe 5.3.1. a) b) c) Ecrire une fonction Afficher qui affiche le contenu d'une liste passe en paramtre. Ecrire une fonction Supprimer qui, partir dune liste et dune valeur passes en paramtres, recherche le 1er lment de la liste ayant cette valeur et le supprime de la liste. Ecrire un programme de test des 2 fonctions prcdentes

SEANCE 12
Dans cet exercice, on utilise la mise en uvre d'une liste utilisant les modles de classe list et iterator de la STL. a) b) c) Ecrire une fonction Afficher qui affiche le contenu d'une liste d'entiers passe en paramtre. Ecrire une fonction Concatner qui ajoute les lments d'une liste d'entiers l2 la suite des lments d'une liste d'entiers l1 existante. Ecrire un programme de test des 2 fonctions prcdentes.

- 12 -

Travaux dirigs
A prparer avant chaque sance de TD

- 13 -

TD 1 1H30
Note : Vous pouvez utiliser les cadres pour rpondre aux questions lors de la prparation et lors de la sance.

b) Ecrire une fonction Afficher qui affiche sur la console le contenu d'un objet vector<double>. Modifier le programme prcdent pour qu'il utilise cette fonction. Reporter la dfinition de la fonction dans le cadre suivant.

Objectif de la sance L'objectif de cette sance est d'apprendre manipuler les tableaux dynamiques partir des classes et modles de classes de la bibliothque standard du C++ (STL). Vous pourrez utiliser le cours et vous reporter au site internet http://www.cplusplus.com/reference/ qui dcrit l'ensemble des classes de la STL. Au fur et mesure de la sance, vous devez faire les manipulations proposes sur votre PC (sous Microsoft Visual Studio) et rpondre aux questions en remplissant les cadres prvus cet effet. Partie 1 : le modle de classe vector Le modle de classe vector permet de manipuler des tableaux dynamiques d'lments. Les fonctionnalits de ce modle sont dcrites p.14 dans le cours. a) Crer un projet exemple_vector de type Application console Win32 et un fichier source exemple_vector.cpp associ ce projet. Dans ce fichier, crire un programme main qui utilise le modle vector pour dclarer un vecteur de 5 rels (double), qui remplit ce vecteur avec des valeurs fixes, et affiche le contenu du tableau. Compiler le programme et lorsqu'il fonctionne, le recopier dans le cadre ci-dessous. c) Modifier le programme prcdent pour qu'il ajoute des lments supplmentaires la fin du vecteur partir de la mthode push_back. Afficher chaque fois le tableau pour contrler le rsultat. Tester de mme l'action des mthodes pop_back et clear. d) On veut maintenant raliser l'insertion d'un lments une position quelconque dans le tableau, la position d'insertion et la valeur insrer tant demandes l'utilisateur. Modifier le programme prcdent pour raliser cette insertion. e) A partir du code prcdent ralisant l'insertion, crire une fonction Inserer qui insre, un lment dont la valeur et la position sont donnes en paramtre. Modifier le programme pour qu'il appelle cette fonction pour raliser l'insertion. Reporter ci-dessous la dfinition de la fonction.

- 15 -

f) Question facultative : ajouter et tester une fonction Supprimer qui supprime, dans un objet tableau de rels, un lment une position donne en paramtre. Modifier le programme pour qu'il appelle cette fonction et qu'il affiche le tableau aprs modification. Partie 2 : la classe string On s'intresse maintenant la classe string permettant de manipuler une chane de caractres dynamique. Cette classe est dcrite p.17 dans le cours. a) Crer un nouveau projet exemple_string de type Application console Win32 et un fichier source exemple_string.cpp associ ce projet. Dans ce fichier, crire un programme main qui utilise la classe string pour dclarer une chane de caractres, demander sa valeur l'utilisateur, puis afficher la taille de la chane, puis sa valeur. b) Pour pouvoir saisir sur la console une chane comportant des espaces, il faut utiliser la fonction getline. Modifier le programme prcdent pour permettre la saisie d'une phrase comportant des espaces. Ecrire le programme correspondant dans le cadre ci-dessous.

c) A partir des mthodes find_first_of et substr, crire une boucle qui affiche un par un les mots de la chane (on supposera que les mots sont spars par un caractre espace). d) En utilisant la mthode find_last_of, crire une boucle qui affiche ces mots dans l'ordre inverse (en commenant par la fin). e) Ecrire une fonction CompterMots qui permet de retourner le nombre de mots d'une chane donne en paramtre. Modifier le programme pour qu'il appelle cette fonction et affiche le rsultat. Ecrire la fonction et le programme complet dans le cadre ci-contre.

- 16 -

TD 2 3H
Note : Vous pouvez utiliser les cadres pour rpondre aux questions lors de la prparation et lors de la sance.

Objectif de la sance L'objectif de cette sance est d'tudier les relations de composition et d'agrgation entre les classes. On s'appuiera pour cela sur l'exemple de l'application de gestion des notes vue en cours et dans les exercices. Vous pourrez donc vous rfrer aux corrections correspondantes. Au fur et mesure de la sance, vous devez faire les manipulations proposes sur votre PC (sous Visual Studio) et rpondre aux questions en remplissant les cadres prvus cet effet. On rappelle qu'il sagit dcrire une application capable de saisir les notes d'un tudiant pour un ensemble de matires que suit cet tudiant, puis de calculer la moyenne gnrale de l'tudiant. Les diffrents cas dutilisation identifis pour lapplication sont : 1. 2. 3. dfinition des matires que suit l'tudiant, saisie des notes pour lensemble des matires, calcul de la moyenne gnrale. la classe Matiere qui est conue pour grer les caractristiques dune matire : nom de la matire, coefficient, note obtenue pour cette matire ; la classe Semestre qui permet de regrouper les matires que suit un tudiant, puis den calculer la moyenne. b) Ecrire un programme de test de cette classe. c) Dclarer et dfinir la classe et toutes ses mthodes. d) Compiler et tester. Partie 2 : la classe Semestre On s'intresse maintenant la classe Semestre qui permet de regrouper les matires que suit un tudiant, puis den calculer la moyenne. Cette classe sera conue comme un agrgat multiple dobjets de classe Matiere a) Faire ci dessous le diagramme de classe de la classe Semestre en faisant apparatre la relation d'agrgation. Ne pas faire figurer les champs et les mthodes de la classe Matiere.

On veut concevoir deux classes permettant de rpondre aux 3 cas dutilisation :

Les diffrents fichiers de l'application seront insrs dans un projet de type Application console Win32 intitul Calcul_moyenne qui devra tre cr au dbut de la sance. Pour chaque classe, vous devrez crer un fichier de dclaration (.h) et le fichier de dfinition correspondant (.cpp). Ces fichiers porteront le mme nom que la classe. Les programmes de test de chaque classe seront conservs dans des fichiers spars (le fichier test de la classe truc sera intitul test_truc.cpp). Vous devrez conserver tous les fichiers sources qui seront rutiliss dans d'autres sances de TD. Partie 1 : la classe Matire On s'intresse ici la conception de la classe Matire qui est conue pour grer les caractristiques dune matire. Cette classe sera en composition avec le classe string pour grer le nom de la matire. a) Dans le cadre ci-dessous, faire le diagramme de cette classe en prvoyant la composition ainsi que les champs et les mthodes ncessaires aux trois scnarios d'utilisation. Prvoir aussi un constructeur avec tous les paramtres permettant d'initialiser tous les champs. b) Ecrire un programme de test de la classe Semestre qui correspond au scnario 1 de dfinition des matires. - 17 -

c) Dclarer et dfinir la classe et les mthodes intervenant dans le scnario prcdent. d) Compiler et tester. Partie 3 : Le calcul de la moyenne a) Modifier le programme de test pour que les matires ne soient plus saisies par l'utilisateur, mais qu'elles soient dfinies directement dans le programme avec des valeurs fixes pour le nom et le coefficient de chaque matire. b) Ajouter dans le programme de test les instructions pour rpondre aux scnarios 2 et 3. c) Dfinir et tester les mthodes permettant de rpondre aux scnarios 2 et 3. Partie 4 : L'application de calcul de la moyenne On s'intresse maintenant l'application permettant de rpondre aux 3 scnarios dfinis dans l'nonc. Le programme principal correspondant cette application sera crit dans un fichier main.cpp. a) Ecrire une fonction Menu charge d'afficher un menu prsentant les options correspondant aux 3 scnarios de l'nonc plus une option quitter permettant de sortir de l'application. Cette fonction devra demander l'utilisateur de faire un choix et elle devra retourner un entier correspondant au choix qu'il a fait. b) Ecrire le programme principal de l'application et tester le rsultat (utiliser une instruction switch pour traiter les choix de l'utilisateur). Partie 5 : Modifier les matires Pour faciliter la saisie et la modification des matires, on veut modifier le scnario 1 en permettant l'utilisateur d'ajouter ou de supprimer des matires dans le semestre. Ainsi, lorsqu'il choisira l'option correspondante dans le menu, il pourra voir la liste des matires dj saisies et il lui sera propos d'en ajouter ou d'en supprimer une (l'ajout se fera systmatiquement la fin alors que la suppression se fera n'importe o). a) Donner le diagramme de collaboration de ce scnario b) Modifier la classe Semestre (ventuellement Matiere) pour pouvoir rpondre au nouveau scnario. Ecrire dans le cadre ci-dessous la dfinition de la mthode Semestre::Supprimer.

c) Modifier le programme principal pour rpondre au nouveau scnario.

- 18 -

TD 3 3H
Note : Vous pouvez utiliser les cadres pour rpondre aux questions lors de la prparation et lors de la sance.

Introduction Le but de cette sance est d'tudier le mcanisme d'hritage et les mthodes virtuelles. On reprendra l'exemple de l'application de calcul des notes et on lui ajoutera un menu utilisant ces mcanismes. On rappelle les diffrents cas dutilisation identifis pour lapplication : 1. 2. 3. dfinition des matires que suit l'tudiant, saisie des notes pour lensemble des matires, calcul de la moyenne gnrale.

Vous devez d'abord tlcharger les fichiers sources se trouvant sur le portail, puis effectuer les manipulations proposes et rpondre aux questions. Partie 1 On s'intresse ici aux classes Matiere et Semestre et au programme de test de ces classes situ dans le fichier test_semestre.cpp. Les classes ont t dclares et dfinies dans les fichiers matiere.h, matiere.cpp, semestre.h, semestre.cpp en suivant les directives du TD2. a) Faire un projet application_moyenne permettant de compiler ce programme de test. Ce projet sera utilis tout le long de la sance (utiliser l'option Fichier-Nouveau-Projet partir de code existant). b) Compiler, excuter le programme et vrifier son fonctionnement. Partie 2 On s'intresse aux classes Menu, OptionMenu, aux classes drives de OptionMenu (fichiers menu.h, menu.cpp, optionmenu.h, optionmenu.cpp) et au programme de test situ dans le fichier test_menu.cpp. a) Modifier le projet pour compiler ce programme de test et l'excuter. b) Faire le diagramme des classes de l'application. d) Pourquoi la mthode Executer de OptionMenu est-elle virtuelle ? c) Pourquoi la classe Menu est-elle drive de vector<OptionMenu *> ?

- 19 -

Partie 3 On veut utiliser les classes des 2 parties prcdentes pour faire l'application prsente en introduction. Pour cette application, on ajoutera les fichiers suivants : main.cpp : qui contiendra le programme principal, mesoptions.h : qui contiendra les dclarations des nouvelles options de menu, mesoptions.cpp : qui contiendra les dfinitions des nouvelles options de menu. a) Chaque cas d'utilisation donnera lieu une nouvelle classe drive de OptionMenu qui dfinira une mthode Executer associe. Toutes ces classes drives auront besoin de communiquer avec un objet Semestre qui sera dclar dans le programme main. Pour cela, on mettra en place une association entre Semestre et les classes drives de OptionMenu. Faire un diagramme de classe traduisant cette association et impliquant la classe OptionSaisirMatiere charge du cas 1. c) Donner le nouveau programme principal.

b) Donner la dclaration et la dfinition de la classe OptionSaisirMatiere.

d) Crer les fichiers mesoptions.h et mesoptions.cpp avec la classe OptionSaisirMatiere, crer le programme principal, compiler et excuter. e) Ajouter les classes OptionMenu ncessaires pour les autres cas d'utilisation. Compiler et excuter.

- 20 -

TD 4 3H
Note : Vous pouvez utiliser les cadres pour rpondre aux questions lors de la prparation et lors de la sance.

Introduction Le but de cette sance est d'tudier les fichiers. On utilisera aussi les classes de la sance prcdente. Vous pouvez rcuprer les fichiers correspondants sur le portail (fichiers de la sance td3). Partie 1 Dans cette partie, on n'utilisera pas les classes Matiere et Semestre et on travaillera avec un fichier test_fich.cpp et un projet du mme nom permettant de compiler en mode console. a) Ecrire un programme qui cre un fichier texte et crit une srie de notes (des rels) dans ce fichier. Les notes seront demandes l'utilisateur au fur et mesure qu'elles seront crites dans le fichier.

d) Modifier le fichier texte dans un diteur (pour ajouter ou enlever des notes) et vrifier que le programme de lecture fonctionne bien avec ce nouveau fichier. e) Refaire les questions a), b) et c) en utilisant un fichier binaire au lieu d'un fichier texte. Pour l'tape b) vous pourrez ouvrir le fichier binaire cr avec l'diteur de visual C++ et interprter le rsultat obtenu. Ecrire dans le cadre suivant les modifications ralises.

b) Ouvrir le fichier et contrler l'enregistrement des notes. c) Ecrire un autre programme qui ouvre le fichier prcdent en lecture, rcupre la valeur des notes, les affiche et calcule la moyenne (les notes ne seront pas stockes par le programme).

- 21 -

Partie 2 On veut ajouter aux classes Matiere et Semestre des fonctionnalits d'enregistrement sur fichier texte et de relecture des informations. Pour cela, comme cela est expliqu dans le cours, on utilisera 2 fonctions Charger et Sauver dans chaque classe. On travaillera ici avec un nouveau projet test_fich_objet. a) Ajouter les 2 mthodes dans la classe Matiere (en modifiant les fichiers matiere.cpp et matiere.h).

c) Ajouter les 2 mthodes dans la classe Semestre (en modifiant les fichiers semestre.cpp et semestre.h)

d) Ecrire un programme permettant de tester ces mthodes. Partie 3 b) Ecrire un programme permettant de tester ces mthodes. Modifier l'application de saisie des notes ralise dans la sance 2 ou la sance 3 pour ajouter 2 options dans le menu pour permettre d'enregistrer et de relire les matires et les notes dans un fichier texte.

- 22 -

TD 5 1H30
Note : Vous pouvez utiliser les cadres pour rpondre aux questions lors de la prparation et lors de la sance.

Objectif de la sance L'objectif de cette sance est d'apprendre manipuler les listes et les itrateurs partir du modle de classe list de la bibliothque standard du C++ (STL). Vous pourrez utiliser le cours et vous reporter au site internet http://www.cplusplus.com/reference/ qui dcrit l'ensemble des classes de la STL. Partie 1 : le modle de classe list Le modle de classe list permet de manipuler une liste d'lments de type quelconque. Pour parcourir une liste, il faut utiliser un itrateur de liste. a) Crer un projet exemple_liste de type Application console Win32 et un fichier source exemple_liste.cpp associ ce projet. Dans ce fichier, crire un programme main qui dclare une liste d'entiers, rempli cette liste avec des valeurs fixes, et affiche le contenu de la liste. Compiler et excuter le programme. b) Ecrire une fonction Afficher qui affiche sur la console le contenu d'un objet list<int>. Modifier le programme prcdent pour qu'il utilise cette fonction. Reporter la dfinition de la fonction dans le cadre suivant.

c) Ecrire et tester une fonction Concatener qui ajoute les lments d'une liste d'entiers l2 la suite des lments d'une liste d'entiers l1 existante. Reporter ci-dessous la dfinition de la fonction et le programme de test. - 23 -

Partie 2 : une liste de matires On va maintenant utiliser une liste pour grer des objets Matiere. Vous devez d'abord rcuprer les fichiers de la classe Matire dj utilise dans les sances prcdentes. Crer ensuite un nouveau projet liste_matiere et le fichier source liste_matiere.cpp associ. a) Ecrire un programme main qui cre une liste d'objets Matiere, qui rempli cette liste avec des matires initialises avec des valeurs fixes et qui affiche le contenu de la liste. b) Quel type de relation a-t-on entre la classe liste et la classe matire ? Quel est l'avantage d'utiliser une liste ? Inscrire les rponses dans le cadre ci-dessous.

c) Ecrire et tester une fonction CalculerMoyenne qui a comme paramtre d'entre une liste de matires et qui retourne la moyenne des notes en paramtre de sortie. Reporter la dfinition de la fonction et le programme de test dans le cadre ci-dessous.

- 24 -

Exercices supplmentaires
Classs par thme

- 25 -

EXERCICES SUR LES TABLEAUX DYNAMIQUES


EXERCICE 1
Cet exercice porte sur les tableaux dynamiques dclars directement sans utiliser les classes TableauInt ou vector. a) Ecrire une fonction CreerTableau qui cre un tableau dynamique de rels de taille donne en paramtre et l'initialise avec une valeur donne en paramtre. L'adresse du tableau devra tre disponible la sortie de la fonction. Donner programme de test de la fonction CreeTableau.

a) b)

Faire un schma reprsentant la structure mmoire d'un tableau 2 indices. Ecrire un programme qui dclare, initialise, affiche puis dtruit un tableau 2 indices construit partir d'un tableau local de 10 pointeurs et de 10 tableaux dynamiques de lignes de m rels (la valeur de m et la valeur d'initialisation du tableau sont demandes l'utilisateur). Expliquer l'accs aux lments du tableau l'aide de l'oprateur [ ] [ ]. Reprendre la question b) avec un tableau dynamique de pointeurs : le tableau est alors constitu d'un tableau dynamique de n pointeurs de lignes dynamiques de taille m (m sera demand l'utilisateur).

c)

b)

Question 2 On veut faire une classe Tableau2D permettant de manipuler un tableau dynamique de rels 2 indices en utilisant le mme principe que la question 1c). Les 2 dimensions du tableau sont variables. a) Donner le schma de la classe Tableau2D en faisant figurer les mthodes suivantes : un constructeur ayant les 2 dimensions du tableau en paramtre, un destructeur, deux mthode LireElement et ChangerElement charges respectivement de retourner la valeur de l'lment d'indice (i,j) et de changer sa valeur, une mthode Afficher charge d'afficher la valeur de tous les lments. Donner la dclaration et la dfinition de la classe Tableau2D. Donner un programme de test illustrant le fonctionnement de la classe.

EXERCICE 2
Cet exercice porte sur les tableaux dynamiques dclars directement sans utiliser les classes TableauInt ou vector. a) Ecrire une fonction Concatener qui ralise la concatnation de 2 tableaux donns en paramtre en mettant le rsultat dans un troisime tableau dynamique qui sera disponible la sortie de la fonction (la concatnation consiste mettre les deux tableaux "bout bout"). Les paramtres de cette fonction devront comporter la taille des tableaux. Donner un programme de test de la fonction Concatener.

b)

EXERCICE 3
Toutes les questions de cet exercice doivent utiliser le modle de classe vector de la STL avec les mthodes prsentes dans le cours. a) b) c) Ecrire une fonction Inserer qui insre, dans un objet tableau de rels, un lment une position donne en paramtre. Donner un programme de test. Ecrire une fonction Supprimer qui supprime, dans un objet tableau de rels, un lment une position donne en paramtre. Donner un programme de test. Ecrire une deuxime version de la fonction Inserer qui permet d'insrer, une position donne, non plus un seul lment, mais un ensemble d'lments donns dans un autre objet tableau. Ecrire un programme de test.

b) c)

Question 3 On veut utiliser le modle de classe vector de la STL pour construire un tableau dynamique de rels 2 indices. Ce tableau sera donc construit comme un tableau de tableaux de rels. a) Ecrire un programme qui dclare, initialise, affiche puis dtruit un tableau 2 indices de tailles (m,n) demandes l'utilisateur. Expliquer l'accs aux lments du tableau l'aide de l'oprateur [ ] [ ]. Dclarer et dfinir une classe Tableau2D du mme type que celle de la question 2 et utilisant le modle de classe vector.

b)

EXERCICE 4
Dans cet exercice, on tudie diffrentes possibilits pour manipuler un tableau dynamique de rels 2 indices. Ce tableau pourrait servir par exemple stocker les coefficients d'une matrice. Dans les questions 1 et 2, on utilisera des tableaux dynamiques dclars directement sans utiliser les classes TableauInt ou vector. Dans la question 3, on utilisera le modle de classe vector de la STL. Question 1 Un tableau de rels 2 indice peut tre considr comme un tableau 1 indice (dit tableau de lignes) dont chaque lment est lui mme un tableau de rels 1 indice (reprsentant une ligne de rels). Le tableau de lignes doit pouvoir manipuler un ensemble de tableaux, il doit donc tre un tableau de pointeurs : chaque lment de ce tableau contient l'adresse d'une ligne. - 27 b) c)

EXERCICE 5
Pour manipuler l'ensemble des tudiants de TELECOM, on utilise la classe Etudiant donne en exemple dans le paragraphe 1.3 du cours. a) Quelle modification doit-on faire dans cette classe pour pouvoir crer un tableau d'tudiants partir du modle de classe vector ? Comment se fait alors l'initialisation d'un tudiant ? Donner un exemple d'utilisation prsentant la dclaration d'un tableau, l'ajout de plusieurs tudiants, et l'affichage de tous les tudiants. Reprendre la question b) partir d'un tableau de pointeurs (en utilisant toujours le modle vector).

EXERCICES SUR LES CHAINES


Des exercices suivants, on utilisera la classe string de la STL et les diffrentes mthodes qui lui sont associes.

EXERCICE 1
a) b) c) Ecrire un programme qui permet de saisir une chane contenant des espaces (utiliser la fonction getline) et qui affiche cette chane sur la console de sortie. Ajouter ce programme une boucle qui permet dafficher les diffrents mots de cette chane (on suppose que les mots sont spars par des espaces). Ecrire une fonction ayant comme paramtre dentre une chane et en paramtre de sortie un tableau de chanes contenant les diffrents mots de la chane dentre.

EXERCICE 2
a) b) Ecrire une fonction CompterSousChaine qui permet retourner combien de fois apparat une chane c2 dans une chane dentre c1. Les 2 chanes seront fournies en paramtre d'entre. Donner un programme de test de la fonction.

EXERCICE 3
a) Ecrire une fonction RemplacerChaine qui permet de remplacer dans une chane c1, toutes les apparitions de la chane c2 par une chane c3. Les trois chanes devront tre fournies en paramtre et la fonction devra retourner le nombre de remplacements effectus. Donner un programme de test de la fonction.

b)

- 29 -

EXERCICES SUR LES ASSOCIATIONS ENTRE CLASSES


EXERCICE 1
On veut dfinir une classe Ligne qui permet de reprsenter un segment de droite entre deux points. On se servira dune classe Point pour dfinir les extrmits de la ligne dclare par : class Point { int X; int Y; public : Point(int x=0,int y=0) {X=x;Y=y;} int LireX() {return X;} int LireY() {return Y;} void Translater(const Point &p) {X+=p.x;Y+=p.y;} void Afficher() {cout<<"Point ("<<X<<","<<Y<<")\n";} }; La classe aura deux constructeurs, le premier permettra de dfinir la ligne partir des 4 coordonnes des deux points, le deuxime permettra de fixer uniquement le premier point pass en paramtre, le deuxime prenant la mme valeur. Une mthode Agrandir( ) permettra ensuite de dplacer le deuxime point, et une mthode Translater( ) permettra de translater la ligne. Dfinir aussi une mthode Afficher( ). a) b) c) Faire le diagramme reprsentant cette classe en utilisant une association de type composition. Donner l'implantation en C ++. Faire le diagramme reprsentant cette classe en utilisant une association de type agrgation. Donner l'implantation en C ++. Donner un programme de test de la classe Ligne.

class Date { int Jour,Mois,Annee; public: Date(int j, int m, int a); void Afficher( ); int LireJour(); int LireMois(); int LireAnnee(); bool EstInferieure(const Date &d);// Ret. vrai si la date < d bool EstEgale(const Date &d); //Ret. vrai si la date = d }; a) b) c) Faire le diagramme de la classe Personne en utilisant un composant Date par valeur (composition) et un composant Nom par adresse (agrgation) Dclarer et dfinir cette classe avec une mthode Afficher, une mthode ChangerNom, une mthode ChangerDate et une mthode EstPlusJeune. Donner un programme de test.

EXERCICE 4
On veut dfinir une classe Horloge charge de grer une horloge affichage digital. L'afficheur de cette horloge est compos de trois compteurs servant respectivement compter les heures, les minutes et les secondes. Les trois compteurs sont des objets de classe Chiffre grs par l'objet horloge suivant le diagramme de classes :
Horloge Afficher( ) Incrmenter( ) Chiffre Valeur : int ValMax : int Afficher( ) Incrmenter( ) 1

EXERCICE 2
On veut dfinir une classe LignePoly qui permet de reprsenter une ligne polygonale dfinie partir d'un ensemble de points. On se servira de la classe Point de l'exercice prcdent, et si besoin, du modle de classe vector de la STL. La classe LignePoly disposera d'un constructeur ayant un paramtre pour fixer le premier point de la ligne, une mthode AjouterPoint permettant d'ajouter un point la ligne partir de ses coordonnes, une mthode Afficher permettant d'afficher les coordonnes de tous les points, et une mthode Translater permettant de translater la ligne. a) b) c) d) Faire le diagramme de la classe en utilisant une association de type composition. Donner l'implantation de la classe en C++. Ajouter une mthode SupprimerPoint permettant de supprimer le dernier point ajout. Donner un programme de test de la classe LignePoly.

Les deux classes possdent une mthode Incrmenter et une mthode Afficher. La mthode Afficher a pour fonction l'affichage de l'heure. Les liens entre objets chiffres servent propager une retenue sur le chiffre des heures ou sur le chiffre des minutes. Lorsque l'on demande l'horloge de s'incrmenter, elle incrmente le chiffre des secondes. Si le nombre de secondes stock dans Valeur est plus grand que le nombre maximum de secondes stock dans ValMax (60), alors une retenue se propage vers le chiffre des minutes sous la forme de l'envoi du message Incrmenter au chiffre des minutes. Le mcanisme est analogue pour la propagation de la retenue du chiffre des minutes vers le chiffre des heures. a) Faire le diagramme de collaboration entre objets qui montre l'incrmentation du chiffre des secondes avec propagation de la retenue vers le chiffre des minutes puis des heures (partir d'un tat initial de 11:59:59). Dclarer et dfinir la classe Chiffre avec un constructeur, une mthode Afficher et une mthode Incrmenter. Donner un programme de test de la classes Chiffre qui construit deux objets chiffres relis par une association et qui incrmente l'un des chiffres pour contrler la propagation de la retenue.

b) c)

EXERCICE 3
On veut dfinir une classe Personne qui reprsente une personne partir de son nom, son adresse et sa date de naissance. On se servira dune classe Date et de la classe string. La classe Date est dclare par : - 31 -

d) e)

Dclarer et dfinir la classe Horloge avec un constructeur, une mthode Afficher et une mthode Incrmenter. Donner un programme de test de la classe Horloge qui montre le fonctionnement de l'horloge avec la propagation des retenues.

EXERCICE 5
A partir de la classe Point de l'exercice 1, on veut faire une classe EditeurPoint simulant une boite de dialogue en association avec le point. Cette classe possdera une mthode Editer qui affichera les coordonnes du point, et proposera de les modifier. a) b) c) Faire le diagramme de classe correspondant Donner l'implantation en C++ Donner un programme de test

- 32 -

EXERCICES SUR LES CLASSES DERIVEES


EXERCICE 1
Soit la classe Point dfinie par : class Point { int X; int Y; public : Point(int x=0,int y=0) {X=x;Y=y;} void Initialiser( int x=0,int y=0) {X=x;Y=y;} int LireX() {return X;} int LireY() {return Y;} void Afficher(){cout<<"("<<X<<","<<Y<<")";} }; a) On veut dfinir une classe PointBis drive de Point qui possde un constructeur et qui rajoute une mthode Translater(x : int, y : int) la classe Point pour translater le point dun vecteur donn par les valeurs x et y. Donner le diagramme de classe, l'implantation en C++ et un programme de test. Comment aurait-on pu dclarer la classe Point pour simplifier lcriture de la mthode Translater ?

b)

cout<<"- 0 : Quitter"<<endl; cout<<"- 1 : Aide"<<endl; } int Menu::DemanderChoix() { int choix; cout<<"Votre choix :" cin>>choix; return choix; } int Menu::TraiterChoix(int choix) { int fin=0; if (choix==0) fin=TraiterQuitter(); if (choix==1) fin=TraiterAide(); return fin; } int TraiterQuitter() { int fin=0; char reponse; cout<<"Voulez-vous rellement sortir de l'application (o/n) ?" cin>>reponse; if ((reponse=='o')||(reponse=='O')) fin=1; return fin; } int TraiterAide() { cout<<"Choisir un numro parmi la liste propose"<<endl; return 0; }

EXERCICE 2
a) On veut dfinir une classe PointN drive de la classe Point de lexercice prcdent. Cette classe ajoutera la classe Point un champ Nom (de la classe string) qui permettra de donner un nom au point. Elle devra possder un constructeur et une mthode ChangerNom pour changer le nom du point. Donner le diagramme de classe, l'implantation en C++ et un programme de test. Redfinir la mthode Afficher pour quelle afficher le nom et les coordonnes dun PointN. Donner un exemple dutilisation.

b)

Question 1 a) Ecrire une fonction principale (main) permettant d'utiliser la classe Menu. Donner un rsultat d'excution. b) On veut faire une classe MenuEssai permettant de rajouter une option "Essai" dans le menu propos. Lorsque l'on choisira "Essai" dans le nouveau menu, on affichera simplement la phrase "Vous avez slectionn l'option essai". Faire le diagramme de classe de cette nouvelle classe en faisant figurer les mthodes dfinir. Expliquer la solution retenue. c) Dclarer et dfinir la classe MenuEssai. d) Donner la fonction principale permettant d'utiliser cette classe. Question 2 On veut faire une application grant un objet Point l'aide d'un menu permettant de : fixer les coordonnes du point en demandant leur valeur l'utilisateur, afficher les coordonnes du point. a) Identifier les objets et leurs interactions, en dduire un diagramme gnral des classes. b) Donner le diagramme de chaque classe et son implantation en C++. c) Ecrire le programme principal. Question 3 On veut rajouter la classe Menu une mthode Executer qui fait appel aux mthodes AfficherMenu, DemanderChoix et TraiterChoix tant que l'utilisateur ne sort pas de l'application. Cette mthode est destine simplifier l'criture du programme principal utilisant le menu : aprs la construction, il suffira d'appeler la mthode Executer pour activer le menu. a) Expliquer quelles modifications devront tre faites dans la classe Menu. b) Donner la nouvelle dclaration de la classe Menu, et la dfinition de la mthode Executer.

EXERCICE 3
On donne une classe Menu spcialise dans la gestion dun menu. Elle prend en charge laffichage du menu, la saisie du choix de lutilisateur, et lexcution du traitement correspondant au choix de lutilisateur. Cette classe pourra servir de base pour la cration de toute application grant un menu. Dans sa version de base, la classe Menu propose un menu avec deux choix qui permettent respectivement de quitter lapplication et dafficher une aide. Voici la dclaration et la dfinition de la classe Menu :
class Menu { public : void AfficherMenu(); int DemanderChoix(); int TraiterChoix(int choix); int TraiterQuitter(); int TraiterAide(); } ; void Menu::AfficherMenu() { cout<<"Menu :"<<endl;

- 33 -

c) Illustrer le fonctionnement de la classe Menu partir d'une classe MenuEssai identique celle de la question 1.

EXERCICE 4
On donne une classe Menu spcialise dans la gestion dun menu. Elle prend en charge laffichage du menu, la saisie du choix de lutilisateur, et lexcution du traitement correspondant au choix de lutilisateur. Cette classe utilise des objets OptionMenu munis d'une mthode Executer qui est appele par l'objet menu lors du choix de cette option. Pour utiliser cette classe, il faut donc dfinir des classes drives d'OptionMenu et les ajouter dans le menu au moyen de la mthode AjouterElement de la classe Menu. La classe OptionQuitter est dfinie pour grer la sortie de l'application. Voici la dclaration et la dfinition de ces diffrentes classes :
class OptionMenu { string Nom; public: OptionMenu(const string &ch) : Nom(ch) {} virtual ~OptionMenu() {} string &LireNom() {return Nom;} virtual bool Executer()=0; }; class Menu : public vector<OptionMenu *> { public: ~Menu(); void Afficher(); void Executer(); }; Menu::~Menu() { int i; for(i=0;i<size();i++) delete at(i); } void Menu::Afficher() { int i; cout<<"Menu :"<<endl; for (i=0;i<size();i++) cout<<"- "<<i<<" : "<<at(i)->LireNom()<<endl; cout<<endl; } void Menu::Executer() { int choix; bool fin=false; while (!fin) { Afficher(); cout<<"Votre choix : "; cin>>choix; if (choix<0 || choix>=size()) cout<<"Choix incorrect"<<endl; else { fin=at(choix)->Executer(); cout<<endl<<endl; } } }

class OptionQuitter : public OptionMenu { public: OptionQuitter() : OptionMenu("Quitter") {} virtual bool Executer(); }; bool OptionQuitter::Executer() { bool fin=false; char reponse; cout<<"Voulez-vous vraiment sortir de l'application (o/n) ?"; cin>>reponse; if (reponse=='o') fin=true; return fin; }

Question 1 a) Ecrire une fonction principale (main) permettant d'utiliser la classe Menu avec la seule option Quitter. Donner un rsultat d'excution. b) Faire le diagramme de classe de l'application. Expliquer pourquoi la mthode Executer de la classe OptionMenu est virtuelle pure. c) On veut faire une classe OptionEssai permettant de grer une option "Essai" dans le menu propos. Lorsque l'on choisira "Essai" dans le nouveau menu, on affichera simplement la phrase "Vous avez slectionn l'option essai". Dclarer et dfinir en C++ la classe MenuEssai. d) Donner la fonction principale permettant d'utiliser cette classe. Question 2 On veut faire une application grant un objet Point l'aide d'un menu proposant les deux options suivantes : fixer les coordonnes du point en demandant leur valeur l'utilisateur, afficher les coordonnes du point. a) Identifier les objets et leurs interactions, en dduire un diagramme gnral des classes. b) Dclarer et dfinir en C++ les classes ncessaires. c) Ecrire le programme principal.

- 34 -

EXERCICES SUR LES LISTES


EXERCICE 1
A partir d'une mise en uvre d'une liste d'entiers utilisant les classes ElementListe et ListeInt du cours, on demande d'crire des fonctions manipulant une liste dentiers. a) b) c) Ecrire une fonction Rechercher qui recherche dans la liste, un lment dont on prcise la valeur. Cette fonction devra retourner l'adresse de l'lment trouv ou 0 en cas d'chec. Ecrire une fonction Supprimer qui supprime dans la liste, un lment dont on prcise la valeur. Elle devra retourner un entier indiquant si la valeur a t effectivement supprime. Ecrire une fonction InsererOrdo qui permet d'insrer un lment dans une liste ordonne dans l'ordre croissant. Un paramtre donnera la valeur de l'lment qui devra tre insr en respectant l'ordre de la liste. Ecrire une fonction qui effectue le tri d'un tableau de valeurs, en construisant une liste intermdiaire ordonne (utiliser la fonction InsererOrdo du c)).

a)

Ecrire une fonction InsererOrdo1 qui permet d'insrer une chane de caractres dans une liste ordonne dans l'ordre alphabtique. La liste devra rester ordonne aprs l'insertion. Les composants de cette liste seront des objets (composants par valeurs). Donner un programme de test de cette fonction. Ecrire une fonction InsererOrdo2 qui utilise des composants dynamiques (composants par adresse). Donner un programme de test de cette fonction.

b) c) d)

EXERCICE 5
On utilisera dans cet exercice, une liste d'entiers dfinie partir du modle de classe vector de la STL. a) Ecrire une fonction Afficher1 permettant d'afficher tous les lments d'une liste en utilisant la rcursivit. Cette fonction aura comme paramtre un itrateur sur le premier lment afficher, et devra s'appeler elle-mme. Ecrire une fonction Afficher2 rcursive, permettant d'afficher tous les lments dans l'ordre inverse.

d)

b)

EXERCICE 2
A partir de la mise en uvre d'une liste d'entiers utilisant des itrateurs (modle de classe list de la STL), on demande d'crire des fonctions manipulant cette liste. a) b) c) Ecrire une fonction Afficher permettant d'afficher la valeur de tous les lments d'une liste. Reprendre les questions a) et b) de l'exercice prcdant en donnant chaque fois un programme de test. Ecrire une fonction Inverser permettant d'inverser les lments d'une liste.

EXERCICE 3
A partir de la mise en uvre d'une liste d'entiers utilisant des itrateurs (modle de classe list de la STL), on demande de d'crire diffrentes fonctions d'insertion. a) Ecrire une fonction Insrer qui permet d'insrer plusieurs valeurs identiques l'intrieur d'une liste. Elle aura comme paramtres, la liste destination, un itrateur de dbut d'insertion, la valeur insrer, et le nombre de rptitions de cette valeur. Ecrire une fonction Insrer qui permet d'insrer une liste chane l'intrieur d'une autre. Elle aura comme paramtres, la liste destination, un itrateur de dbut d'insertion dans cette liste destination, et la liste insrer. Modifier la fonction prcdente en donnant en paramtre, la place de la liste insrer, une paire d'itrateurs sur le dbut et la fin de la liste insrer.

b)

c)

EXERCICE 4
On veut utiliser une liste construite partir du modle de classe list de la STL, et contenant des chanes de caractres dclares partir de la classe string.

- 35 -

S-ar putea să vă placă și