Examen d'informatique 3i1 Polytech'Grenoble 3h30 - Tous les documents sont autorisés Le barème est donné à titre indicatif, il peut être modifié. La notation prendra en compte la qualité de vos commentaires, la compilation sans erreur et sans warnings et la bonne exécution de vos fonctions. Vous trouverez à la racine de votre compte Linux un répertoire ExamC_3i1_2008/ contenant les fichiers décrits dans l'énoncé. A la fin de l'examen, SEUL ce répertoire (et donc tous les fichiers qu'il contient) sera automatiquement recopié et corrigé. L'objectif du problème est de vous faire manipuler des listes chainées de stations de lignes de tramways. Une ligne de tramway est désignée par : - une lettre (A ou B ou C, etc...); - la liste chainée des stations. Chaque station est décrite par : - son ordre d'apparition dans le sens aller (1ere, 2e, 3e, etc..); - son ordre d'apparition dans le sens retour (1ere, 2e, 3e, etc..); - le nom (intitulé) de la station. Exemples : La ligne A est composé de 29 stations, parmi lesquelles : La station "Saint-Bruno" est la 7e dans le sens aller et la 23e dans le sens retour; La station "Gares" est la 8e dans le sens aller et la 22e dans le sens retour. La ligne B est composé de 20 stations, parmi lesquelles : La station "Cité Internationale" est la 1ère dans le sens aller et la 20e dans le sens retour. La station "Gares" est la 4e dans le sens aller et la 17e dans le sens retour. Préparatif à l'examen : Vous trouverez à la racine de votre compte un répertoire ExamC_3i1_2008/ contenant 3 fichiers : - exam_tramway.c qui contient le squellette du programme C à écrire ; - lignea.txt qui contient la liste des stations de la ligne de tramway A de Grenoble - ligneb.txt qui contient la liste des stations de la ligne de tramway B de Grenoble page 1
1 ère partie Dans cette partie, on souhaite manipuler une liste de stations en utilisant une liste chainée. La liste de stations et le descriptif de chaque station sera saisie au clavier par l'utilisateur. Question 1 (1 pts) Définir une structure autoréférencée NoeudStation permettant de mémoriser : - la description d'une station (ordre d'apparition dans le sens aller, ordre d'apparition dans le sens retour et son intituté) - un pointeur vers un autre NoeudStation. Cette structure permettra de représenter un élément d'une liste chainée de stations. Question 2 (1 pts) Définir une structure LigneTramway permettant de gérer une liste de stations. Cette structure devra posséder : - un champ pour indiquer le nom de la station décrit par une lettre; - un champ pour accéder à la liste de ses stations Question3 (1 pts) Ecrire une fonction InitNoeud qui alloue et initialise tous les champs d'un élément NoeudStation (les ordres d'apparition aller et retour à 0, l'intitulé à la chaine de caractères vide). Le prototype de cette fonction devra être : NoeudStation *InitNoeud(); Question 4 (1 pts) Ecrire une fonction InitLigne qui alloue et initialise tous les champs d'une structure LigneTramway. Le prototype de cette fonction devra être : LigneTramway *InitLigne(); Question 5 (2.5 pts) Ecrire une fonction CreerLigne qui demande à l'utilisateur le nom de la ligne puis crée les éléments de la liste chainée en demandant chaque fois à l'utilisateur l'intitulé de la station, son ordre d'apparition dans le sens aller et son ordre d'apparition dans le sens retour. Le prototype de cette fonction devra être : LigneTramway *CreerLigne(); L'ordre de saisie des stations n'aura pas d'importance puisque l'on connait leurs ordres d'apparition dans le sens aller et retour (vous pourrez donc ajouter une station à la liste des stations en début ou en fin de liste). page 2
Question 6 (2 pts) Ecrire une fonction AfficherLigne qui affiche toutes les informations de toutes les stations contenues dans la ligne de tramway passé en paramètre. Le prototype de cette fonction devra être : void AfficherLigne(LigneTramway *lg); Question 7 (1.5 pts) Ecrire le programme principal pour tester toutes vos fonctions. Question 8 (2 pts) Ecrire une fonction NbStations qui compte le nombre d'éléments d'une liste de stations. L'affichage de la valeur calculée se fera dans le programme principal. Vous pourrez faire une version itérative ou une version récursive. Le prototype de cette fonction devra être : int NbStations(NoeudStation *liste); 2 ième partie Dans cette partie, on souhaite construire la liste de stations en utilisant la description de stations contenue dans un fichier texte. Vous avez à votre disposition deux descriptifs de lignes de tramways : lignea.txt et ligneb.txt. Ces fichiers texte de données ont la forme suivante : - la première ligne contient une lettre qui est le nom de la ligne; - toutes les lignes de texte suivantes sont le descriptif des stations de cette ligne de tramway. Typiquement, l'une de ces lignes de texte est de la forme suivante : ordre d'apparition sens aller (un entier) ordre d'apparition sens retour (un entier) intitulé d'une station (une chaine de caractères) Par exemple dans le fichier lignea.txt 7 23 Saint-Bruno Par exemple dans le fichier ligneb.txt 4 17 Gares Question 9 (3 pts) Ecrire une fonction CreerLigneFichier qui crée et retourne une ligne de tramway à partir du nom du fichier texte passé en paramètre. page 3
Question 10 (1 pts) Ecrire une fonction PresenceStation qui prend en paramètre l intitulé d une station et une liste de stations et retourne 1 si l intitulé de la station est bien présent dans la liste des stations, 0 sinon. Question 11 (2 pts) Ecrire une fonction IntersectionLignes qui prend en paramètre deux lignes de tramways et affiche à l'écran l intitulé des stations communes aux deux lignes. Vous testerez cette fonction dans le programme principal par les deux lignes de tramways définis dans lignea.txt et ligneb.txt. Question 12 (2pts) Il peut arriver qu'une station soit en travaux, il n'y a alors plus d'arrêt pour cette station. Pour modéliser cette situation, définir une fonction EnleverStation qui prend en paramètre le nom de la station en travaux et une liste de stations et retourne cette liste de stations de laquelle on a supprimé la station en travaux. Attention : il ne suffira pas de supprimer un maillon de la liste chainée, il faudra également renuméroter les ordres d appartition aller et retour de certaines stations de la ligne. Question 13 Bonus (2 pts) Ecrire une fonction AfficherLigneSensAller qui affiche dans le sens aller l'intitulé des stations de la ligne de tramway passé en paramètre (c'est à dire dans l'ordre croissant de l'ordre d'apparition du sens aller). Aide : vous pourrez définir une fonction RechercheIntituleSensAller qui prend en paramètre un entier décrivant un ordre d'apparition dans le sens aller d'une station et une liste de station et retourne l'intitulé de cette station. page 4
A 14 16 Albert 1er de Belgique 9 21 Alsace-Lorraine 19 11 Arlequin 28 2 Auguste Delaune 6 24 Berriat-Le magasin 2 28 Charles Michels 13 17 Chavant 29 1 Echirolles Denis Papin 25 5 Echirolles Gare 24 6 Essarts-La Butte 3 27 Fontaine Hotel de ville 1 29 Fontaine La Poya 5 25 Gabriel Péri-Les Fontainades 8 22 Gares 20 10 Grand Place 11 19 Hubert Dubedout-Maison du Tourisme 18 12 La Bruyère 26 4 La Rampe-Centre ville 22 8 Les Granges 4 26 Louis Maisonnat 17 13 Malherbe 27 3 Marie Curie 16 14 MC2-Maison de la Culture 15 15 Mounier 21 9 Polesud-Alpexpo 7 23 Saint-Bruno 23 7 Surieux 12 18 Verdun-Préfecture 10 20 Victor Hugo B 5 16 Alsace-Lorraine 16 5 Bibliothèques Universitaires 1 20 Cité Internationale 15 6 Gabriel Fauré 4 17 Gares 19 2 Gières Gare-Universités 20 1 Gières Plaine des sports 7 14 Hubert Dubedout-Maison du Tourisme 10 11 Ile Verte 13 8 Grand Sablon 11 10 La Tronche Hopital 14 7 Les Taillées-Universités 18 3 Mayencin-Champ Roman 12 9 Michallon 9 12 Notre-Dame Musée 2 19 Palais de justice 3 18 Saint-Bruno 8 13 Sainte-Claire les Halles 6 15 Victor Hugo 17 4 Condillac-Universités lignea.txt ligneb.txt page 5
exam_tramway.c #include <stdio.h> #include <stdlib.h> #include <string.h> /* Question 1 */ /* A compléter*/ /* Question 2 */ /* A compléter*/ /* Declaration des prototypes des fonctions */ /* prototypes des fonctions questions 3, 4, 5, 6 et 8 */ NoeudStation *InitNoeud(); LigneTramway *InitLigne(); LigneTramway *CreerLigne(); void AfficherLigne(LigneTramway *lg); int NbStations(NoeudStation *liste); /* prototypes des fonctions questions 9, 10, 11, 12 et 13 */ /* PROGRAMME PRINCIPAL */ int main() /* A completer */ return 0; /* Question 3 */ NoeudStation *InitNoeud() /* Question 4 */ LigneTramway * InitLigne() /* Question 5 */ LigneTramway *CreerLigne() /* Question 6 */ void AfficherLigne(LigneTramway *lg) /* Question 8 */ int NbStations(NoeudStation *liste) /* A completer */ /* Questions 9, 10, 11, 12, 13 */ page 6