1
les structures
En général, les types de base que propose le C ne suffisent pas pour stocker les données à utiliser dans un programme. le langage C permet de déclarer de nouveaux types.
Une structure rassemble des variables, qui peuvent être de types différents, sous un seul nom. ce qui permet de les
manipuler facilement. Elle permet de simplifier l‘écriture d'un programme en regroupant des données liées entre elles.
2
déclaration d'une structure
• struct nomStructure { type1 champ1;
...
typeN champN;
} ;
•
Voici un exemple qui déclare une structure permettant de stocker un nombre complexe :
• struct complex {
float reel; /* partie reelle */
float imag; /* partie imaginaire */
};
3
déclaration d'une structure
• struct complex a;
• ou
• struct complex { float reel;
• float imag;
}a,b;
4
accès aux champs
• L'opérateur . permet d'accéder à l'un des champs d'une structure.
• les lignes suivantes initialisent un complexe à la valeur (2 + 3i).
• struct complex a;
a.reel = 2;
a.imag = 3;
5
accès aux champs
• a.reel = 15 ;
• affecte la valeur 15 au champ reel de la structure a.
• printf ("%f", a.reel) ;
• affiche la valeur du champ reel de la structure a.
• scanf ("%f", &a.imag) ;
• Lit une valeur qui sera affectée au champ imag de la structure a.
• a.imag++ incrémente de 1 la valeur du champ imag de la structure a.
6
Exemples d’utilisation de typedef
• La déclaration :
• typedef int entier ;
• signifie que entier est synonyme de int, de sorte que les déclarations suivantes sont équivalentes : int n, p ; entier n, p ;
• De même :
• typedef int * ptr ;
• signifie que ptr est synonyme de int *. Les déclarations suivantes sont équivalentes : int * p1, * p2 ; ptr p1, p2 ;
• avec la déclaration :
• typedef int vecteur [3] ;
• les déclarations suivantes sont équivalentes :
• int v[3], w[3] ; vecteur v, w ;
7
utilisation de typedef
• Le mot-clé typedef permet d'associer un nom à un type donné. On l'utilise suivi de la déclaration d'un type puis du nom qui remplacera ce type. L'exemple
précédent peut donc se réécrire de la manière suivante :
• typedef struct { float reel;
• float imag;
• } complexe;
complexe a;
a.reel = 2;
a.imag = 3;
8
initialisation et affectation
•
Il est possible d'affecter une variable de type structure dans une autre variable du même type. Le contenu de chacun des champs de la première variable sera alors recopié dans le champ correspondant de la secondevariable. On peut initialiser une variable de type structure dès sa définition en lui affectant une liste de valeurs
séparées par des virgules et entourées par des accolades.
• complexe a = { 1, 0 }; /* le reel 1 */
complexe b;
b = a;
9
Structures comportant d’autres structures
• Supposons qu’on veut définir une structure employé comportant son nom, prénom et la date d’embauche.
• cette date est elle-même une structure comportant
• trois champs correspondants au jour, au mois et à l’année, nous pouvons alors procéder aux déclarations suivantes :
• Typedef struct { int jour ;
• int mois ;
• int annee ;} date;
•
10
Structures comportant d’autres structures
• struct personne
• { char nom[30] ;
• char prenom[20] ;
• date date_embauche ;
• } employe, courant;
• la seconde déclaration fait intervenir un modèle de structure (date) précédemment défini.
11
• La notation :
• employe.date_embauche représente la date
d’embauche correspondant à la structure employe. Il s’agit d’une structure de type date. Elle pourra
éventuellement faire l’objet d’affectation globale comme dans :
• courant.date_embauche = employe.date_embauche ;
• employe.date_embauche.annee
• représente l’année d’embauche correspondant à la structure employe.
12
exemple de structures imbriquées
• On peut imbriquer plusieurs structures. Dans l'exemple suivant nous déclarons une structure pour stocker une commande d'un client contenant :
• la référence du produit commandé (refProd),
• une sous-structure (prix) stockant : – le prix unitaire hors taxe (HT), – le taux de TVA associé (TVA),
• le nombre d'unités commandées (q),
• la remise accordée en pourcentage (remise).
13
• Cette structure se déclare de la manière suivante :
• typedef struct {
int refProd; /* reference produit */
struct {
float HT; /* prix hors taxe */
floatTVA; /* taux de TVA en pourcentage */
} prix;
int q; /* quantite commandee */
float remise; /* remise en pourcentage */
} commande;
• commande com;
14
• Pour accéder aux champs de la sous-structure, il faut utiliser deux fois l'opérateur . d'accès aux
champs. En supposant que com contienne une telle commande, voici le calcul du prix total :
• float P_TTC, P_AvantRemise, P_Total;
P_TTC = com.prix.HT * (1 + com.prix.TVA / 100);
P_AvantRemise = P_TTC * com.q;
P_Total =
P_AvantRemise - P_AvantRemise * com.remise / 100;15
les pointeurs sur structures
• L'utilisation de pointeurs sur structures est très courante en C. Voici un exemple
d'utilisation d'un pointeur sur un complexe :
• complexe a = { 3.5, -5.12 };
• complexe * p = &a;
(*p).reel = 1; p->reel = 1;
(*p).imag = -1; p->imag = -1;
16
Tableaux de structures
• Soient les déclarations :
• struct point { char nom ;
• int x ;
• int y ;
• } ;
• struct point courbe [50] ;
•
17
Tableaux de structures
• Si i est un entier, la notation : courbe[i].nom
• représente le nom du point de rang i du tableau courbe.
• De même, la notation : courbe[i].x
• désigne la valeur du champ x de l’élément de rang i du tableau courbe.
• courbe[4] représente la structure de type point correspondant au cinquième élément du tableau courbe.
• Enfin courbe est un identificateur de tableau (désigne l’adresse de début).
18
• un exemple d’initialisation (partielle) du tableau courbe, lors de sa déclaration :
• struct point courbe[50]= { {'A', 10, 25}, {'M',
12, 28}, {'P', 18,2} };
19