École de technologie supérieure Génie de la production automatisée
GPA665
Structures de données et algorithmes
Laboratoire 3
Arbre Généalogique
Responsable du cours : Mohamed Cheriet, ing., Ph. D.
Rédaction du laboratoire : Jean-Christophe Demers Révision et barème de correction : Yan Levasseur & Mathieu Binette Temps alloué pour ce laboratoire : 4 périodes de laboratoire
Résumé
Les relations familiales sont considérées comme des liens privilégiés, voir même sacrées par plusieurs populations humaines. Beaucoup de personnes se passionnent pour la descendance et les ancêtres d’une personne ou d’un couple et se font un devoir de mettre en images le réseau parfois très dense qui représente les liens familiaux. Le présent laboratoire traite d’un outil informatisé permettant une gestion simplifiée d’un arbre généalogique personnel.
Ce laboratoire permet à l’étudiant de concevoir et développer les services associés à une structure de données complexe de style arbre, graphe, liste chaînée ou autres, ou mieux une combinaison de ceux-ci. Des options d’insertion, modification et suppression de personne au sein de l’arbre généalogique seront implantées.
Bien sûr, nous nous devons de nous conformer aux critères qui assurent la plus grande qualité logicielle
Ce laboratoire vous donnera l’occasion de vous familiariser avec les concepts associés aux arbres. Vous devez créer un logiciel qui fait la gestion des membres d’une famille et qui affiche la structure de l’arbre généalogique sous-jacent.
Spécification du logiciel
Pour réaliser ce laboratoire vous aurez à implanter une structure représentant l’arbre généalogique basé sur un arbre. Voici les fonctionnalités que vous devez implanter :
1. Ouvrir un fichier texte du type *.AG et créer en mémoire la structure de données correspondante.
2. Enregistrer la structure de données dans un fichier texte de type *.AG.
3. Afficher la liste de toutes les personnes présentes dans la base de données 4. Afficher l’arbre sous-jacent d’une personne en considérant
a. soit ses parents b. soit ses enfants.
5. Ajouter un nouveau membre à la famille.
6. Modifier les informations relatives à un membre de la famille 7. Retirer un membre de la famille.
Informations
Structure de données
La structure de données que vous devez utiliser peut se baser sur le principe des arbres à plusieurs branches, ou sur un autre principe. En effet, chaque membre de la famille possède l’information binaire permettant de connaître ses parents et l’information multiple permettant d’identifier ses enfants. L’espace mémoire pour l’allocation des liens vers les enfants doit être alloué dynamiquement. Soyez vigilants car il sera possible de rajouter des personnes dans l’arbre généalogique. Comme l’espace doit être alloué dynamiquement, une façon d’augmenter l’espace alloué pour les enfants d’un individu doit être prévu. De plus, il convient de réfléchir à une méthode de parcours de la structure de données qui tiennent compte des cas limites comme par exemple la présence d’un individu dans la base de données qui n’est pas (encore) relié à un autre individu.
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES HIVERS 2001
LABORATOIRE 3 3 / 8
Voici un exemple de structure de données très limitée puisqu’elle nécessitera une réallocation suivie d’une désallocation pour le pointeur Enfants si des enfants additionnels se rajoutent. De plus, cette conception ne tient pas compte de la présence éventuelle d’individus orphelins. Finalement, retrouver un individu avec cette structure sera fastidieux.
typedef struct {
char Nom[41]; // Nom de la personne TIndividu* Pere; // Index du père TIndividu* Mere; // Index de la mère Int nbEnfants ; //
TIndividu** Enfants; // Tableau pour les enfants
} TIndividu;
Format *.AG
Un format du genre suivant permet d’emmagasiner les informations nécessaires d’un arbre généalogique. Dans ce fichier texte, nous avons utilisé le « _ » pour éviter la confusion avec un espace (mais vous devrez le remplacer lors de l’affichage). En début de ligne, un nom rencontré indique une nouvelle personne dans la base de données.
Ensuite, le code « P: » indique le nom du père de la personne, le code « M: » indique le nom de la mère de la personne, alors que « E: » indique un enfant de la personne.
Ernest_Tremblay E: Jacques_Tremblay Nicole_Morency E: Jacques_Tremblay
Daniel_Blais E: Louise_Blais E: Albert_Blais Jacqueline_Lemire E: Louise_Blais
Jacques_Tremblay P: Ernest_Tremblay M: Nicole_Morency Louise_Blais P: Daniel_Blais M: Jacqueline_Lemire E: Paul_Tremblay_Blais E: Lise_Tremblay_Blais
Paul_Tremblay_Blais P: Jacques_Tremblay M: Louise_Blais
Albert_Blais P: Daniel_Blais E: Olivier_Blais E: Alexandre_Blais E: Isabelle_Blais
Gilbert_Blais P: Daniel_Blais Olivier_Blais P: Albert_Blais Alexandre_Blais P: Albert_Blais Isabelle_Blais P: Albert_Blais
Lise_Tremblay_Blais P: Jacques_Tremblay M: Louise_Blais Notez que ce format de fichier est indifférent aux sauts de lignes.
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES HIVERS 2001
LABORATOIRE 3 4 / 8
Nous vous recommandons d’utiliser les fonctions fputs et fgets pour lire et écrire les noms tandis que fprintf et fscanf sont efficaces pour lire et écrire les index.
Affichage d’informations
Plusieurs types d’affichage vous sont demandés dont 3 pour les données. Ce sont l’affichage du contenu de l’arbre généalogique, l’affichage de tous les parents d’une personne et finalement l’affichage de tous les enfants d’une personne. De plus, vous devez être en mesure d’afficher certaines informations sur votre structure de données : à savoir sa taille, sa hauteur maximale (le nombre maximal de liens dans une direction), le nombre d’éléments orphelins (sans parents) et le nombre d’individus sans enfants.
Voici le contenu de notre arbre généalogique (affichage toujours sans les « _ ») :
(0) Ernest Tremblay (1) Nicole Morency (2) Daniel Blais (3) Jacqueline Lemire (4) Jacques Tremblay (5) Louise Blais
(6) Paul Tremblay Blais (7) Albert Blais
(8) Gilbert Blais (9) Olivier Blais (10) Alexandre Blais (11) Isabelle Blais (12) Lise Tremblay Blais
Pour afficher le contenu de votre structure de donnée, vous devez afficher chaque individu précédé d’un numéro entre parenthèse. Ce numéro nous permettra de sélectionner la personne pour éventuellement visualiser ses liens ou même les modifier.
Pour l’affichage des parents d’une personne, on s’aperçoit que la structure ressemble fort à un arbre binaire : (ici les l’arbre des parents de Paul Tremblay Blais) :
Paul Tremblay-Blais Père Mère Jacques Tremblay
Père Mère
Louise Blais Père Mère Ernest Tremblay
Père Mère
Nicole Morency Père Mère
Daniel Blais Père Mère
Jacqueline Lemire Père Mère
Puisque vous travaillez en mode texte, vous devez créer une fonction d’affichage qui affiche l’arbre de la façon suivante :
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES HIVERS 2001
LABORATOIRE 3 5 / 8
Paul Tremblay-Blais Jacques Tremlay Ernest Tremblay Nicole Morency Louise Blais
Daniel Blais Jacqueline Lemire
Maintenant, pour l’affichage de tout les enfants, la représentation ressemble à une structure de type arbre n-aire. Ici un schéma des enfants de Daniel :
Encore une fois vous devez générer ce type d’affichage :
Daniel Blais Albert Blais
Olivier Blais Alexandre Blais Isabelle Blais Louise Blais
Paul Tremblay-Blais Lise Tremblay-Blais Gilbert Blais
Ajout, édition et retrait d’un individu
Pour l’ajout d’un individu, l’usager doit saisir le nom de ce dernier (suggestion : il pourrait aussi spécifier ses parents / enfants avec la même syntaxe que dans le fichier *.AG).
Dans l’option d’édition des informations d’un individu, l’usager a la possibilité de changer le nom de l’individu, ou de modifier / retirer ses parents ou enfants, ou même rajouter un enfant. Finalement, pour le retrait d’un individu, l’usager n’a qu’à saisir le nom de l’individu en question.
Après chacune de ces modifications, vous devez vous assurer que la structure de données reste cohérente. N’oubliez pas de faire la gestion de la liste des cases vides!
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES HIVERS 2001
LABORATOIRE 3 6 / 8
Interface usager
L’interface usager est laissée à votre discrétion. Vous devez seulement respecter les contraintes énoncées et vous assurez que l’interface offre une convivialité suffisante pour le bon fonctionnement du programme.
Contraintes supplémentaires
Vous devez valider la cohérence des informations contenues dans le fichier d’entrée.
Vous ne devez utiliser aucune variable globale.
Chacune de vos fonctions doit être concises et précises (pas de fonction de plus de 25 lignes – en ne comptant pas les commentaires évidemment).
Évaluation
L’évaluation de ce laboratoire sera différente des deux laboratoires précédents et permettra à l’évaluateur de faire une évaluation interactive. L’évaluation sera en trois parties :
1. Comme d’habitude, vous devez produire un rapport comprenant un organigramme général du déroulement de votre programme (1 page). Vous devez aussi remplir la grille d’évaluation. Par contre, notez qu’il n’y aura pas de questions à répondre par écrit.
2. Vous aurez à faire une brève présentation orale au chargé de laboratoire. Cette présentation d’une dizaine minutes vous donnera la chance d’expliquer en détail les éléments importants du laboratoire. Par exemple, vous pouvez expliquer votre approche globale, les difficultés que vous avez eues et les solutions que vous avez trouvées.
3. Finalement, vous aurez à répondre aux questions de l’évaluateur (environ 10 minutes également). Ces questions permettront de bien cerner votre niveau de compréhension.
L’évaluation se fera pendant la semaine d’examen. La date exacte n’est pas déterminée mais l’évaluation sera pendant la période des examens finaux. Lors des deux dernières périodes de laboratoire, une feuille circulera vous permettant de réserver un bloc horaire.
C’est votre responsabilité de vous présenter à cette évaluation.
À titre indicatif, voici des exemples de questions qui pourraient vous être posées :
Quelle est la pertinence de la structure de données choisie dans ce laboratoire ? Est-ce que cette représentation des données vous permet de retrouver rapidement une personne à l’aide de son nom ? Quels sont les inconvénients de la structure choisie ?
De quelle façon pourrait-on étendre les fonctionnalités du programme pour incorporer un très grand nombre de liens différents ? Ce pourrait être des liens vers la belle-famille, vers des collègues ou amis.
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES HIVERS 2001
LABORATOIRE 3 7 / 8
La remise se fait par un fichier ZIP correspondant aux éléments suivants :
Le dossier principal de votre projet Visual C++ incluant tous ses dépendants (sauf les librairies principales du C/C++). N’oubliez pas de bien documenter votre code source.
Une version exécutable de votre programme.
Un PDF de votre rapport.
Le fichier doit être nommé :
GPA665_LAB3_ArbreGenealogique_VotreNom.ZIP
Le tout doit être remis par courriel au chargé de laboratoire avant la date prescrite.
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES HIVERS 2001
LABORATOIRE 3 8 / 8
Grille d’évaluation
En guise d’autoévaluation, imprimez et remplissez vous-même cette section. Mentionnez une référence (nom de fichier et numéro de ligne) lorsque demandé pour faciliter la vérification par le correcteur.
Spécifications techniques Oui Non Référence (fichier, ligne) 5 Chargement et sauvegarde d’un fichier
d’arbre généalogique *.AG
_____________________
_____________________
5 Affichage de tous les individus _____________________
5 Affichage de tous les parents d’un individu _____________________
5 Affichage de tous les enfants d’un individu _____________________
5 Ajout / Suppression d’un individu _____________________
5 Modification des données d’un individu _____________________
Spécifications de programmation Oui Non
5 Structure de données appropriée _____________________
5 Gestion dynamique de la mémoire et
libération de l’espace alloué _____________________
(-10) Aucune variable globale
Qualité logicielle T.B. Bon Pauvre Référence (fichier, ligne) 5 Modularité : usage généralisé de fonctions
et regroupement logique en modules
_____________________
_____________________
5 Robustesse : Précaution pour éviter les problèmes de données erronées, etc.
_____________________
_____________________
5 Documentation : Commentaires pertinents qui accélèrent la compréhension du code
_____________________
_____________________
5 Clarté du code : Code concis et court utilisant les fonctions adaptées
_____________________
_____________________
60 TOTAL