Logiciel de Base TPL1 : pratique du langage C - Ensiwiki
Transcription
Logiciel de Base TPL1 : pratique du langage C - Ensiwiki
Logiciel de Base TPL1 : pratique du langage C ENSIMAG 1A Année scolaire 2009–2010 1 Objectifs du TP Le but de ce TP en temps libre est d’apprendre la syntaxe du langage C. Pour cela, vous aller réaliser un programme très proche de celui sur lequel vous avez déjà travaillé lors de l’examen de TP d’algorithmique. On attend de vous que vous écriviez du code en C avec la même rigueur que vous écrivez de l’Ada en Algo. Notamment, vous prendrez soin de respecter les directives suivantes : – votre code doit être commenté : un bon commentaire ne paraphrase pas le code, mais éclairci une partie complexe ou un cas particulier ; – vous spécifierez rigoureusement chaque fonction que vous écrivez ; – vous prendrez soin d’indenter correctement vos programmes ; – vous choisirez des noms de variables parlant. La clarté de votre code sera prise en compte dans la notation. Comme en Algo, vous devez tester vos programmes pour vous assurer de leur correction. Votre jeu de tests devra évidemment comprendre des tests aux limites. Un programme échouant avec une erreur de segmentation sur une entrée aussi classique que la chaîne vide par exemple sera sévèrement sanctionné. Pour vous aider dans la mise au point de votre programme, en plus de gdb que vous avez appris à utiliser en séance encadrée, vous pouvez utiliser le logiciel valgrind installé sur telesun. Ce logiciel est capable de détecter un certain nombre d’erreurs classiques liées à l’utilisation de la mémoire en C (fuites mémoire, utilisation de zones non-initialisées, etc.). Il s’utilise très simplement en passant en paramètre l’exécutable à tester, suivi des paramètres de cet exécutable. Par exemple : valgrind mv fichier1 fichier2. La page « Valgrind » de l’EnsiWiki vous donnera quelques exemples, et vous pouvez consulter la page man pour plus de détail sur les options de ce logiciel. 2 Structure du programme demandé On vous fournit un fichier tp1.c dans lequel sont définis les types de données que l’on va manipuler, ainsi que des fonctions d’affichage utiles pour la mise au point de vos programmes. Vous devez compléter ce fichier en implantant les fonctions manquantes. On vous recommande de tester vos fonctions au fur et à mesure que vous les écrivez. Vous pouvez compiler votre programme avec la commande : 1 gcc -Wall -Wextra -m32 -g -std=c99 -o tp1 tp1.c 2.1 Types de données Dans ce TP, on va travailler sur deux types de données que vous connaissez bien : – des listes chaînées de caractères, dont on définit le type cellule comme suit : struct cellule_t { // la valeur de la cellule : un caractère char val; // pointe sur la cellule suivante struct cellule_t *suiv; }; – des listes chaînées de listes chaînées de caractères, dont les cellules sont définies par : struct cellule_l2l_t { // pointe sur la première cellule de la liste de caractère struct cellule_t *tete; // pointe sur la dernière cellule de la liste de caractère struct cellule_t *queue; // pointe sur la cellule suivante de la liste de listes struct cellule_l2l_t *suiv; }; Une liste chaînée simple (resp. une liste de listes) sera donc simplement un pointeur sur la première cellule de la liste. On précise bien qu’on travaille sur des listes non-circulaires. 2.2 Fonction de création d’une liste simple La première fonction à implanter pour s’entrainer à manipuler des pointeurs est la fonction struct cellule_t *chaine_vers_liste(char *chaine) qui prend en paramètre une chaîne de caractères et renvoie la liste chaînée dont les cellules contiennent les caractères présents dans la chaîne, dans le même ordre. 2.3 Fonction de découpage de la liste Vous devez ensuite écrire la fonction struct cellule_l2l_t *decouper_liste(struct cellule_t **liste) qui prend en paramètre l’adresse d’une liste chaînée simple de caractères. A la fin de l’exécution de la fonction, cette liste a été modifiée de façon à ce qu’elle ne contienne plus que les séparateurs présents dans la liste initiale. On définit un séparateur comme tout caractère n’étant pas une lettre de l’alphabet. La fonction renvoie aussi une liste chaînée de listes chaînées dont les éléments sont des listes de caractères représentant des mots présents dans la liste initiale. On définit ici un mot comme une succession de lettres de l’alphabet délimitée par un ou plusieurs séparateurs. Par exemple, si on passe à cette fonction la liste de caractères correspondant à la chaîne "le logiciel de base, c’est super", la liste initiale sera modifiée pour correspondre 2 à la chaîne " , ’ " et la liste des mots renvoyée sera composée de : "le" "logiciel" "de" "base" "c" "est" "super". Les caractères présents dans les cellules des différentes listes chaînées de caractères devront être dans le même ordre à la fin de la fonction que dans la liste initiale, comme illustré dans l’exemple. Cette fonction doit procéder par réorganisation du chaînage de la liste initiale. Vous n’avez pas le droit d’allouer de nouvelle cellule de type struct cellule_t. Vous avez par contre bien sûr le droit d’allouer des cellules de type struct cellule_l2l_t pour créer la liste de listes. Vous pouvez utiliser les sentinelles nécessaires pour simplifier vos algorithmiques, néanmoins vous prendrez soin de les allouer dans la pile de vos fonctions et pas dans le tas (i.e. pas avec malloc). 2.4 Fonctions de destruction des listes Enfin, on demande d’écrire les fonctions void detruire_liste(struct cellule_t *liste) et void detruire_liste_de_liste(struct cellule_l2l_t *liste) qui libèrent toutes les cellules des listes passées en paramètre. On recommande fortement l’utilisation de valgrind (et son option --leak-check=full) pour vérifier que ces fonctions libèrent bien toute la mémoire allouée. 3 Règles du jeu On ne vous demande pas de rendre de rapport rédigé, seulement le fichier tp1.c commenté. Vous n’avez pas non plus à rendre vos jeux de tests. Vous pouvez travailler en binôme ou en monôme : le fait d’être seul n’entraînera pas de bonus dans la notation. Enfin, on rappelle que la fraude est sanctionnée sévèrement pour tous les TP et projets, comme précisé dans la charte d’utilisation du matériel informatique 1 . Les enseignants se réservent le droit d’utiliser des logiciels de détection automatique pour localiser les ressemblances suspectes entre les fichiers rendus. Toute fraude avérée sera sanctionnée par un 0/20 au TP, sans possibilité de rattrapage. La récidive entraînera l’application des sanctions administratives prévues dans le règlement des études. Le TP doit être rendu sur Teide au plus tard le vendredi 5 mars à 18h00. 1. http ://intranet.ensimag.fr/teide/Charte_contre_la_fraude.php 3