Lors du dernier TD, nous n’avons pas eu assez de temps pour que vous analysiez la correction que je vous proposais. Rattrapons nous donc aujourd’hui. Vous devriez répondre rapidement aux trois premières questions (montrez moi quand c’est fait, que je puisse vous noter). Les classes seront définies dans un fichier différent de celui du programme principal (qui ne vous servira qu’à tester vos méthodes). Vous m’enverrez, obligatoirement par mail, l’état de votre TP dès la fin du TP. Vous aurez ensuite 36h (jusqu’à demain soir) si vous voulez m’envoyer un supplément.
Rappel du contexte : Un outil bien utile pour toute planification est le diagramme de Gantt. Un tel diagramme comporte des "blocs" décrivant chacun une tâche à effectuer : le nom de cette tâche, mais aussi quelles ressources (humaines et matérielles) elle nécessite, et obligatoirement une estimation de sa durée (avec si possible un intervalle de tolérance). De plus on impose, entre ces tâches, des relations d’antériorité (quelles sont les tâches qui doivent être terminées pour pouvoir entamer une tâche donnée).
Définissez dans un premier temps une "tâche" (à l’aide d’une classe). Une tâche contient :
un nom (vous utiliserez des objets de type "string". Cette classe permet de gérer les chaînes de caractères, avec de nombreuses méthodes qu’on peut utiliser en incluant le fichier
un nombre de personnes ressources
une durée minimale (en heures, 1h30mn sera noté représenté par la valeur 1.5)
une marge sur la durée (durée maximale acceptée en plus de la durée minimale ; 0 si la durée est impérative)
Déclarez la classe, avec des accesseurs en lecture pour chaque attribut, une méthode pour la saisie et une pour l’affichage (sans s’occuper des antériorités). Prévoyez un accesseur en écriture (recevant 4 arguments) pour fixer en une fois les 4 attributs. Faites un petit programme pour tester vos méthodes.
Si vous déclarez :
class tache_etendue:public tache
{
int A1,A2;
public:
//ici vous rajoutez les méthodes nécessaires
};
alors, tout objet « classe_etendue » possède (on dit « hérite ») tous les attributs et méthodes des objets « tache », plus les attributs (A1 et A2) et méthodes que vous avez ajoutées. Si dans classe_etendue vous ajoutez une méthode de même nom qu’une méthode déjà définie dans une tâche (par exemple saisir), alors ce sera cette dernière qui s’appliquera par défaut, sauf si vous demandez explicitement « tache ::saisir ».
A1 et A2 représentent des numéros de tâche, on se limite à deux antériorités par tâche. Quand un tâche n’a qu’une antériorité, alors elle est stockée dans A1, et A2 sera mis à -1. Quand une tâche n’a aucune antériorité, A1 = A2 = -1.
Prévoyez des accesseurs en écriture et lecture (nommés get_A1, get_A2, set_A1 et set_A2), la saisie (qui utilisera « tache ::saisir ») et l’affichage. get_nb_ant donnera le nombre d’antériorités. Testez
Un diagramme de Gantt est un ensemble de plusieurs tâches (avec leurs antériorités). Supposons avoir N<20 tâches (numérotées entre 0 et N-1) regroupées (sous forme d’un tableau) dans un objet (la classe s’appellera "diagramme"). Nous avons déjà traité plusieurs fois des tableaux d’objets, profitez-en.
Déclarez la classe "diagramme" en prévoyant les méthode : afficher (qui utilise évidement la méthode d’affichage de chacune des tâches), saisir. Un accesseur en lecture, à qui l’on donne en argument un entier i, retourne la « tache_etendue » d’indice i. Un accesseur en écriture, à qui l’on donne en argument un entier i<=N, et une « tache_etendue » met cette tâche dans le tableau à l’indice i (en écransnt l’ancienne si i Ecrivez une méthode nommée "incoherence" qui pour un diagramme retourne 0 si ses antériorités sont cohérentes, un entier non nul sinon. Vous utiliserez obligatoirement l’algorithme suivant :
les tâches n’ayant aucune antériorité sont notées comme étant "valides". Puis on parcourt toutes les tâches, celles ayant toutes leurs antériorités valides sont également valides. On recommence jusqu’à ce qu’on ait parcouru les N tâches sans avoir trouvé de nouvelle tâche à valider. On retourne alors le nombre de tâches non valides.
Vous pourrez, si vous en avez besoin, créer des tableaux temporaires (sous forme d’objets ou non). S’il vous faut des méthodes supplémentaires, définissez les. Ecrivez une méthode qui (recevant en argument un indice de tâche) retourne 1 si la tâche est initiale (n’a aucune antériorité), 2 si elle est terminale (n’est l’antériorité de rien), 3 si elle est intermédiaire (possède des antécédants et des suivants), 4 si elle est isolée (initiale et terminale). Le but est de déterminer la durée totale d’un projet (mini et maxi). Résolvez le problème dans le cas d’un diagramme linéaire (une et une seule antériorité par tâche, qui se suivent toutes séquentiellement). Puis essayez de résoudre les cas à une seule tâche initiale et une seule tâche finale, mais où deux (voire plus de deux) trajets sont possibles. On appelle « chemin critique » le plus long. Si vous avez une idée pour le cas général, vous pouvez m’en parler.Question 4
Question 5
Gestion des durées et chemins critiques
Question 6