Sujet d`examen avril 2015 - Université Grenoble Alpes

publicité
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
Téléchargement