TP 3 de programmation avancée en C
Présentation :
Ce TP est destiné à l'implémentation d'une structure de file ;
le travail réalisé dans un exercice étant complété/modifié dans le
suivant. Il faudra conserver le code source de chaque exercice.
Important :
Dans ce TP, on n'utilisera pas d'autres bibliothèques que
stdlib
et stdio
.
Exercice 1
Important :
Dans cet exercice, on créera un unique fichier C,
sans fichier d'entête .h
.
On réalise en C une structure de file
(càd de type "First In first Out") d'entiers, en
utilisant les types prédéfinies suivants :
typedef struct {int valeur; void * suivant;} element;
typedef struct {element * premier; element * dernier;} FIFO;
1.
Dessiner (sur papier) l'organisation d'une file de trois entiers.
2.
Définir une variable nommée mafile
de type FIFO
.
3.
Créer les primitives* nécessaires pour gérer le type
FIFO
:
*une primitive est une fonction où une procédure de base
qui permettent de gérer un type de données en gérant
certains détails tels que les allocations de pointeurs.
N.B. La bonne pratique interdit à une primitive d'en
utiliser une autre.
void creer(fifo * f)
:
procédure pour créer une file vide.
int estvide(fifo * f)
:
fonction booléenne pour tester si une file est vide.
void enfiler(fifo * f, int n)
:
procédure pour ajouter un entier n à la fin d'une file.
void defiler(fifo * f, int * n)
:
procédure pour retirer le premier élément n d'une file.
void filer(fifo * f, int * n)
:
procédure pour obtenir le premier élément n d'une file,
sans le défiler.
void effacer(fifo * f)
:
procédure pour effacer toute la file et libérer la mémoire.
int taille(fifo * f)
:
fonction donnant la taille de la file.
4.
Ajouter une procédure void afficher(fifo * f)
d'affichage complet de la file (sans la modifier !).
5.
Compléter le programme pour qu'il crée une file vide
mafile
, y enfile les entiers de 1 à 20,
puis affiche la taille de la file et son contenu,
avant de l'effacer.
Exercice 2
1.
Pour chacune des primitives du type FIFO
,
déterminer quelles sont les erreurs de réalisation
qui peuvent survenir ;
modifier en conséquence, selon
les besoins, leurs signatures et leurs contenus pour retourner un/des
codes d'erreurs.
N.B. S'il existe des codes d'erreurs standard, on
pourra les utiliser (faire une recherche web si besoin).
2.
Compléter le programme pour qu'au lieu d'enfiler automatiquement
des valeurs, il enfile d'abord les paramètres en
ligne de commande, puis des valeurs successives données
par l'utilisateur, avant d'afficher la taille de la file puis son
contenu, puis finalement de l'effacer.
N.B. Que fera-t-on si un des paramètres ne peut être
interprété comme un entier ?
Comment le programme décidera-t-il la fin de la saisie de
valeurs à empiler ?
Exercice 3
1.
Placer la structure FIFO dans un fichier de code nommé
fifo.c
séparé
et pourvu de son fichier d'entête nommé fifo.h
,
puis précompiler fifo.c
en fifo.o
.
2.
Reprendre l'exercice 1 ou 2 en utilisant la compilation
séparée.
Exercice 4
On cherche à créer un type file qui soit capable d'empiler
un entier ou une chaine de caractères.
1.
Modifier en conséquence le type valeur
dans le
type element
de l'exercice 1.
2.
Reprendre l'exercice 1, 2, ou 3, mais cette fois le programme
sera capable de distinguer les entiers des chaines de caractères.
© 2011, 2016 – A. Guitton, A. Sigayret –
Université Clermont-Fd II