Module: Structures de données
Filière: SMA/SMI-S4
Structures
Pr. Issam QAFFOU
Laboratoire Ingénierie des Systèmes
d’Information
Département d’Informatique
FSSM-UCA
Introduction
• L’utilisation des types prédéfinis en C s’avère parfois
limitée et quelques applications exigent au
programmeur de définir d’autres types.
• Par exemple, pour manipuler une entité "Etudiant"
connue par son nom qui est une chaine de caractère et
son âge qui est un entier.
• Pour pouvoir travailler avec des variables structurées
on doit les identifier par un type.
• Les tableaux sont un type de telles variables mais ayant
le même type.
• Pour des types différents on doit utiliser ce qu’on
appelle une "Structure".
• Une structure est un ensemble de champs combinés.
SMI/SMA-S4 Structures de données 2
Déclaration
• Le langage C permet de définir des modèles structurés.
• La déclaration d'une structure s'effectue en précisant le
nom de la structure, ainsi que le nom et le type de ses
champs :
• Syntaxe en C : struct nom_structure
{ type 1 nom_champ1;
type 2 nom_champ2;
…
type N nom_champN;
};
• Remarque: Le nom d’une structure n’est pas un nom de
variable, c’est le nom du type ou modèle de la structure.
SMI/SMA-S4 Structures de données 3
Déclaration
• Exemple: struct Etudiant
{ int Age;
float Moyenne;
char Nom[20];
};
• Une telle déclaration ne fait aucune réservation (on définit un
type).
• Pour réserver de l’espace, on le fait de deux manières:
– Lors de la déclaration: struct nom_structure{
Type_1 Champ_1;
…
Type_n Chanp_n;
} variables;
– Après déclaration: struct nom_structure variables;
SMI/SMA-S4 Structures de données 4
Utilisation
• On peut initialiser les champs d’une structure tous à la
fois quand on déclare une variable ayant le type cette
structure (comme on fait pour un tableau: entre
accolades).
• On peut les initialiser un par un en utilisant:
nom_var.nom_champ
• Cette dernière syntaxe est utilisée pour accéder à
chacun des champs de la structure.
SMI/SMA-S4 Structures de données 5
Utilisation
• Dans le cas où la variable structure est un
pointeur, par exemple: struct Etudiant *p, on
accède aux champs de la structure via ce
pointeur en utilisant -> (une flèche):
• On peut aussi garder le point au lieu de la
flèche en écrivant:
• Attention: avant d’utiliser un pointeur il faut
l’initialiser. Pour le cas d’une structure, on
l’initialise avec la fonction malloc(sizeof(struct
<nom_structure>));
SMI/SMA-S4 Structures de données 6
Exemple
SMI/SMA-S4 Structures de données 7
Composition de structures
• On peut déclarer une variable structure ou en
particulier un tableau dans une autre structure.
• On peut, par exemple, déclarer une structure date
contenant des champs: jour, mois, annee et inclure une
variable dt de type date dans la structure Etudiant.
• On peut écrire E.d1.m pour accéder au champ
correspondant au mois de la structure date.
SMI/SMA-S4 Structures de données 8
Manipulation
• On peut créer un tableau de structure. Par exemple, un
tableau d’Etudiant.
• On procède au remplissage du tableau d’une manière
ordinaire, en remplissant chaque champ.
• Pour accéder à un champ d’un élément de ce tableau
on utilise nom_tab[indice].nom_champ. Par exemple:
sma_grp1[2].age
• L’arithmétique des pointeurs déjà vue au chapitre des
pointeurs reste valable pour des pointeurs vers des
structures.
SMI/SMA-S4 Structures de données 9
Manipulation
• Exemple
SMI/SMA-S4 Structures de données 10
typedef
• typedef permet de définir un type de donnée
structuré.
• L’utilisation devient plus aisée des structures définies
avec typedef.
• En effet, si on déclare :
– struct personne { ... }; les déclarations de variables se
feront par : struct personne p1,p2;
• alors que si on déclare :
– typedef struct { ... } PERSONNE; les déclarations de
variables se feront par : PERSONNE p1,p2;
• on voit que la seconde méthode permet d'éviter
d'avoir à répéter struct.
SMI/SMA-S4 Structures de données 11
typedef
• De la même manière, en ce qui concerne les pointeurs, il
est plus difficile d'écrire et de comprendre :
struct personne {
... };
struct personne *p1,*p2;
/* p1 et p2 pointeurs vers des struct */
que la version suivante qui donne un nom parlant au type
pointeur vers struct :
typedef struct {
... } PERSONNE;
typedef PERSONNE *P_PERSONNE; /* P_PERSONNE type
pointeur vers struct */
P_PERSONNE p1,p2; /* p1 et p2 pointeurs vers des struct */
SMI/SMA-S4 Structures de données 12
Structures et fonctions
• Une structure peut être utilisée comme argument d’une
fonction et transmise par valeur ou par adresse via un
pointeur.
Par valeur
SMI/SMA-S4 Structures de données 13
Structures et fonctions
Par adresse
SMI/SMA-S4 Structures de données 14
Structures et fonctions
• Une fonction peut retourner un résultat d’un
type structuré
SMI/SMA-S4 Structures de données 15
Structures et fonction
• Exercice
– Définir une structure Point qui permet de représenter
un point dans un plan par ses coordonnées x et y de
type float.
– Définir une fonction Initialiser qui saisit les champs
d’une variable Point passée en paramètre.
– Définir une fonction Afficher qui affiche le contenu
des champs d’une variable Point passée en paramètre.
– Définir une fonction Déplacer qui permet de déplacer
un point dans plan (les champs x et y doivent être
translatés par dx et dy respectivement).
– Dans la fonction main() appeler ces fonctions et tester.
SMI/SMA-S4 Structures de données 16