uml et programmation en c++ -...
TRANSCRIPT
UML et programmation en C++
Version 1.0 Last update: 23/12/2012
Use: Students/Staff Author: Laurent Godefroy
Mini‐projet
Evolution d’une population de fourmis
SUPINFO
Acade
mic Dep
t.
Page 2 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
SOMMAIRE
1 PREAMBULE .................................................................................................... 3
2 GENERALITES SUR CE PROJET ........................................................................... 3
3 GESTION DU QUADRILLAGE ............................................................................. 7 3.1 UNE CLASSE ETAT .................................................................................................. 7 3.2 UNE CLASSE PLATEAU ............................................................................................ 8
4 GESTION DES FOURMIS ................................................................................. 10 4.1 UNE CLASSE FOURMI ........................................................................................... 10 4.2 UNE CLASSE FOURMILIERE .................................................................................... 11
Page 3 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
1 PREAMBULE
Cet examen est bien sûr individuel. Toute forme de plagiat ou utilisation de codes disponibles sur internet ou tout autre support, même de manière partielle, est strictement interdite et se verra sanctionnée d’un 0, d’une mention « cheater », et le cas échéant d’un conseil de discipline.
Vous devrez envoyer les codes sources de votre projet par mail à votre formateur avant le
dimanche 20 janvier à 23h59, heure locale. Au delà de cette date et heure votre note sera de 0. Vous comprimerez ces codes sources dans une archive au format « .zip ». Ce mini‐projet donne lieu à des soutenances qui se dérouleront la semaine du 21 Janvier. Les soutenances sont également individuelles. Elles durent 10 minutes pendant lesquelles vous
montrerez à votre examinateur le bon fonctionnement de votre programme en en faisant la démonstration. Si vous n’avez pas implémenté le projet dans sa totalité, vous exposerez les parties fonctionnelles. Pour appuyer votre présentation, vous devrez préparer un fichier de type Powerpoint, dans
lesquels vous expliquerez les points du code que vous jugez les plus importants et significatifs. Il n’est pas nécessaire d’envoyer ce fichier à votre examinateur, ce dernier le découvrira le jour de la soutenance. Le rendu du projet et la soutenance comptent chacun pour la moitié de la note finale.
2 GENERALITES SUR CE PROJET Le but de ce mini‐projet est d’implémenter en C++ un automate cellulaire inventé en 2000 par Jim
Propp, le « Rotor Router ». Pour le décrire, nous utiliserons l’image du déplacement d’une population de fourmis, tel que l’a fait Jean‐Paul Delahaye dans son livre « Complexités, aux limites des mathématiques et de l’informatique ».
Imaginons un quadrillage infini, où chaque case possède une orientation (nord, est, sud, ouest).
Initialement toutes les cases ont la direction « ouest », et toutes les cases sont inoccupées :
Page 4 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Les fourmis vont sortir successivement de la même case du quadrillage. Quand une fourmi arrive dans une case inoccupée, elle y reste et n’en bouge plus. L’orientation
de la case n’est pas modifiée. Parc contre, quand une fourmi arrive dans une case occupée, elle en change son orientation, en la
faisant tourner de 90 degrés dans le sens des aiguilles d’une montre (ouest‐nord‐est‐sud‐ouest), puis se déplace d’une case suivant cette nouvelle direction.
Illustrons ces règles en faisant sortir les fourmis de la case centrale de notre petit dessin. Les cases
occupées seront coloriées. La première fourmi sort du trou, trouve une case vide et donc s’installe :
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
La seconde fourmi sort du trou, trouve une case occupée donc en change sa direction :
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ↑ ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Elle se déplace alors selon cette direction et rencontre une case vide donc y reste :
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ↑ ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
La troisième fourmi sort du trou, trouve une case occupée donc en change sa direction :
Page 5 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← → ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Elle se déplace alors selon cette direction et rencontre une case vide donc y reste :
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← → ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
La quatrième fourmi sort du trou, trouve une case occupée donc en change sa direction :
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ↓ ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Elle se déplace alors selon cette direction et rencontre une case vide donc y reste :
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ↓ ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
La cinquième fourmi sort du trou, trouve une case occupée donc en change sa direction :
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Elle se déplace alors selon cette direction et rencontre une case vide donc y reste :
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Page 6 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
La sixième fourmi sort du trou, trouve une case occupée donc en change sa direction :
← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ↑ ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Elle se déplace alors selon cette direction, rencontre une case occupée dont elle change là encore
la direction :
← ← ← ← ← ← ← ← ← ← ↑ ← ← ← ← ← ← ↑ ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Elle se déplace alors selon cette direction et rencontre une case vide donc y reste :
← ← ← ← ← ← ← ← ← ← ↑ ← ← ← ← ← ← ↑ ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
La septième fourmi sort du trou, trouve une case occupée donc en change sa direction :
← ← ← ← ← ← ← ← ← ← ↑ ← ← ← ← ← ← → ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Elle se déplace alors selon cette direction, rencontre une case occupée dont elle change là encore
la direction :
← ← ← ← ← ← ← ← ← ← ↑ ← ← ← ← ← ← → ↑ ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Elle se déplace alors selon cette direction et rencontre une case vide donc y reste :
Page 7 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
← ← ← ← ← ← ← ← ← ← ↑ ← ← ← ← ← ← → ↑ ← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
Et ainsi de suite… Bien sûr nombres de questions se posent, à commencer par savoir si une fourmi va
nécessairement trouver une case inoccupée, ou au contraire risque t‐elle de « tourner en rond » ? Quelle est d’autre part la forme de la fourmilière après installation d’un grand nombre de fourmis ?
Dans ce mini‐projet on va donc implémenter des classes permettant de simuler l’évolution d’une
telle population. Ne travaillant qu’avec la console, on sera cependant obligé de limiter la taille de nos quadrillages, et d’adopter une représentation graphique plus modeste.
3 GESTION DU QUADRILLAGE
3.1 UNE CLASSE ETAT Déclarer dans un « .h » et implémenter dans un « .cpp » la classe « Etat » telle qu’elle est décrite
ci‐dessous. Cette classe permettra de gérer l’état d’une case.
Page 8 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
Quelques précisions :
• « occupé » et « direction » sont deux attributs qui indiqueront si la case est occupée ou non, et quelle est sa direction. On adoptera la convention suivante pour coder les directions : 1 pour « ouest », 2 pour « nord », 3 pour « est » et 4 pour « sud ».
• le constructeur par défaut initialise « occupé » à « false » et « direction » à 1. • Le constructeur fait un test sur la valeur passée pour initialiser la direction. Dans le cas où
elle ne serait pas entre 1 et 4, elle serait remplacée arbitrairement par 1. • Les « getter » et les « setter » permettent de retourner ou fixer la valeur des attributs. • La méthode « modif_d » modifie l’orientation selon la règle exposée dans la partie de
généralités de ce sujet.
3.2 UNE CLASSE PLATEAU Déclarer dans un « .h » et implémenter dans un « .cpp » la classe « Plateau » telle qu’elle est
décrite ci‐dessous. Cette classe permettra de gérer le quadrillage.
Quelques précisions :
• « hauteur » et « largeur » sont deux attributs qui représenteront respectivement le nombre de lignes et le nombre de colonnes du quadrillage.
• « tab » est un tableau à deux dimensions représentant le quadrillage sur lequel vont évoluer les fourmis. Chacune de ses cases est du type de la classe « Etat ».
• Le constructeur par défaut initialise « hauteur » et « largeur » à 9 et 15, puis déclare dynamiquement le tableau « tab » à ces dimensions. Chacune des cases sera initialisée à « false » et 1.
Page 9 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
• Le constructeur vérifie tout d’abord que les deux paramètres sont impairs. Dans le cas
contraire il les remplace par 9 et 15. Sinon il utilise ces paramètres pour initialiser « hauteur » et « largeur ». Il déclare ensuite dynamiquement le tableau « tab » aux dimensions « hauteur » et « largeur ». Chacune des cases sera initialisée à « false » et 1.
• « affiche » est une méthode réalisant l’affichage du quadrillage. Les directions seront représentées par ‘o’, ‘n’, ‘e’, et ‘s’ pour une case inoccupée et par ‘O’, ‘N’, ‘E’, ‘S’ pour une case occupée. Cela donne donc cela à la création du plateau :
Après l’apparition d’une fourmi :
Après l’apparition de plusieurs fourmis :
• « get_case » est une méthode prenant en paramètre un numéro de ligne et de colonne et qui retourne l’état de la case correspondante du quadrillage.
• Les deux autres méthodes sont des « getter » qui renvoient les valeurs de la largeur et de la hauteur du quadrillage.
Page 10 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
Autre travail à réaliser : mettre cette classe sous sa forme canonique de Coplien. Dernière chose à faire pour cette partie : Surcharger l’opérateur « ++ » version préfixe afin qu’il
augmente de deux à la fois la hauteur et la largeur du quadrillage. On conservera les états antérieurs des cases, les nouvelles étant initialisées à « false » et 1. On fera en sorte d’ajouter une ligne en dessus et en dessous de celles déjà existantes, et d’ajouter une colonne à gauche et à droite de celles déjà existantes.
Remarque : la mise sous forme canonique de Coplien et la surcharge de l’opérateur « ++ »
n’apparaissent pas dans la capture d’écran ci‐dessus.
4 GESTION DES FOURMIS
4.1 UNE CLASSE FOURMI Déclarer dans un « .h » et implémenter dans un « .cpp » la classe « Fourmi » telle qu’elle est
décrite ci‐dessous. Cette classe permettra de modéliser une fourmi.
Quelques précisions :
• « i » et « j » sont deux attributs représentant respectivement les numéros de ligne et de colonne de la fourmi quand elle aura atteint sa place définitive.
• « d » est un attribut indiquant le nombre de déplacement que la fourmi aura du effectuer avant d’atteindre sa place définitive.
Page 11 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
• Le constructeur de cette classe prend en paramètre une référence vers un objet de la
classe Plateau. Ça sera sur ce quadrillage que s’installera la fourmi en cours de création. On suppose que la fourmi part de la case centrale du quadrillage (cette case existe puisque les dimensions sont impaires) et se déplace ensuite selon les règles expliquées dans la partie 2 jusqu’à trouver une case inoccupée. On affectera alors à « i » et « j » les coordonnées de cette case, et à « d » le nombre de déplacements effectués.
• « get_d » est un « getter » qui retourne la valeur de l’attribut « d ». • l’opérateur de comparaison « < » est à surcharger de façon externe. Cette comparaison
portera sur les nombres de déplacements effectués par les fourmis avant d’atteindre leur place définitive.
4.2 UNE CLASSE FOURMILIERE Déclarer dans un « .h » et implémenter dans un « .cpp » la classe « Fourmilière » telle qu’elle est
décrite ci‐dessous. Cette classe permettra de modéliser notre fourmilière.
Quelques précisions :
• « plateau » est un pointeur vers un objet de la classe « Plateau » qui représentera le quadrillage sur lequel va évoluer la fourmilière.
• « popu » est un vecteur d’objets de la classe « Fourmi » qui représentera les différents membres de la fourmilière.
• « nb » est un attribut de classe indiquant le nombre de fourmis constituant la fourmilière. • Le constructeur de cette classe prend en paramètre une référence vers un objet de la
classe « Plateau » et s’en sert pour initialiser l’attribut « plateau ». Il instancie également une première fourmi et l’ajoute au vecteur « popu ».
• La méthode « ajout » instancie une nouvelle fourmi et l’ajoute au vecteur « popu ».
Page 12 sur 12 © SUPINFO International University – http://www.supinfo.com
UML et programmation en C++ 2ADS
• « affiche » est une méthode réalisant l’affichage du numéro de la dernière fourmi ajoutée
à la fourmilière, du quadrillage obtenu après son installation, et du nombre de déplacement qu’elle a effectuée. C’est‐à‐dire quelque chose comme cela :
• « stats » est une méthode existant en deux versions. La première ne prend pas de paramètres et calcule les nombres de pas minimal, maximal et moyen sur l’ensemble de la population. Elle indique également quels sont les numéros des fourmis qui réalisent les déplacements maximaux et minimaux (numéro au sens d’ordre de création dans la fourmilière). La deuxième version de « stats » fait la même chose mais cette fois pas sur l’ensemble de la population mais uniquement sur les fourmis dont le numéro est compris entre n et m (on vérifiera que n et m sont plus petits que nb). Pour écrire ces deux versions, on se servira bien sûr des algorithmes de la librairie standard.