Vous êtes sur la page 1sur 3

TP LE384

L'objectif de ce TP est de grer une liste de scores compose d'un pseudo du joueur et du score
ralis. Cette liste sera sauvegarde dans un fichier score.txt. Ce sera l'occasion de rviser ou
vous familiariser avec les notions de Listes Chanes, de manipulation de chanes de caractres,de
Compilation spare, d'Ecriture et d'Utilisation d'un Makefile, de Gestion de fichiers, dAlgorithme
de tris et enfin dune premire prise en main de la bibliothque graphique propose.

Important : Il est impratif de tester chaque fonction crite dans la fonction main() pour sassurer
de son bon fonctionnement. Il nest pas raisonable dcrire tout lexercice et de se lancer dans
lexecution la fin. On valide chaque brique sparement et on avance pas pas.

PREPARATION

Avant de venir ce TP, il est obligatoire davoir rvis les supports de cours en langage C
sur les bases de la syntaxe, lallocation dynamique, la manipulation des chanes de
caractres, les listes chaines, ect. ainsi quavoir lu les annexes de ce document.

RAPPEL

A propos des chanes de caractres : Comme vu dans lannexe B, la fonction standard


scanf(char *format, ...) permet de saisir des chanes de caractres. Mais attention, pour cette
fonction le caractre blanc (espace) est galement un caractre sparateur. scanf() ne peut
donc saisir une chane comportant plusieurs mots spars en une seule fois. Une autre fonc-
tion de la librairie stdio.h permet se saisir une chane compose de plusieur mots : gets(char
*). Cette fonction cependant est dun emploi dangereux car aucun controle de longueur de la
chane saisie ne peut tre fait. On lui prfrera donc une troisime fonction de la mme li-
brairie, fgets(char*, int, FILE*), mais qui sera explique plus tard avec les fonctions de ma-
nipulation de fichiers. Voici un exemple dutilisation de cette fonction :

#include <stdio.h>
void main(void)
{
char chaine[21];
printf("saisir une chaine dau plus 20 caractres : ");
fgets(chaine,20,stdin);
printf("chaine saisie = %s\n",chaine);
}

Si la longueur de la chane tape par lutilisateur devait dpasser 20, seuls les 20 premiers
caractres seraient pris en compte. Aucune erreur de dpassement de tableau nest donc pos-
sible.
TRAVAIL A REALISER

Liste Chane et manipulation de chanes de caractres

Soit la structure suivante :

typedef struct liste


{
int score;
char *pseudo;
struct liste *suivant;
}LISTE;

Ecrire la fonction LISTE *creer_maillon() qui alloue de la mmoire pour un l-


ment de type LISTE et retourne son adresse. On initialisera imprativement suivant
NULL. Question : Pourquoi retourne-t-on ladresse de llment allou ? aurais-t-on pu d-
clarer tout simplement une variable dans la fonction et retourner son adresse ? pourquoi ?.
Pourquoi initialiser le champ suivant NULL?
Ecrire la fonction VOID saisir_maillon(LISTE*) qui demande un pseudo et un
score lutilisateur, ralise la saisie de ces deux informations et remplit les champs corres-
pondant dans le maillon pass en argument dentre. Attention allouer le pointeur char*
pseudo.
Ecrire la fonction void afficher_maillon(LISTE*) qui affiche le contenu dun
lment de type LISTE pass par adresse et ne retourne rien. Question : Pourquoi ne re-
tourne-t-on rien ?
Ecrire la fonction LISTE * chainage_avant(LISTE*,LISTE*) qui reoit la tte
de la liste chane et ladresse du maillon insrer et procde son insertion la premire
position. On retourne ladresse du premier maillon de la liste chane. Question : pourquoi
retourne-t-on ladresse de la liste chane ?
Ecrire la fonction LISTE * chainage_arriere(LISTE*,LISTE*) qui reoit la
tte de la liste chane et ladresse du maillon insrer et procde son insertion la der-
nire position. On retourne ladresse du premier maillon de la liste chane.
Ecrire la fonction void afficher_liste(LISTE*) qui reoit la tte de la liste cha-
ne et affiche le contenu du champ nb de tous les maillons.
Ecrire la fonction void supprimer_liste(LISTE*) qui reoit la tte de la liste cha-
ne et procde la libration mmoire de tous ses maillons.
Ecrire la fonction main() qui permet lutilisateur de crer une liste chane de dix l-
ments. Afficher le contenu de la nouvelle liste puis supprimer tous les maillons allous.

Compilation spare, Ecriture et Utilisation dun Makefile

Crer un fichier liste.h qui contiendra la dclaration de la structure LISTE ainsi que
les dclarations des fonctions xxx_liste()grant la liste que vous avez cris prcdem-
ment.
Crer un fichier liste.c qui contiendra toutes les dfinitions des fonctions
xxx_liste(). Ne pas oublier la directive #include liste.h ainsi que celles des
bibliothques dont vous avez besoin (stdio,).
Crer un fichier main.c qui contiendra la fonction main().Ne pas oublier la directive
#include liste.h ainsi que celles des bibliothques dont vous avez besoin (st-
dio,).
Crer le fichier Makefile correspondant ce programme. Compiler avec laide de
lutilitaire make.

Gestion dun fichier de score

Crer un fichier scores.txt dans le mme rpertoire o se trouve votre programme conte-
nant les lignes suivantes correspondantes aux pseudos et aux scores raliss dans des parties
prcdentes :

Toto
12000
Alfred de la Montagne
11234
pipo
7601
nom prenom
6509
Newbie
12

Ecrire la fonction LISTE *lecture_fichier_score(char*) qui reoit une chane


de caractres correspondant au chemin (relatif) et au nom du fichier scores.txt , ouvre ce
fichier, lit le fichier en crant et remplissant des maillons (contenant les informations pseudo
et score) en les insrant fur et mesure dans une liste chane (que lon renverra en sortie
de la fonction). Si le fichier nexiste pas ou est vide, il conviendra de renvoyer la valeur
NULL.
Ecrire une fonction int ecriture_fichier_score(LISTE*, char*) qui reoit
une liste chane de scores ainsi que le chemin (relatif) et le nom dun fichier (ex :
scores.txt ) et crit dans ce fichier (sil existe dj, le fichier devra tre craser) len-
semble des scores contenus dans la liste chane. Si lcriture sest bien passe, la fonction
renverra le nombre de scores enregistrs dans le fichier et -1 sinon.
Rcrire la fonction main() de sorte crer la liste chane en fonction du contenu du fichier
scores.txt , puis demander lutilisateur de saisir et ajouter un nouvel lment, dafficher
la nouvelle liste de scores et enfin denregistrer le nouvel ensemble de scores dans le fichier
scores.txt avant de librer la mmoire.

Faire en sorte que la liste des scores soit trie dans lordre dcroissant des scores. Le choix
de la mthode de tri est laiss au choix du programmateur (Cependant, en supposant la liste
dj trie prcdemment, il est plus judicieux dutiliser un tri par insertion). Pour chaque
nouveau score insr, on supprimera la plus mauvais des scores (de sorte conserver par
exemple que le Top 5 des scores). Cela requerra de crer des fonctions de recherche selon un
critre (infrieur au score du nouveau maillon), dinsertion dun nouveau maillon dans la
liste chane, de suppression dun maillon,

Prise en main de la bibliothque graphique

En vous aidant des premiers exemples de la bibliothque graphique fournie, modifier laffi-
chage des scores de sorte que la liste soit afficher sur une fentre graphique X11.

Vous aimerez peut-être aussi