Académique Documents
Professionnel Documents
Culture Documents
-----¤¤¤¤----- 2007-2008
ECOLE NATIONALE DES SCIENCES
DE L'INFORMATIQUE
Devoir surveillé
Matière : Conception et Programmation orientées objets Date : samedi 24 novembre 2007
Niveau : II2 Durée: 2H
Enseignants : Y. JAMOUSSI, I. BEN HAMOUDA, R. CHEBIL, L. KETARI Documents : non autorisés
Problème
L’objectif de ce problème est de développer une application permettant de faire calculer à des
robots des itinéraires dans différentes zones géographiques. Un robot calcule un itinéraire lors de
son déplacement dans une zone géographique. Chaque zone géographique dispose d’un certain
nombre d’obstacles dont le nombre et la position de chaque obstacle sont connus à l’avance et fixes.
Robot dans la case de départ Case cible
z z
qu’une case peut être visitée plus qu’une fois. Un itinéraire
peut être construit que lorsqu’on connaît les cases de départ
et d’arrivée qui restent inchangées. On suppose que les robots
se déplacent dans l’une des quatre cases voisines à la sienne z
(haut, bas, gauche, droite) à condition qu’elle ne soit pas un
obstacle (cercle noirci).
La figure à droite représente une zone géographique composée de sept obstacles avec un robot (nommé
Zulu) initialement dans une case de départ devant se rendre à une case cible (quadrillée).
Dans un premier temps, on se propose d’utiliser uniquement les 4 classes : Grille, Robot, Case
et Itineraire. Un développeur a réalisé le modèle de conception UML incomplet suivant :
Travail à faire
On se propose de comprendre et compléter la modélisation UML proposée par le développeur,
de coder en partie l’application avec le langage C++ et d’améliorer la modélisation UML. Pour
cela, il s’agit de répondre directement sur les deux formulaires qui vous ont été distribués.
20 Nom : …….….................. Prénom :……………………Classe :……….
*on tolère ceux qui ont traité correctement la dépendance - -> (bien que bizarre !)
Itineraire-Case (chemin) : un itinéraire est formé par à 0 ou plusieurs cases visitées formant ainsi un
chemin
a) Reflétez cette modification sur le modèle UML en représentant que les classes concernées par le
changement.
class Class Model
Robot
+ atteindrePosition(Case) : Itineraire
+ presenceObstacle(int, int) : boolean
b) Une instance de la classe Itineraire peut-elle reconnaître les obstacles ? Justifier votre
réponse.
Non, car à partir d’une instance itinéraire on ne peut naviguer que vers : case départ, case
d’arrivée et les cases visitées par le robot.
Rq : A partir de case on n’a pas de visibilité sur les obstacles. La seule classe qui a une
visibilité sur les obstacles est la classe Grille ou toutes celles qui peuvent naviguer
vers grille (soit Robot).
addOnly : Il est possible de tisser de nouveaux lien mais impossible d’en supprimer
ordered : les éléments de la collection représentant le tissage des liens sont ordonnés
notUnique : Il est possible d’avoir plus qu’un lien entre deux objets avec la même association
b) Décorez chaque association par le ou les contraintes de gestion appropriées. Il est conseillé de
donner une réponse textuelle : le ou les contraintes par association (une ligne par association).
Grille-Robot (habitant) :
Grille-Case (Obstacle) : frozen,
Itineraire-Case (départ) : frozen
Itineraire-Case (arrivée) : frozen
Itineraire-Case (chemin) : notUnique, addOnly, ordered
notUnique : prévoir un moyen pour distinguer 2 liens sur un même objet (par exemple en
duplicant les objets !)
addOnly : prévoir au niveau des méthodes l’ajout et/ou l’insertion (add) pas de suppression
ordered : prévoir un ordre (soit par chainage entre les éléments ou par un index sur
l’élément
pas de contraintes : il faut prévoir toutes les méthodes (add, insert , remove,
removeAll, etc.)
Grille-Case (Obstacle) : on a besoin d’une collection dont la taille n’est pas une constante
indépendante de la grille et donc on écarte l’utilisation d’un tableau statique. Mais la taille
de la collection est une valeur connue lors de la construction de la grille => on peut opter
pour un tableau dynamique. Mais comme la grille ne connaît pas le nombre d’obstacles =>
plus propice d’utiliser une liste simplement chaînée.
Itineraire-Case (chemin) : on a besoin d’une collection dont la taille n’est pas connue à
priori. L’ordre sert uniquement pour former une succession de cases. On n’a pas besoins
d’opération qui exploite le double chainage => liste simplement chainée
Question 2.2 (2,5 pts)
Sachant qu’on ne veut apporter aucune modification sur le nombre d’associations impliquées avec
la classe Case, donnez la déclaration et l’implémentation de la classe Itineraire. Il est conseillé de
donner l’implémentation de toutes les méthodes avec leur déclaration.
struct EltList{
Case *t;
EltList *next;
};
class Itineraire
{
private:
Case *depart; //on accepte aussi Case depart (sans pointeur)
Case *arrivee; //on accepte aussi Case arrivee
Eltlist *chemin;
public :
Itineraire(Case *dep, Case *arr) :
depart(dep), arrivee(arr), chemin(NULL) {}
nvelle=new EltListe;
nvelle->t=nvelleCase;
nvelle->next=NULL;
if (!chemin )
chemin=nvelle;
else
{
EltList * tmp;
for(tmp=chemin; tmp->next!=NULL; tmp=tmp->next);
tmp->next=nvelle;
}
}
~Itineraire(){
while (chemin != NULL) {
EltList * tmp;
tmp = chemin;
chemin = chemin->next;
delete tmp;
}
delete depart ; // tt depend de leur usage
delete arrivee ; // tt depend de leur usage
}
};
Nom : ………….................. Prénom :……………………… Classe :……….
7 6 7 1 4 2 0 2 1 3 1 3 3 4 3 5 2
while (nbObstacle--) { };
EltObstacle * nv ;
nv = new EltHabitant ;
f >> x >> y ;
nv->Obstacle=new Case(x,y);
nv->next = obstacles ;
Obstacles = nv ;
}
}
Question 2.4 (1+1 pts)
a) Donnez l’implémentation de l’opération bool presenceObstacle(int x,int y) qui,
pour une case se trouvant à la ligne x et la colonne y, retourne vrai si cette case est un obstacle
et faux sinon. (N’oubliez pas de respectez vos réponses aux questions précédentes)
bool Robot::presenceObstacle(int x, int y) {
Grille *g=getZoneRobot() ;
EltObstacle * obs = g->getObstacle();
while (obs) {
if ((obs->Obstacle.getLigne()==x)
&& (obs->Obstacle.getColonne()==y) )
return TRUE;
}
return FALSE;
}
b) On suppose que la classe Robot à une méthode intelligente prochaineCaseAVisiter()
(non mentionnée dans le diagramme de l’énoncé) qui lors du déplacement du robot d’une case à
une autre l’aide à s’orienter vers la cible. Cette méthode retourne un sens de déplacement {haut,
bas, gauche, droite} sans tenir compte des obstacles, mais heureusement elle est indéterministe.
Aussi, on suppose que le robot abandonne la recherche et retourne NULL s’il fait un nombre de
déplacement supérieur à 2 fois la taille de la grille et qu’il ne retrouve pas la cible. Donnez
l’implémentation de l’opération atteindrePosition.
if ( ! presenceObstacle(posLigne+dlig,posColonne+dcol)) {
posLigne+=dlig ; posColonne+=dcol ;
// deplacement effectif du robot
It->add( new Case(posLigne, posColonne) ) ;
}
}
}
Partie 3 : Amélioration de la modélisation UML
Oui il est possible de déplacer l’opération « presenceObstacle » dans une autre classe car la classe
responsable est la classe Grille. C’est elle qui contient toutes les informations pour pouvoir réaliser
le traitement.
Avec la solution actuelle, par l’association « habitant » entre les classes Grille/Robot il n’est pas
possible de mémoriser les itinéraires suivis par chaque robot.
Il s’agit de démontrer que toutes les navigations ne permettent pas de joindre le robot avec
l’itinéraire. D’ailleurs, ce dernier est transmis par un return dans une méthode de Robot.
Toutefois, on peut le faire avec plusieurs façons. Voici à titre d’exemple 1 façon :
Ajouter une association entre Robot et Itinéraire [1-*] (Robot se déplace plusieurs fois pour calculer
itinéraire). Plus il faut que l’itinéraire soit relatif à une grille Æ rendre Grille une classe associative
de la nouvelle association.
Question 3.3 (2 pts)
On se propose d’ajouter la classe Application qui joue le rôle d’interface entre le programme
principal et les constituants du problème en question (Grille, Robot, Case, Itineraire). A cet effet, on
se propose aussi de transformer toutes les associations dans le diagramme de classes réalisé par le
développeur en introduisant, si c’est possible, un maximum d’association de type composition ou à
la limite des associations de type agrégation. Rappelez la définition de ces deux concepts et donnez
une proposition d’un nouveau diagramme de classes incluant la classe Application.
L’agréation est un cas particulier d’association qui représente une relation d’inclusion structurelle
ou comportementale d’un élément (agrégé) dans un ensemble (agrégat). La durée d vie des agrégés
est indépendante de celle de l’agrégat. Il est possible de rattacher les agrégés à plus d’un agrégat. La
composition est un cas particulier d’association avec des contraintes décrivant la notion de
composant (contenance structurelle). Les contraintes liées à la composition sont les suivantes :
Grille Application
1 Interface
Habitant
Robot
Obstacle
Départ
1
Case Itinéraire
* Chemin
*
1
Arrivée