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