TD6 Exercice 1 Afin de gérer les inscriptions d’employés d’une organisation à des sessions de formations, une application est développée. L’organisation propose un catalogue de formations. Chaque formation, étalée sur plusieurs jours contigus, propose différentes sessions identiques ; seuls le numéro de session, la date de début de session et le nombre de participants maximum diffèrent. Lors de l’inscription à une formation, chaque employé classe toutes les sessions relatives à la formation par ordre de préférence. A la clôture des inscriptions de chaque formation, chacun des employés se voit alloué une session en fonction de son ancienneté et de son classement (par ordre de préférence). Le nombre de places par session étant limité, l’ancienneté est un critère prioritaire. Si un vœu pour une session ne peut être satisfait pour un participant, on étend son choix à son deuxième vœu de session, et ainsi de suite. On considère pour la suite de l’étude que deux employés n’ont jamais la même ancienneté. Diagramme des cas d’utilisation.

Création d'une formation et des sessions liées

Organisateur Inscription d'un employé à une format ion

Affectation des inscrits aux sessions

Cas d’utilisation : affectation des inscrits aux sessions d’une formation Acteur principal : l’organisateur des formations Evénement déclencheur : clôture des inscriptions Pré-conditions : La formation existe ainsi que ses sessions. Les inscriptions ont eu lieu, les vœux des inscrits ont été exprimés et classés par ordre de préférence décroissante des sessions. La formation pourra accueillir tous ses inscrits. Scénario normal : 1. L’organisateur demande l’affectation des inscrits aux sessions 2. Le système affecte une session à chaque inscrit selon les vœux hiérarchiques exprimés et au privilège de l’ancienneté dans l’entreprise en cas de litige. Post condition : Tous les inscrits sont affectés dans des sessions. Description des classes : Les paramètres des méthodes sont tous des paramètres en entrée. classe Participant // Un participant est un employé de l’organisation inscrit à une formation attributs privés :

Sébastien Gagneur – TD6 - EXOS

1

nom : chaîne prénom : chaîne ancienneté : entier // ancienneté de l’employé dans l’organisation exprimé en nombre de //jours laSession : Session // session de formation affectée à l’employée lors du traitement des //affectations lesChoix : Collection de Session // sessions choisies par l’employé lors de son inscription à la //formation, classées par ordre de préférence décroissante méthodes publiques : procédure init(unNom : chaîne, unPrénom : chaîne, uneAncienneté : entier, desChoix : Collection de Session) fonction getChoixSession( index entier) : Session procédure setLaSession(uneSession Session ) // valorise l’attribut laSession fin classe L’attribut lesChoix contient les choix de sessions classés par préférence. classe Session attributs privés : numéro : entier dateDébut : date nbMax : entier // nombre de places offertes lesParticipants : Collection de Participant // participants retenus pour la session méthodes publiques : procédure init(unNuméro : chaîne, uneDate : date, unNb : entier ) fonction getNuméro() : entier procédure ajouteParticipant (unParticipant : Participant) fonction estPleine() : booléen fin classe classe Formation attributs privés : code : chaîne libellé : chaîne nbJours : entier // nombre de jour de la formation, identique pour toutes ses sessions lesInscrits : Collection de Participant // participants inscrits à la formation mesSessions : Collection de Session // sessions proposée par la formation méthodes publiques : procédure affecteParticipants() fin classe -

Commentaires : Une classe Collection est utilisée afin de réaliser les associations de multiplicité n ; l’annexe fournit la description de cette classe. La méthode Participant :: getChoixSession retourne la session dont l’index représente le numéro de choix, par exemple Participant :: getChoixSession(2) retourne la session choisie en seconde position. La méthode Session :: ajouteParticipant ajoute un participant à la session et affecte cette dernière au participant. La méthode Session :: estPleine indique si le nombre d’inscrits atteint le maximum toléré. La méthode Formation :: affecteParticipants réalise l’affectation des inscrits à des sessions en fonction de leurs choix et de leur ancienneté. Travail à réaliser 1. Etablir le diagramme de classes en faisant figurer les attributs, les valeurs de multiplicité et les sens de navigabilité entre classes. 2. Ecrire les méthodes suivantes : • Participant ::init • Participant ::getChoixSession • Session ::ajouteParticipant • Session ::estPleine • Formation ::affecteParticipants

Sébastien Gagneur – TD6 - EXOS

2

Annexe : Classe Collection Classe Collection // Classe générique. Un objet de la classe Collection permet de gérer // un ensemble d’objets de même classe // Tous les paramètres des méthodes sont des paramètres en entrée. Fonction cardinal () : entier // retourne le nombre d'éléments de la collection. Fonction existe (unObjet : objet) : booléen // teste si l’objet passé en paramètre fait partie de la collection. Fonction index (unObjet : objet) : entier // retourne l'index de l’objet passé en paramètre dans la collection, // le premier objet de la collection a pour index 1. Fonction donnerObjet (index : entier) : objet // retourne l’objet qui se trouve à l’index passé en paramètre Procédure ajouter (unObjet : objet) // ajoute un objet à la collection. Procédure trier(nomChamp : chaîne, typeTri : caractère) // trie la collection sur les valeurs de nomChamp, attribut de la classe stockée dans la collection ; typeTri prend « a » pour ascendant et « d » pour descendant Procédure remplacerA (index : entier, unObjet :objet) // remplace, au sein de la collection, l’objet figurant à l’index passé en // en paramètre par l’objet passé en paramètre. Procédure enlever (index : entier) // supprime de la collection l’objet figurant à l’index passé en paramètre Procédure vider() // vide le contenu de la collection. Fin classe Collection Pour instancier une collection : uneCollection : Collection de maClasse // la collection instanciée contiendra des objets de la classe maClasse L'avantage de cette classe est de proposer des services d'ajout et de suppression plus simples que la gestion d'un tableau. En outre le problème du dimensionnement de la structure n'est pas à la charge du développeur. Toute variable d'un type de base (entier, chaîne) peut être considérée comme un objet d'une collection.

Sébastien Gagneur – TD6 - EXOS

3

Exercice 2 Une bibliothèque rassemble différents livres. Règles de gestion : - Une bibliothèque possède des armoires constituées d’étagères. - Chaque étagère a un numéro et regroupe différentes catégories de livres (histoire, sciences…). - Au sein de leur catégorie, les livres sont tous classés par ordre alphabétique (croissant) de leur titre. - On considère qu’il n’y a pas de contrainte de place, ni pour les livres rassemblés par catégorie, ni pour les catégories présentes sur les étagères : une catégorie tient entièrement sur une étagère qui peut en contenir plusieurs. Description textuelle d’un cas d’utilisation : Ajout d’un nouveau livre Acteur principal : Le gestionnaire Portée : Cas bibliothèque Niveau : Utilisateur Pré-conditions : Les livres classés par catégories sont triés, toutes les catégories sont déjà identifieés. Scénario nominal : - Le gestionnaire indique le titre et la catégorie d’un livre pour ajout. - Le système insère le livre dans sa catégorie à un rang qui permet de maintenir l’ordre alphabétique des titres au sein de cette catégorie. Informations relatives au DCL : Remarques sur la présentation du diagramme - La présence du mot clé {ordonné} sur l’association entre les classes Livre et Catégorie indique une contrainte d’ordonnancement pour toutes les instances de la classe Livre liées à une instance de la classe Catégorie. - La lettre e placée avant la déclaration d’un paramètre signifie que celui-ci est en entrée. - Des relations de dépendance existent entre la classe Bibliothèque et les classes Livre et Catégorie (voir par exemple la signature de la méthode Bibliothèque :: getCatégorie) ; ces relations de dépendance ne sont pas montrées sur le diagramme. - Les rôles placés sur les associations à côté des classes – exemple lesLivres – seront implémentés par des attributs dans les classes concernées par l’association. - La fonction Catégorie:: rangLivre retourne le rang auquel il faut insérer le livre. Des chaînes de caractères peuvent être comparées en utilisant les opérateurs >, <, = , etc. - La procédure Catégorie:: placeLivre insère un livre au rang voulu et décale éventuellement les livres de rang supérieur. - La fonction Bibliothèque:: getCatégorie retourne l’objet de la classe Catégorie qui possède le libellé passé en paramètre. - La fonction Bibliothèque :: nouveauLivre crée un nouveau livre et retourne le livre créé. - La procédure Livre :: init valorise l’attribut titre de l’objet courant, crée un lien avec une instance de la classe Catégorie (liée à la classe Livre par un lien 1) et appelle la méthode Catégorie:: placeLivre. Travail à réaliser 1. Présenter la déclaration des classes (à l’aide du DCL) Catégorie et Livre (déclaration des attributs et en-tête des méthodes, sans leur corps). Pour l’implémentation de ces classes, on dispose d’une classe technique Collection décrite en annexe. 2. Expliquer pourquoi la méthode rangLivre de la classe Catégorie est privée. 3. Ecrire les méthodes suivantes : a) Catégorie:: rangLivre b) Catégorie:: placeLivre c) Livre :: init d) Bibliothèque :: nouveauLivre

Sébastien Gagneur – TD6 - EXOS

4

Annexe : Classe Collection Classe Collection // Classe générique. Un objet de la classe Collection permet de gérer // un ensemble d’objets de même classe Fonction cardinal () : entier // retourne le nombre d'éléments de la collection. Fonction existe (e unObjet : objet) : booléen // teste si l’objet passé en paramètre fait partie de la collection. Fonction index (e unObjet : objet) : entier // retourne l'index de l’objet passé en paramètre dans la collection, // le premier objet de la collection a pour index 1. Fonction donnerObjet (e index : entier) : objet // retourne l’objet qui se trouve à l’index passé en paramètre Procédure ajouter (e unObjet : objet) // ajoute un objet à la collection. Procédure remplacerA (e index : entier ; e unObjet :objet) // remplace, au sein de la collection, l’objet figurant à l’index passé en // en paramètre par l’objet passé en paramètre. Procédure enlever (e index : entier) // supprime de la collection l’objet figurant à l’index passé en paramètre Procédure vider() // vide le contenu de la collection. Fin classe Collection Pour instancier une collection : uneCollection : Collection de maClasse // La collection instanciée contiendra des objets de la classe maClasse L'avantage de cette classe est de proposer des services d'ajout et de suppression plus simples que la gestion d'un tableau. En outre le problème du dimensionnement de la structure n'est pas à la charge du développeur. Toute variable d'un type de base (entier, chaîne) peut être considérée comme un objet d'une collection.

Sébastien Gagneur – TD6 - EXOS

5

Exercice 3 En ski de fond de compétition, la Coupe du Monde de ski se dispute chaque année. Elle se déroule sous la responsabilité de la Fédération Internationale de Ski ou FIS (http://www.fis-ski.com). Durant toute une saison, des stations du monde entier accueillent des courses dans quatre disciplines (Classique, skating, fond spécial, marathon). Les courses sont organisées pour des compétiteurs hommes ou pour des compétitrices femmes. Avant chaque course, il est nécessaire de déterminer le dossard de chaque compétiteur. Le numéro de dossard détermine l'ordre de départ d'une course, ce qui revêt une grande importance à ce niveau de compétition. Le principe d’attribution des dossards est donné en annexe A. Afin de réaliser en programmation orientée objet le traitement d’attribution des dossards, des classes ont été conçues. Elles sont présentées en annexe B. L’implémentation des classes utilise une classe technique : la classe Collection. Un objet de cette classe permet de gérer un ensemble d’objets. L’interface de cette classe est présentée en annexe C. Travail à réaliser 1. Réaliser le DCL 2. Justifier la déclaration de la collection lesParticipants dans la classe Course. Proposer une représentation algorithmique de la méthode init de la classe Course. 3. On souhaite traiter l’attribution des dossards pour une course de Classique. Proposer une représentation algorithmique des méthodes traitementDossards et attribuerDossard de la classe Course_Classique. ANNEXE A – Attribution des dossards Le numéro de dossard d’un compétiteur détermine l'ordre de départ lors de la course. En classique et poursuite, les premiers sont assurés d'avoir une piste plus rapide. En Marathon et fond spécial, la tactique intervient beaucoup et les premières places au départ ne sont pas forcément les meilleures. Cet ordre de départ prend en compte les classements des skieurs. Les compétiteurs sont classés au niveau mondial selon deux types de classement. Le classement FIS prend en compte les résultats des skieurs participant à une course organisée par la Fédération Internationale de Ski : en fonction de son ordre d’arrivée, un skieur obtient des “ points FIS ” qu’ils cumulent sur l’année. Le classement en Coupe du Monde de ski de fond (mais aussi aux Jeux Olympiques ou au Championnat du Monde de ski) est différent du classement FIS, ce système est appelé WCSL (World Cup Starting List). Il s'agit d'un classement par discipline des meilleurs mondiaux du moment et indépendant du classement par "points FIS". Le classement FIS se fait suivant le principe des pénalités et est publié à la fin de six périodes de prise en compte. Quant au classement WCSL, il se fait par cumul de "points WCSL" et est redéfini à chaque course. Seuls les 30 premiers skieurs d'une course obtiennent des "points WCSL". Les "points WCSL" sont calculés en tenant compte des résultats de la saison précédente. Attribution des dossards en classique et poursuite -

les 7 premiers dossards sont tirés au sort parmi les 7 premiers de la WCSL de la spécialité ; les 8 dossards suivants sont tirés au sort parmi les 8 suivants (de 8 à 15 de la WCSL de la spécialité) ; ème les dossards de 16 à 30 vont, dans l'ordre du 16ème WCSL et suivants jusqu'au 30 WCSL de la spécialité ; de 30 à la fin, dans l'ordre des points FIS.

Ces courses se déroulent en deux manches. Les compétiteurs conservent le même dossard durant les deux manches. Mais l’ordre de départ de la deuxième manche s’effectue, en principe, dans l’ordre inverse du classement de la première manche, et seuls les trente premiers de la première manche sont sélectionnés.

Sébastien Gagneur – TD6 - EXOS

6

Attribution des dossards en Marathon et fond spécial Il n'y a qu'une seule manche. Les meilleures places varient en fonction de l'état de la neige et aussi de la tactique. ème ème Si la neige est plutôt fraîche, les meilleures places sont la 5 ou la 6 place (avant la neige est trop molle, après la piste est creusée). Si la neige est très dure, la piste restera bonne jusqu'au bout. Il est généralement intéressant de laisser partir certains concurrents devant, pour voir comment est la piste et quel est leur temps. Mais un skieur très fort peut vouloir partir premier, faire un excellent temps et ainsi exercer une pression sur ses concurrents. Les dossards sont choisis ainsi : - Les 15 premiers WCSL de la spécialité choisissent leur dossard parmi 1 à 30. Le premier choisit celui qu'il veut, le deuxième choisit parmi les dossards qui restent, etc… ; - Les 15 suivants ont les dossards restants, dans l'ordre (le 15ème a le premier dossard libre, et ainsi de suite) ; Les suivants, à partir de 30, partent dans l'ordre de leur classement FIS. ANNEXE B – Classes de programmation pour le traitement d’attribution des dossards Le diagramme de classe : Ce diagramme montre : 1. Une relation d’héritage entre COURSE et respectivement COURSE_Classique et COURSE_Marathon (en skating). Ainsi les classes COURSE_Classique et COURSE_Marathon (en skating) héritent des caractéristiques et du comportement de la classe COURSE. 2. Une classe PARTICIPATION qui représente la participation des skieurs à une course. Elle permet de connaître le dossard de chaque participant ainsi que d’enregistrer le classement obtenu en fin de course. 3. Une association entre la classe COURSE et la classe PARTICIPATION. Cette association montre la multiplicité attachée au rôle de chaque classe dans l’association. La multiplicité montre combien d'objets de la classe considérée peuvent être liés à un objet de l'autre classe : pour une course, il y a plusieurs participants (multiplicité *) ; une participation concerne une seule course (multiplicité 1, valeur par défaut). 4. Une association entre la classe PARTICIPATION et la classe COMPETITEUR. Elle permet de connaître pour une PARTICIPATION à une course quel est le COMPETITEUR. Un COMPETITEUR peut participer à plusieurs courses, d’où la multiplicité * attachée au rôle de la classe PARTICIPATION. Déclaration des classes : Classe Competiteur // Chaque objet de cette classe représente un skieur inscrit aux épreuves de la Coupe du Monde // Attributs Privé numeroCompetiteur : entier nomCompetiteur : chaîne_de_caractères prenomCompetiteur : chaîne_de_caractères classementFIS : entier classementWCSL : entier Fin classe Competiteur Classe Course // Chaque objet de cette classe est une épreuve de la Coupe du Monde // Attributs Privé nomCompetition : chaîne_de_caractères dateCompetition : date

Sébastien Gagneur – TD6 - EXOS

7

lesParticipants : collection de Participation // Opérations Protégé Procédure classerLesParticipants() // ordonne la collection lesParticipants // dans l’ordre du classement WCSL puis FIS Public Procédure init (competiteursParticipants : collection de Competiteur) // valorise la collection // lesParticipants et instancie les objets de la classe Participation à // partir de la liste des compétiteurs fournie par competiteursParticipants Procédure traitementDossards() // permet de réaliser l’affectation d’un dossard à chaque concurrent Fin classe Course Classe Course_Classique hérite de Course // Chaque objet de cette classe est une course de classique // Opérations Privé Procédure attribuerDossards (entrée borneInf : entier, borneSup : entier) // attribue aléatoirement des numéros // de dossard entre deux valeurs fournies en paramètre // Exemple d’appel attribuerDossards(1,7) // attribue aux sept premiers compétiteurs des numéros de dossards entre 1 et 7 Public Procédure traitementDossards() // permet de réaliser l’affectation d’un dossard à chaque concurrent Fin classe Course_Classique Classe Course_Marathon hérite de Course // Chaque objet de cette classe est une course de Marathon (skating) // Opération Public Procédure traitementDossards() // permet de réaliser l’affectation d’un dossard à chaque concurrent Fin classe Course_Marathon Classe Participation // Chaque objet de cette classe représente la participation d’un compétiteur à une course // Attributs Privé leCompetiteur : Competiteur // un Compétiteur participant à la course numDossard : entier classement : entier // classement obtenu en fin de course // Opérations Public Procédure init (unCompetiteur : Competiteur ) // valorise l’attribut leCompétiteur, // initialise à 0 les attributs numDossard et classement // Fonctions d’accès en écriture Procédure setNumDossard (entrée num : entier) // Fonction d’accès en lecture Fonction getNumDossard() : entier Fin classe Participation Remarque : En outre on dispose d’une fonction fournie par le système : Fonction alea (entrée binf : entier, entrée bsup : entier) : entier d’une valeur //comprise entre les valeurs binf et bsup

Sébastien Gagneur – TD6 - EXOS

// fonction de tirage aléatoire

8

ANNEXE C – Classe Collection Classe Collection // classe générique : un objet de la classe Collection permet de // gérer un ensemble d’objets ou collection. Fonction cardinal () : entier // renvoie le nombre d’éléments de la collection Fonction existe (entrée unObjet : objet) : booléen // teste si un objet existe dans la collection Fonction index (entrée unObjet : objet) : entier // renvoie l’index d’un objet de la collection, le premier objet // de la collection a pour index 1 Fonction extraireObjet (entrée index : entier) : objet // accède à un objet contenu dans la collection Fonction ajouter (entrée unObjet : objet) : entier // ajoute un objet à la collection et renvoie l’index alloué Procédure enlever (entrée index : entier ) // supprime un objet de la collection Procédure vider() // vide le contenu de la collection Fin classe Collection Pour instancier une collection uneCollection : Collection de // La collection instanciée contiendra des objets de la classe Pour parcourir par itération les éléments d'un objet Collection Pour chaque dans faire // instructions avec FinPour L’avantage de cette classe est de proposer des services d’ajout et de suppression plus simples que la gestion d’un tableau. En outre le problème du dimensionnement de la structure n’est pas à la charge du développeur. Toute variable d'un type de base (entier, chaîne…) peut être considérée comme un objet d'une collection.

Sébastien Gagneur – TD6 - EXOS

9

TD6-SLAM-EXOS.pdf

session, la date de début de session et le nombre de participants maximum diffèrent. Lors de l'inscription à une formation, chaque employé classe toutes les ...

121KB Sizes 14 Downloads 234 Views

Recommend Documents

No documents