uml et programmation en c++ -...

12
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 Academic Dept.

Upload: vanminh

Post on 12-Sep-2018

237 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

                                 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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: UML et programmation en C++ - maximegirou.commaximegirou.com/files/projets/b2/fail/fourmiliere.pdf · UML et programmation en C++ ... soutenance. Le rendu du projet et la soutenance

 

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.