Durée : 2h, documents personnels et calculatrice autorisés. Ce sujet comporte trois pages de texte. En cas d'informations insuffisantes, vous pouvez faire toute supposition qui vous arrange (et ne contredise pas le sujet), à condition de le préciser.
De nombreux problèmes qui se posent dans l'industrie sont en fait surtout un problème de planification, d'organisation et de gestion de nombreuses tâches imbriquées, alors que la réalisation individuelle de chaque tache est bien plus facile à définir. Il est étonnant que dans chaque domaine on ait développé des méthodes spécifiques pour déterminer l'ordre des tâches à effectuer : gamme d'usinage, Grafcet, SADT, gestion de flux, PERT, GANTT,... Pour tous ces outils, on essaie de déterminer l'ordre des tâches à partir d'une définition locale de contraintes d'antériorité (par exemple pour chaque tâche, connaître celles qui doivent être terminées avant). Donc pour la réalisation en C++ d'un de ces outils, on utilisera un objet « tâche » assez similaire. Nous allons dans ce sujet nous intéresser aux diagrammes PERT. Un Diagramme PERT (Program Evaluation and Review Technique) est (d'après le dictionnaire WebNTic) un « diagramme en réseau, lequel est une illustration graphique de la relation entre les activités d’un projet. Un diagramme de PERT résulte de l’application de la méthode du chemin critique et est composé d’activités, de durée d’activité, de date de fin d’activité (date au plus tôt, date au plus tard) ».
Peut-être aimeriez vous un petit dessin ?
Les
« étapes » (attention, ce mot ne
représente pas la même chose qu'en Grafcet) sont
représentées par un cercle. Elles correspondent à
un instant au cours du temps (date de début ou de
fin d’une tâche). Habituellement on numérote les
étapes. On indique aussi leur date de réalisation au
plus tôt et au plus tard (dans l'exemple ci dessus on a indiqué
les dates par des entiers, en nombre de jours depuis le début
du projet).
Une
tâche est représentée par une flèche.
Toute tâche a une étape de début et une étape
de fin. Une tâche suivante ne peut démarrer que si
toutes les tâches pointant sur son étape de début
sont terminées. Dans l'exemple chaque tâche est nommée
par une lettre, mais on peut aussi les numéroter (c'est ce
qu'on fera dans la suite du sujet), voire marquer un nom en clair.
Chaque tâche a une durée minimale (ou une durée
mini et une durée maxi), dans l'exemple on n'a indiqué
que la durée mini (un nombre de jours) placé à
côté du nom de la tâche.
Le but de ce sujet est donc de représenter de tels diagrammes en C++. Nous n'allons pas nous occuper de la représentation graphique (vous n'avez pas encore terminé votre projet), ni choisir les exactement les mêmes notations. Si ça vous arrange, j'accepte que les attributs des objets soient publics, mais je préfère que vous passiez par des « accesseurs » (nommés get_xxx et set_xxx si un objet a un attribut nommé xxx).
Question 1
Pour commencer, définissez une classe pour les dates.
Ici (et dans la suite), une date est composé de deux entiers : l'année (par exemple 2005) et un numéro de jour (entre 1 et 365). Dans un problème réel on serait évidemment plus précis (heure, minute) et on disposerait de méthodes permettent de trouver le numéro de jour à partir d'une date donnée classiquement en jour et mois, mais on ne le fera pas ici pour vous laisser du temps pour les questions suivantes.
Vous allez néanmoins prévoir quelques méthodes pour une date : saisie et affichage. J'aimerai également que vous surchargiez << et >> (même si ce n'est pas fait, vous pourrez l'utiliser dans les questions suivantes si nécessaire).
Définissez également deux fonctions permettant de comparer deux dates (ces fonctions reçoivent deux dates en argument, et retournent un entier valant 0 ou 1). L'une s'appellera « egal » et retournera 1 si les deux dates sont égales, 0 sinon; l'autre s'appellera « inferieur » et retournera 1 si le premier argument est antérieur (date plus ancienne) que le second argument. J'aimerai également que vous surchargiez = = et < (même si ce n'est pas fait, vous pourrez l'utiliser dans les questions suivantes si nécessaire, ainsi que tous les autres tests > >= <= != ...).
Nous aurons aussi par la suite besoin d'additionner un entier (un nombre de jours) à une date. Pour simplifer, nous supposer que les années multiples de 4 ont 366 jours, les autres 365. Ecrivez quelque chose qui permette d'effectuer cela (méthode, fonction ou surcharge d'opérateur, suivant ce que vous préférez). Vous pouvez supposer que le résultat ne sera que soit dans la même année que la date initiale, soit dans l'année immédiatement suivante.
Question 2
Définissez maintenant la classe « etape ». Une étape contient deux objets de type date, nommés « tot » et « tard ». Pour l'instant, on ne numérote pas encore les étapes. Définissez aussi les méthodes saisie et affichage pour une étape (utilisant celles d'une date).
Question 3
Vous allez maintenant créer un objet contenant un tableau de 100 étapes. Il contiendra également un entier nommé « nb » qui servira à désigner le nombre total d'étapes de notre projet (maximum 100). Il s'appellera « etapes ». Créez ici aussi une méthode de saisie (demande le nombre d'étapes puis saisit toutes les étapes), ainsi que l'affichage. Vous n'avez pas besoin de fignoler, en particulier il n'est pas nécessaire de vérifier qu'on ne dépasse pas les 100 étapes.
Question 4
Passons maintenant aux tâches. Une tâche contient trois entiers : sa durée (un nombre de jours), et les indices dans « etapes » de son étape de début et de celle de fin. Définissez la classe « tache » (avec une méthode de saisie et d'affichage). Définissez également un objet nommé « taches » qui contiendra un tableau de 100 tâches, ainsi qu'un entier nommé « nb » qui désignera le nombre total de tâches.
Question 5
Si nécessaire, pour cette question vous pouvez rajouter des méthodes aux objets précédemment créés (sans avoir besoin de tout réécrire). Ecrivez un programme qui crée deux objets : « taches » et « etapes », qui les saisisse puis teste la validité du diagramme PERT :
il vérifie, pour toutes les étapes, que la date « au plus tard » est bien postérieure (ou égale) à la date « au plus tôt ».,
pour chaque tâche, il vérifie que la date au plus tôt de son étape de fin est postérieure (ou égale) à la date au plus tôt plus la durée de la tâche. Il faudrait également faire ce test sur les dates au plus tard, mais ce n'est pas demandé ici.
Question 6
Dans une gestion de projet, il y a généralement plusieurs intervenants, qui de plus sont souvent dispersés (pas tous au même endroit) et mobiles (pas toujours au même endroit). Il serait bien de disposer d'un diagramme PERT centralisé quelque part et accessible (consultation et modification) via intranet ou internet. Pour cela il faudrait utiliser une architecture « client - serveur ». Expliquez ce que cela signifie, ce que cette architecture peut apporter à ce problème, et quels traitements devraient plutôt être « côté serveur » ou « côté client ». Une gestion de mots de passe semble nécessaire.
Remarques : les figures de ce sujet proviennent de www.transdata.fr/bois/Cours/PERT/PERT.htm Si vous remarquez dans une question qu'il faudrait que vous rajoutiez une méthode à un objet défini dans une question précédente, n'ayez pas peur de le faire. Si dans une question il serait intéressant d'utiliser des choses définies dans les questions précédentes, n'ayez pas peur de le faire (même si vous n'avez pas répondu aux questions précédentes). Les affichages de vos programmes n'ont pas besoin d'être trop nombreux ni trop fignolés, sinon vous n'aurez pas le temps de finir le sujet.
pour quelques pistes de solution, vous pouvez regarder la correction de ce sujet. Pour retourner au sommaire des sujets d'examen, cliquez là
Patrick
TRAU, ULP - IPST
mars 05