Vous êtes sur la page 1sur 15

Faculté des Sciences de Gabes 18/02/2018

Département d’informatique
Cours ASD II

CHAPITRE II – LES
ENREGISTREMENTS

Par :
Khaled Hassine
Khaled.hassine@fsg.rnu.tn

18/02/2018 Khaled Hassine 1 18/02/2018 Khaled Hassine 2

PLAN PLAN
Introduction Introduction

Déclaration des enregistrements Déclaration des enregistrements

Manipulation des enregistrements Manipulation des enregistrements

Cas des tableaux et des pointeurs Cas des tableaux et des pointeurs

Enregistrement et fonction Enregistrement et fonction

18/02/2018 Khaled Hassine 3 18/02/2018 Khaled Hassine 4

LFSI 1 – LARI 1 1
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Motivations Motivations …
 Le tableau :
 est la structure de données la plus connue
 Il est généralement utile de pouvoir rassembler des éléments de
 est une structure homogène : tous les éléments sont de même type et codées de la type différents.
même façon sur le même nombre de bits
 occupe de la place successive dans la mémoire  On parle alors d’enregistrement ou de structure.
 Impossible de décrire des informations de type différents
 Dans certaines applications, ces types de données ne répondent pas à nos  L'avantage d'une structure est de regrouper des informations
besoins car nous voulons regrouper des données de différents type différents
sémantiquement liées pour éviter de multiplier les variables
 Exemple fiche d’un étudiant :
 Nom : chaine de caractères et bien faire apparaitre la logique du traitement : il est plus
 Age : entier
 Sexe : typé énumératif (masculin ou féminin) simple de comprendre un programme qui manipule des dates
 Matricule : Entier qu'un programme qui manipule trois variables (jours, mois,
 CIN : …
année).

18/02/2018 Khaled Hassine 5 18/02/2018 Khaled Hassine 6

Définition d’un enregistrement Définition …


 Une structure (ou enregistrement) est une collection de  Une structure est un moyen de regrouper des
plusieurs variables (champs, rubriques) groupées objets (des variables), de même ou de différents
ensemble. types, au sein d’une entité repérée par un seul
 Une structure permet de rassembler sous un même nom nom de variable.
des données de types différents (structure hétérogène).
 Les variables contenues dans la structure sont
 Les champs d’une structure sont appelées membres et appelées champs de la structure.
peuvent être de n’importe quel type (entières, flottantes,
tableaux, caractères, pointeurs, autres structures, …)  Pour une variable de type structure, le compilateur
 Exemple : fiche d'indentification d'une personne réserve une zone mémoire de taille la somme de
 nom, prénom, âge, liste des diplômes, etc. tous les champs de cette structure.

18/02/2018 Khaled Hassine 7 18/02/2018 Khaled Hassine 8

LFSI 1 – LARI 1 2
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

PLAN Déclaration d’un enregistrement


Introduction  Deux approches :
 Définir une variable de type enregistrement
Déclaration des enregistrements
 Définir un type générique de l’enregistrement (un
modèle) puis définir la variable
Manipulation des enregistrements
 La deuxième est l’approche la plus structurée;
Cas des tableaux et des pointeurs
c’est l’approche recommandée

Enregistrement et fonction

18/02/2018 Khaled Hassine 9 18/02/2018 Khaled Hassine 10

Déclaration d’un enregistrement comme Déclaration d’un enregistrement à travers


variable un type générique
 Déclaration de la variable  Déclaration du Type enregistrement :
Id_Variable : Enregistrement (Structure)  Type_Enr = Enregistrement (Structure)
type1 nom_de_champ_1; type1 nom_de_champ_1;
type2 nom_de_champ_2 ; type2 nom_de_champ_2;
... ...
typen nom_de_champ_n; typen nom_de_champ_n;
Fin Enregistrement Fin Enregistrement;
 Structure hétérogène : les éléments peuvent être d’un type  Ceci définit le modèle de la structure mais ne réserve pas de variables
correspondant à cette structure.
différent
 Occupe des zones successives en mémoire  Déclaration de la variable :
 Type_Enr Id_Variable

18/02/2018 Khaled Hassine 11 18/02/2018 Khaled Hassine 12

LFSI 1 – LARI 1 3
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Initialisation des enregistrements Exemple


 Déclaration du type générique :
 La valeur initiale de chaque champ ne peut être t_date = Enregistrement
entier : an
introduite à l’intérieur de la définition du type entier court : mois
entier court : jour :
générique de donnée et non une variable. Fin Enregistrement;
 Déclaration d’une variable :
 C’est seulement lors de la déclaration d’une aujourdhui : t_date;
 Affectation
variable que l’on peut introduire des valeurs Avec aujourdhui
initiales pour les différents champs. faire
jour  17;
mois 10;
an  2006;
Fin faire

18/02/2018 Khaled Hassine 13 18/02/2018 Khaled Hassine 14

Enregistrement en mémoire Déclaration d’une structure en C


 Syntaxe de la déclaration de la gabarie :
... struct <Identificateur de la structure>
... { <Type 1> < Identificateur champ 1> ;
aujourdhui.jour; #4005 11 <Type 2> < Identificateur champ 2> ;
aujourdhui.mois; #4004 0A
Occupe de la place
….
aujourdhui.an; #4003 D6
aujourdhui.an; #4002 07
successive <Type n> < Identificateur champ n> ;
dans la mémoire
aujourdhui.an;#4001 00 };
aujourdhui.an #4000 00
 Syntaxe de la déclaration de variable de type structure :
...
struct <id. de la structure> <identificateur de la variable> ;
#0

18/02/2018 Khaled Hassine 15 18/02/2018 Khaled Hassine 16

LFSI 1 – LARI 1 4
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Exemple d’une structure en C Portée du nom des champs

 Déclaration d’une structure complexe et d’une variable z de type  Deux structures différentes peuvent contenir des
complexe : membres de même nom sans qu’il y ait de conflit.
struct complexe  La portée du nom d'un membre est limité à la structure
{ float Partie_reelle ; dans laquelle il est défini. On peut avoir des membres
float Partie_imaginaire ;
homonymes dans des structures distinctes.
};
 Pas de confusion dans les déclarations suivantes :
struct s1 struct s2
struct complexe z ; { float x; { char x;
int y ; float y;
}; };
18/02/2018 Khaled Hassine 17 18/02/2018 Khaled Hassine 18

Exemple 2 : Type personnalisé des données


struct Date
Identificateur de la  La déclaration typedef permet de définir ce que l'on nomme
structure (type) en langage C des types synonymes.
{
int jour;  S'applique à tous les types et pas seulement aux structures.
int mois;  Syntaxe :
int an; typedef <Ancien id de type> <nouveau id. de type>
Déclaration des
} hier, demain;
variables avant ‘;’ .  Exemple :
struct Date Début_vacances; typedef int entier;
struct Date semaine[7]; signifie que entier est ''synonyme'' de int, de sorte que les
déclarations suivantes sont équivalentes :
struct Date nouvel_an = { 1, 1, 2018 }; Initialisation . int n, p ;
entier n, p ;

18/02/2018 Khaled Hassine 19 18/02/2018 Khaled Hassine 20

LFSI 1 – LARI 1 5
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Exemples : typedef typedef et les structures


 Le type vecteur est synonyme de tableau de 3  En faisant usage de typedef, les déclarations des structures
entiers : peuvent être réalisées comme suit:
struct enreg
typedef int vecteur[3] ; { int numero ; int qte ; double prix ;
 v1,v2 deux tableaux de 3 entiers chacun :
};
vecteur v1, v2 ; typedef struct enreg s_enreg ;
 Le nouveau type fpointeur est synonyme de s_enreg art1, art2 ;
pointeur sur un réel  ou encore, plus simplement:
typedef float *fpointeur ; typedef struct
{ int numero ; int qte ; float prix ;
 fa, fb sont deux pointeurs sur réel } s_enreg ;
fpointeur fa, fb ; s_enreg art1, art2 ;

18/02/2018 Khaled Hassine 21 18/02/2018 Khaled Hassine 22

Typedef : Exemple Structures imbriquées


 Définition du type date :  Le type de chaque champs peut être lui-même
struct date {
int jour ;
une structure.
int mois ; typedef struct typedef struct
int année ; { int jours ; { int code ;
int mois ; char nom[20] ;
}; int annee ; char prenom [20] ;
typedef struct date DATE ; } date ; date dtn ;
} etudiant ;
 La déclaration d’une variable de type DATE
DATE d1 ;
est équivalent à struct date d1 ;
18/02/2018 Khaled Hassine 23 18/02/2018 Khaled Hassine 24

LFSI 1 – LARI 1 6
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Structures imbriquées … Structures dans des structures


struct Membre
struct Livre struct Date struct Date struct Membre
{
{ { char nom[80]; { {
int jour; char nom[80];
char titre[80]; int jour; char adresse[200];
int mois; char adresse[200];
char auteur[80]; int mois; int numero;
int an; int numero;
float amende[10]; }; float amende[10];
float prix; int an; struct Date creation; struct Date emprunt;
}; }; }; struct Date creation;
struct Membre m={
};
“Foulen",
”rue de la …..",
struct Pret 42,
{ struct Livre b; { 0.0 },
struct Date d; { 0, 0, 0 },
struct Membre *p; { 5, 2, 2001 }
}; };

18/02/2018 Khaled Hassine 25 18/02/2018 Khaled Hassine 26

PLAN Utilisation d'une structure


Introduction  Deux manières d'utilisation d’une structure :
 individuellement sur chacun de ses champs,
 de manière "globale'' sur l'ensemble de la structure.
Déclaration des enregistrements
 Exemple à adopter :
 Type enreg = Enregistrement
Manipulation des enregistrements
Entier : numero;
Entier : qte;
Cas des tableaux et des pointeurs Réel : prix;
Fin Enregistrement
Enregistrement et fonction enreg art1, art2, *art3 ;

18/02/2018 Khaled Hassine 27 18/02/2018 Khaled Hassine 28

LFSI 1 – LARI 1 7
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Utilisation individuelle des champs d'une


structure Utilisation globale d'une structure
 Chaque champ d'une structure peut être manipulé comme  L'opérateur d'affectation et l'opérateur d'adresse & sont
n'importe quelle variable du type correspondant. les seuls opérateurs s'appliquant à une structure (de
 La désignation d'un champ se note en faisant suivre le nom manière globale) à une structure définie à partir du
de la variable structure de l'opérateur ''point'' (.) suivi du même modèle.
nom du champ tel qu'il a été défini dans le modèle (le nom  Par exemple, on peut écrire :
du modèle lui-même n'intervenant d'ailleurs pas). artl  art2;
art3  &art1;
 La priorité de l'opérateur ''.'' est très élevée, de sorte
qu'aucune des expressions utilisant les champs d’une  L’affectation artl  art2 remplace avantageusement :
art1.numero  art2.numero ;
structure ne nécessite des parenthèses.
art1.qte  art2.qte ;
art1.prix  art2.prix ;

18/02/2018 Khaled Hassine 29 18/02/2018 Khaled Hassine 30

Remarques Initialisation des structures en C


 Une affectation globale n'est possible que si les structures ont été  Les règles d'initialisation des structures sont les mêmes que tous les
définies avec le même nom de modèle; en particulier, elle est types de variables :
impossible avec des variables ayant une structure analogue mais  En l'absence d'initialisation explicite, les structures de classe ''statique" sont, par
définies sous deux noms différents. défaut, initialisées à zéro; celles possédant la classe "automatique'' ne sont pas
 Aucune comparaison n’est possible sur les structures. initialisées par défaut (elles contiendront donc des valeurs aléatoires).
 Il est possible d'initialiser explicitement une structure lors de sa déclaration. On ne
 Pour saisir une variable structure, on doit saisir les champs membres
peut toutefois employer que des constantes ou des expressions constantes et cela
de cette structure. aussi bien pour les structures statiques que pour les structures automatiques (alors que,
 Une structure d’enregistrement peut être traitée globalement à pour les variables scalaires automatiques, il était possible d'employer une expression
seulement deux occasions : quelconque)
 l’opérateur & pour obtenir l’adresse d’une variable de type enregistrement,  Exemple d'initialisation de la structure artl:
 l’opérateur d’affectation pour copier le contenu d’une variable de type struct enreg art1 = { 100, 285, 2000 };
enregistrement dans une autre.
 Il est possible d'omettre certaines valeurs.

18/02/2018 Khaled Hassine 31 18/02/2018 Khaled Hassine 32

LFSI 1 – LARI 1 8
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

PLAN Contenu des structures


Introduction  Chacun des champs d'une structure peut être un
type absolument quelconque :
Déclaration des enregistrements
 pointeur,
 tableau,
Manipulation des enregistrements
 structure,
Cas des tableaux et des pointeurs  ...
 De même, un tableau peut être constitué
Enregistrement et fonction d'éléments qui sont eux- mêmes des structures.
18/02/2018 Khaled Hassine 33 18/02/2018 Khaled Hassine 34

Structures comportant des tableaux Structures comportant des tableaux


 employe.heures[4] : désigne le cinquième élément du tableau heures de la
Soit le modèle de la structure suivante : structure employe. Il s'agit d'un élément de type réel. Notez que, malgré les
Personne = Enregistrement priorités identiques des opérateurs . et [], leur utilisation de gauche à droite
évite l'emploi de parenthèses.
Caractère nom[30] ;  employe.nom[0] : représente le premier caractère du champ nom de la
structure employe.
Caractère prenom [20] ;  &courant.heures[4] : représente l'adresse du cinquième élément du tableau
heures de la structure courant. Notez que, la priorité de l'opérateur & étant
Réel heures [31] ; inférieure à celle des deux autres, les parenthèses ne sont pas nécessaires.
Fin Enregistrement  courant.nom : représente le champ nom de la structure courant, c'est-à-dire
plus précisément l'adresse du tableau nom.
Persone employe, courant ;

18/02/2018 Khaled Hassine 35 18/02/2018 Khaled Hassine 36

LFSI 1 – LARI 1 9
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Remarque Exemple de tableaux d’enregistrements


type chanson =
 L'affectation globale n'est pas possible entre Enregistrement
caracrère titre[100]
deux tableaux. Elle l'est, par contre, entre deux Réel Prix
structures. Fin;
t_date date

var chanson collection[10];


 Ainsi il est possible, en créant artificiellement
 Trouver l’artiste d’une chanson donnée ‘titre’
une structure contenant un seul champ qui est un i ← 0;
tant que (i<10) et (collection[i].titre ≠ “titre”)
tableau, de réaliser une affectation globale entre faire
i ← i + 1;
tableaux. fin tant que
Si i = 10 alors Ecrire “enregistrement inexistant”
sinon ….

18/02/2018 Khaled Hassine 37 18/02/2018 Khaled Hassine 38

Tableau de structures en C : exemple de


Tableaux des structures en C nombre complexe
 Voyez ces déclarations :
struct point { char nom ;  On peut déclarer un tableau de structure de la
int x ;
int y ; };
même manière que de déclarer un tableau de
struct point courbe[50]; type simple.
 La structure point représente un point d'un plan défini par son nom (caractère) et ses deux
coordonnées.  Exemple : struct complexe N[4] ;
 courbe pourrait servir à représenter un ensemble de 50 points du type point.
 point est un nom de modèle de structure, tandis que courbe représente effectivement un
Partie réelle
''objet "tableau de 50 éléments du type point". Partie Partie réelle Partie Partie réelle Partie Partie réelle Partie

 courbe[10].nom représente le nom du point de rang 10 du tableau courbe. Il s'agit donc imaginaire imaginaire imaginaire imaginaire
N[0]
d'une valeur de type char. N[1] N[2] N[3]

 La notation : courbe.nom[i] n’a pas de sens.


 courbe[i].x représente la valeur du champ x de l’élément de rang i de courbe.

18/02/2018 Khaled Hassine 39 18/02/2018 Khaled Hassine 40

LFSI 1 – LARI 1 10
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Exemple complet de tableau Exemple complet de tableau


d’enregistrement en C d’enregistrement en C
#include <stdio.h> for (Nombre_de_fiches = 0; Nombre_de_fiches < 50; Nombre_de_fiches++)
struct Fiche_etudiant { printf("\nVoulez-vous entrer les données de la %d fiche (O ou N) ? ",
{ char nom[25]; Nombre_de_fiches);
char prenom[25]; scanf(" %c", &test);
if(test == 'N' || test == 'n') break;
int age;
scanf("%s%s%i%c%i",
char sexe; Ensemble_des_fiches[Nombre_de_fiches].nom,
int matricule; }; Ensemble_des_fiches[Nombre_de_fiches].prenom,
struct Fiche_etudiant Ensemble_des_fiches[50]; &Ensemble_des_fiches[Nombre_de_fiches].age,
void main() &Ensemble_des_fiches[Nombre_de_fiches].sexe,
{ int Nombre_de_fiches = 0; &Ensemble_des_fiches[Nombre_de_fiches].matricule);
char test; }

18/02/2018 Khaled Hassine 41 18/02/2018 Khaled Hassine 42

Exemple complet de tableau


d’enregistrement en C Structures et Pointeurs
for (int i = 0; i < Nombre_de_fiches; i++)  On peut déclarer des pointeurs sur des structures. Elle est
{ notamment nécessaire lorsque la structure est un
printf("\n%s %s %d %c %d", paramètre modifiable par une fonction.
Ensemble_des_fiches[i].nom,  Exemple :
Ensemble_des_fiches[i].prenom, struct enreg *pe1 ; /*pointeur sur une structure enreg*/
Ensemble_des_fiches[i].age, Si pe1 = &art1 alors (*pe1) et art1 sont équivalents.
Ensemble_des_fiches[i].sexe,  Pour accéder à un membre (membre) d’une
Ensemble_des_fiches[i].matricule); structure (pointée par pt:
}  En utilisant l’opérateur . : (*pt).membre
}  Accès en utilisant l’opérateur spécial ->i : pt->membre

18/02/2018 Khaled Hassine 43 18/02/2018 Khaled Hassine 44

LFSI 1 – LARI 1 11
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Exemple de pointeur sur Exemple de pointeur sur enregistrement en


enregistrement en C C
typedef struct {  pc = &c1;
int no_compte ;
 *pc.no_compte = ... Incorrect car . est plus
char etat ; prioritaire que *
char nom[80];  (*pc).no_compte = ...
float solde;
struct date dernier_versement;  pc->no_compte = ...
} cpt ;
cpt c1 , * pc;
/*c1 est de type cpt, pc est un pointeur sur une variable de
type cpt*/

18/02/2018 Khaled Hassine 45 18/02/2018 Khaled Hassine 46

Passer des structures comme


PLAN paramètres de fonction
Introduction  Une structure peut être passée, comme toute
autre variable, par valeur ou par adresse :
Déclaration des enregistrements
 Passer par valeur : simple copie des champs en
entrée.
Manipulation des enregistrements
 Passer par adresse : toute modification est reproduite
sur les champs.
Cas des tableaux et des pointeurs

Enregistrement et fonction

18/02/2018 Khaled Hassine 47 18/02/2018 Khaled Hassine 48

LFSI 1 – LARI 1 12
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Transmission d'une structure par adresse en Exemple de transmission d'une structure par
argument d'une fonction valeur en argument d'une fonction

 L'opérateur "." ne convient plus au sein du sous-programme car il suppose typedef struct
comme premier opérande un nom de structure et non une adresse. { int a;
double b;
 Deux solutions possibles :
} enreg;
 adopter une notation telle que (*argument).champ ou pour désigner les champs
void fct (enreg s)
de la structure dont l’adresse est passée en paramètre.
{ s.a = 0; s.b=1;
 faire appel à l’opérateur -> , lequel permet d'accéder aux différents champs d'une printf ("\nDans la fonction : %d %6.3f", s.a, s.b);
structure à partir de son adresse de début.
}
 On préférera toujours le passage par référence, qui évite la duplication de void main (void)
la structure sur la pile (opération qui peut être couteuse, voire impossible si { enreg x ;x.a=1; x.b=12.5;
la structure occupe une taille mémoire importante). printf ("\nAvant l'appel\t : %d %6.3f",x.a,x.b);
fct (x);
printf ("\nApres l'appel\t : %d %6.3f", x.a, x.b);
}

18/02/2018 Khaled Hassine 49 18/02/2018 Khaled Hassine 50

Exemple de transmission d'une structure


par référence en argument d'une fonction Structures et fonctions : exemple 1
typedef struct float ajoute_au_compte(float solde1, float somme1) {
{ int a; solde1 = solde1+somme1;
double b; return (solde1);
} enreg; }
void fct (enreg *s) void main () {
{ s->a = 0; s->b=1; ......
printf ("\nDans la fonction : %d %6.3f", s->a, s->b); cpt c1;
} c1.solde = 0.;
int main (void) ajoute_au_compte(c1.solde,1000.0);
{ enreg x; x.a = 1; x.b = 12.5; printf("%f\n",c1.solde); /*-> 0.000000*/
printf ("\nAvant l'appel\t : %d %6.3f",x.a,x.b); c1.solde=ajoute_au_compte(c1.solde,1000.0);
fct (&x); printf("%f\n",c1.solde); /* -> 1000.000000*/
printf ("\nApres l'appel\t : %d %6.3f", x.a, x.b);
}

18/02/2018 Khaled Hassine 51 18/02/2018 Khaled Hassine 52

LFSI 1 – LARI 1 13
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

Structures et fonctions : exemple 2 Structures et fonctions : exemple 3


 Un argument de fonction peut-  ou pointeur sur structure
void ajoute_au_compte (float * solde1, float somme1) { être de type structure void ajoute_au_compte (cpt * c,
*solde1 = *solde1+somme1; float ajoute_au_compte(cpt c, float float somme1)
} somme1) {c->solde = c->solde + somme1;
{ return(c.solde+somme1); }
void main () { } void main ()
...... void main () { cpt c1;
cpt c1; { cpt c1; c1.solde = 0;
c1.solde = 0.; c1.solde = 0; ajoute_au_compte(&c1 ,1000.0);
ajoute_au_compte(&(c1.solde),1000.0); /* ou &c1.solde */ ajoute_au_compte(c1,1000.0); printf("%f\n",c1.solde); /*1000*/
printf("%f\n",c1.solde); /*-> 1000.000000*/ printf("%f\n",c1.solde); /* 0*/

18/02/2018 Khaled Hassine 53 18/02/2018 Khaled Hassine 54

Structures et fonctions : exemple 3 Application : nombres complexes


 La valeur de retour d'une fonction peut être une structure
cpt ajoute_au_compte(cpt c, float somme1)
 Ecrire les sous-programmes permettant de :
{ cpt c2;  saisir un nombre complexe z1.
c2=c;
c2.solde=c.solde+somme1;  afficher les parties réelle et imaginaire du nombre
return(c2); z1.
}
void main ()  afficher les parties réelle et imaginaire du nombre z2
{ ...... image de z1 par symétrie centrale.
cpt c1;
c1.solde = 0.;  multiplier 2 nombres complexes z1, z2 passés en
c1=ajoute_au_compte(c1,1000.0); paramètres.
printf("%f\n",c1.solde); /*1000.0*/

18/02/2018 Khaled Hassine 55 18/02/2018 Khaled Hassine 56

LFSI 1 – LARI 1 14
Faculté des Sciences de Gabes 18/02/2018
Département d’informatique
Cours ASD II

18/02/2018 Khaled Hassine 57

LFSI 1 – LARI 1 15