Université Pierre Mendès France U.F.R. Sciences de l’Homme et de la Société Master IC2A DCISS – MASSS 21 avril 2015 ALGORITHMIQUE-2 Examen Durée : 2 h 30 Tous documents autorisés. Appareils électroniques interdits. Il sera tenu compte de la lisibilité des algorithmes. Pour chaque algorithme réalisé, on définira soigneusement les variables, les fonctions et les actions introduites pour résoudre le problème. Les exercices sont indépendants et peuvent être traités dans n'importe quel ordre. Dans un exercice, pour résoudre une question, vous pouvez utiliser une action ou une fonction définie dans une question précédente. Le barème est indicatif et proportionnel au temps estimé pour résoudre chaque question : 2 pts = 15 minutes. Exercice 1 : Listes chaînées (12 points) Un club de loisirs offre un ensemble d'activités (sports, jeux, lecture, etc.). Une personne peut s'inscrire à une ou plusieurs activités. Pour chaque activité on dispose d'un cahier d'inscriptions contenant le nom de l'activité et l'ensemble des noms des personnes qui y sont inscrites. L'ensemble des cahiers d'inscriptions forme le registre des inscriptions du club. Les noms de personnes sont distincts deux à deux. Les noms d'activités sont distincts deux à deux. Le registre des inscriptions est représenté par une liste chaînée de cahiers d'inscriptions (un cahier par activité), sans ordre particulier. Chaque cahier comporte un nom d'activité et la tête de la liste des personnes inscrites. Les noms d'activités sont distincts deux à deux. La liste des personnes inscrites est également représentée par une liste chainée, éventuellement vide. On représente les notions ci-dessus par le lexique suivant : Lexique partagé Cahier : type agrégat nomActivité : chaine têteP : une AdrPersonne, suiv : une AdrCahier fagregat AdrCahier : type pointeur de Cahier Personne : type agrégat nom : chaine ; suiv : AdrPersonne fagregat AdrPersonne : type pointeur de Personne Lexique principal treg : AdrCahier // registre : tête de la liste de cahiers Master IC²A – DCISS 1/4 JMA – 04/2015 La figure ci-dessous schématise la structure de données décrite par ce lexique : 1) Compréhension de la structure de données (1 point) Donnez la séquence d’instructions qui affiche à l’aide d’un écran e : - le nom de l'activité du premier cahier apparaissant dans le registre, - puis le nom de la première personne apparaissant dans la liste d'inscription de ce cahier (on suppose que le registre n’est pas vide et que le premier cahier comporte au-moins un inscrit). 2) Recherche d'un cahier dans le registre des inscriptions (2 points) Ecrire la fonction activité qui recherche une activité dans le registre : fonction activité(treg : AdrCahier ; a : chaine) → AdrCahier // activité(a) renvoie l’adresse de la cellule contenant l’activité a, dans le registre des inscriptions // de tête treg ; renvoie nil s’il n’y a pas d’activité de nom a. 3) Les activités les plus demandées (3 points) Une activité est la plus demandée si son nombre d'inscrits est maximum (supérieur ou égal au nombre d'inscrits de chacune des autres activités) : lorsque le registre n'est pas vide, il y en a au moins une, mais il peut y en avoir plusieurs. Ecrire l’action nbActivitésPlusDemandées qui affiche, à l’aide d’un écran e, le nombre d'activités les plus demandées ou 0 si le registre des inscriptions est vide, ainsi que le nombre de personnes inscrites à ces activités. action nbActivitésPlusDemandées (consultés treg : AdrCahier ; e : écran) // Effet : affiche, à l’aide de l’écran e, le nombre d'activités les plus demandées ou 0 si le registre // des inscriptions est vide, ainsi que le nombre de personnes inscrites à ces activités. Par exemple, si les activités les plus demandées sont au nombre de 3 et que 12 personnes sont inscrites à chacune de ces activités, l’action nbActivitésPlusDemandées affichera : Nombre d’activités les plus demandées : 3 Nombre de personnes inscrites : 12 Indication : privilégiez une solution n’effectuant qu’un seul parcours du registre des inscriptions. 4) Inscription d'une personne à une activité (3 points) Réaliser l’action ajouterInscription qui a pour effet d’inscrire une personne à une activité et de modifier la structure de données en conséquence : action ajouterInscription (modifié treg : AdrCahier ; consultés p : chaine ; a : chaine) // Effet : inscrit la personne de nom p à l’activité de nom a et modifie le registre des inscriptions de // sorte que la personne de nom p apparaisse dans la liste des personnes inscrites à l'activité de // nom a. Si la personne p est déjà inscrite à l'activité a, le registre est inchangé. Si l’activité a // n’existe pas dans le registre, on l’ajoute au registre. On utilisera la primitive de gestion mémoire créer pour la création d’une nouvelle cellule. Master IC²A – DCISS 2/4 JMA – 04/2015 5) Suppression d'une inscription (3 points) Réaliser l’action supprimerInscription qui a pour effet de supprimer l’inscription d’une personne à une activité et de modifier la structure de données en conséquence : action supprimerInscription(consulté treg : AdrCahier ; p : chaine ; a : chaine) // Effet : supprime la personne de nom p de l’activité de nom a et modifie le registre des // inscriptions de sorte que la personne de nom p soit supprimée de la liste des personnes inscrites // à l'activité de nom a. Si // la personne p n’est pas inscrite à l'activité a, le registre est inchangé, // on suppose que l’activité a existe dans le registre. On utilisera ma primitives de gestion mémoire détruire pour supprimer une cellule. Exercice 2 : Arbres binaires – récursivité (8 points) On considère des arbres binaires dont les informations protées par les nœuds sont des entiers : Nœud : type agrégat el : entier g : Arbre d : Arbre fagrégat // valeur // sous-arbre gauche // sous-arbre droit Arbre : type pointeur de Nœud Le niveau de la racine d’un arbre est 1, le niveau d'un nœud autre que la racine est 1 + le niveau du père de ce nœud. 1) Ecrire la fonction récursive sommeNivKSup qui, pour un arbre binaire a donné, calcule la somme des valeurs des nœuds dont le niveau est supérieur ou égal à un niveau k donné : fonction sommeNivKSup (a : Arbre ; k : entier) → entier // sommeNivKSup(a,k) renvoie la somme des valeurs des nœuds de l’arbre binaire a, dont le niveau // est supérieur ou égal à k Par exemple, si l’on considère l’arbre binaire suivant : Master IC²A – DCISS 3/4 JMA – 04/2015 2) Ecrire l’action récursive élaguerArbre qui, pour un arbre binaire a donné, supprime tous les nœuds de l’arbre dont le niveau est supérieur ou égal à un niveau k donné : action élaguerArbre (modifié a : Arbre ; consulté k : entier >0) // Effet : supprime les nœuds de l’arbre binaire a, dont le niveau est supérieur ou égal à k Par exemple, pour l’arbre donné en exemple (figure précédente), l’appel : élaguerArbre(a, 4) a pour effet de supprimer tous les nœuds dont le niveau est supérieur ou égal à 4, c'est-à-dire tous les nœuds dont la valeur apparaît en gras sur la figure. L’arbre résultat est donc le suivant : Pour réaliser cette action, on pourra introduire toute action complémentaire jugée nécessaire. Master IC²A – DCISS 4/4 JMA – 04/2015