Chapitre 7 - Enregistrements

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 36

Chapitre 7 : Les enregistrements

1
Plan

 Partie 1: Les enregistrements en algorithmique

 Partie 2 : Traduction en langage C

2
Plan

 Partie 1: Les enregistrements en algorithmique

 Partie 2 : Traduction en langage C

3
Pourquoi une structure de données?
 Problème : Programme plus complexe
 Solution : Créer différents types de variables structurées : « types de
variables personnalisés » pour organiser la gestion de données.
 Structure de données : les variables déclarées se distinguent par leur type
et par leur classe de stockage.
► Exemple en C :
struct personne
{
char nom[100];
char prenom[100];
char adresse[1000];
int age;
};

4
Définition

 Contrairement aux tableaux qui sont des structures de données dont tous
les éléments sont de même type, les enregistrements sont des structures de
données dont les éléments peuvent être de types différents.

 Les éléments qui composent un enregistrement sont appelés champs.

 Les enregistrements sont appelés structures, en analogie avec le langage C.

5
Syntaxe

► Syntaxe 1 (Notation inspirée du Pascal) ► Syntaxe 2 (Notation inspirée du C)


Type Type
nom_type = enregistrement Structure nom_type
Nom_champ1 : type_champ1 Nom_champ1 : type_champ1
… …
Nom_champN : type_champN Nom_champN : type_champN
FinEnreg FinStruct

Exemple Exemple
Type Type
Tpersonne=enregistrement Structure Tpersonne
nom: chaine[20] nom: chaine[20]
prenom: chaine[20] prenom: chaine[20]
age: entier age: entier
finenreg finStruct

6
Déclaration
Type
Structure tpersonne
nom: chaine[20]
âge: entier
finStruct

Syntaxe
Var
Nom_var : nom_type

Exemple
Var
Pers1, pers2, pers3 : tpersone

7
Accès aux champs d’un enregistrement

 Pour représenter la valeur mémorisée dans le champ d’un enregistrement :

Nom_enregistrement. Nom_champ

 Exemple

Pour accéder à l’age de la variable pers2, on utilise l’expression :

pers2.age

8
Imbrication d’enregistrements

Un type structure peut être utilise comme type pour des champs d'un autre
type de structure.
Type
Structure date
jour : entier
mois : chaine[20]
année : entier
finStruct
Type
Structure personne
nom : chaine[20]
ddn : date
finStruct

Pour accéder à l’année de naissance d’une personne, il faut appliquer deux


opérateur ‘.’ : pers1.ddn.annee
9
Exemple
Type
Un produit est livré par un seul fournisseur. Structure adresse
num: entier
Un fournisseur est caractérisé par son code, sa rue: chaine[20]
cp: chaine[20]
raison sociale, son adresse et son numéro de ville: chaine[20]
finStruct
téléphone. Type
Structure fournisseur
Exemple : Pour afficher le numéro de téléphone du code_frs: chaine[20]
raison_sociale: chaine[20]
fournisseur du produit p.frs.tel: ad_frs: adresse
tel: chaine[20]
finStruct
Type
Var Structure produit
p : produit code: chaine[20]
lib: chaine[20]
Ecrire("Téléphone du fournisseur de", p.lib, " : ", qtxtva; reel
frs: fournisseur
p.fsr.tel) finStruct
10
Tableaux d’enregistrements
Exemple
Const
NP = 20 //nombre de personnes du groupe
Type
Structure personnes
Nom : chaine[20]
Age : entier
FinStruct

Var
Groupe : tableau [1 .. NP] de personnes

11
Plan

 Partie 1: Les enregistrements en algorithmique

 Partie 2 : Traduction en langage C

12
Définition d’une structure
 Une structure est un regroupement d’objets qui ne sont pas nécessairement de
même type.
 Syntaxe
struct étiquette
{
/* membres ou champs de la structure. */
};
Le mot struct permet de définir un nouveau type.
 Exemple
struct temps
{
unsigned heures; //un membre de la structure temps
unsigned minutes;
double secondes;
};
13
Définition d’une variable de type structure
 Syntaxe
struct étiquette identificateur;

 Exemple 1 ► Exemple 2
#include <stdio.h> struct temps
struct temps {
unsigned heures;
{
unsigned minutes;
unsigned heures; double secondes;
unsigned minutes; }t1,t2;
double secondes;
};
void main()
{ struct temps t; }
14
Définition d’une variable de type structure

 Exemple 3 ► Exemple 4
struct temps struct personne
{ {
unsigned heures; char nom[100];
unsigned minutes; char prenom[100];
double secondes; char adresse[1000];
}t1,t2; int age;
struct temps t3; };
struct personne p1,p2;

15
Représentation en mémoire
 La norme impose aux objets de type structure les deux contraintes
suivantes :
o Les champs doivent être alloués selon leur ordre d’apparition dans la
structure ;
o L’adresse d’une structure correspond à l’adresse de son premier champ.

struct temps
{
unsigned heures; @m @m+1 @m+2
unsigned minutes; t heures minutes secondes
double secondes;
};
struct temps t;

16
Exemple
Un livre est caractérisé par les données suivantes :
<un titre , un code, un auteur, un éditeur, un prix>
On désire définir un type ouvrage tel que chaque élément de ce type soit caractérisé par ces
données.

struct ouvrage
{
char titre [20] ;
int code ;
char auteur [30] ;
char editeur [20] ;
float prix ;
}

17
Initialisation
 L’initialisation d’une variable de type structure est effectuée à l’aide d’une liste
fournissant une valeur pour chaque membre de la structure.
 Exemple 1 : Initialisation
struct temps t = { 1, 45, 30.560 };
 Exemple 2 : Définition et initialisation
struct temps
{
unsigned heures;
unsigned minutes;
double secondes;
} t1 = { 1, 45, 30.560 };

18
Accès à un membre de la structure
 L’accès à un membre d’une structure est effectué via la variable de type structure et
de l’opérateur « . » suivi du nom du membre concerné.
 Syntaxe
variable.membre

 La même syntaxe est utilisée pour récupérer la valeur d’un membre et pour modifier
son contenu.
 Exemple
struct temps t = { 1, 45, 30.560 };
ou
t.heures = 1;
t.minutes = 45;
t.secondes = 30.560;
19
Accès à un membre de la structure : Exemple

Ecrire une fonction qui permet d’afficher un livre.

void afficheLivre (struct ouvrage l)


{
puts (l.titre) ;
printf("%d",l.code) ;
puts (l.auteur) ;
puts (l.editeur) ;
printf ("%f",l.prix) ;
}

20
Portée / Visibilité d’une structure
 La définition d’une structure de données peut être circonscrite à un bloc afin
de limiter sa portée (visibilité).
 Exemple
void main()
{
struct temps
{
unsigned heures;
unsigned minutes;
double secondes;
};
struct temps t1 = { 1, 45, 30.560 };
struct temps t2;
}
21
Exercice
 Ecrire deux mesures de temps sous la forme heure(s):minute(s):seconde(s) puis
afficher la différence en seconde entre celles-ci.
#include <stdio.h>
struct temps
{ unsigned heures;
unsigned minutes;
double secondes;
};
void main()
{ struct temps t1; struct temps t2;
printf("Première mesure (hh:mm:ss) : ");
scanf("%u:%u:%lf", &t1.heures, &t1.minutes, &t1.secondes);
printf("Deuxième mesure (hh:mm:ss) : ");
scanf("%u:%u:%lf", &t2.heures, &t2.minutes, &t2.secondes);
t1.minutes += t1.heures * 60; t1.secondes += t1.minutes * 60;
t2.minutes += t2.heures * 60; t2.secondes += t2.minutes * 60;
printf("Il y a %.3f seconde(s) de différence.\n", t2.secondes - t1.secondes);
}
22
Pointeur de Structure

 Le langage C permet outre la notation classique de structure, une notation


importante de pointeur de structure.

 L’utilisation de pointeurs est particulièrement propice dans le cas du passage de


structures à des fonctions.

 Un pointeur de structure est créée de la même manière qu'un pointeur de


n'importe quelle autre type de base.

 Exemple : créer un pointeur p vers un objet de type struct temps.

struct temps *p;

23
Accès via un pointeur

 L’utilisation d’un pointeur de structure induit la gestion de : l’accès via le


pointeur et l’accès à un membre.
 Exemple 1
(*p).heures = 1; ↔ p->heures = 1;
 Exemple 2
struct temps t;
struct temps *p = &t;
// Pour un pointeur, on utilise la flèche
p->heures = 1;
p->minutes = 45;
p->secondes = 30.560;
// Pour une variable, on utilise le "point"
t.heures = 2;
t.minutes = 20;
t.secondes = 19,233;
24
Accès via un pointeur
 Exemple 3 : structure comme paramètre de fonction
struct Coordonnees
{
int x;
int y;
};
void initialiserCoordonnees(struct Coordonnees* point)
{
point->x = 0;
point->y = 0;
}
void main()
{ struct Coordonnees monPoint;
initialiserCoordonnees(&monPoint); }
25
Adressage

 L’opérateur d’adressage & peut s’appliquer aussi bien à une structure qu’à
un de ses membres.

 Exemple
struct temps t;
// un pointeur p pointant sur la structure t
struct temps *p = &t;

//un pointeur q pointant sur le champ heures de la structure t


unsigned *q = &t.heures; //&t

26
Accès via un pointeur : Exemple

Ecrire une fonction qui permet de saisir un livre au clavier. Il y a 2 solutions :

On retourne l’ouvrage à la fin de la fonction On passe l’ouvrage à la fonction par adresse


struct ouvrage lecture1 () void lecture2 (struct ouvrage *l)
{ {
struct ouvrage l ; gets (ltitre) ;
gets (l.titre) ; scanf ("%d",&(lcode)) ;
scanf ("%d",&l.code) ; gets (lauteur) ;
gets (l.auteur) ; gets (lediteur) ;
gets (l.editeur) ; scanf ("%f",&(lprix)) ;
scanf ("%f",&l.prix) ; }
return l ;
}

27
Tableaux de structures

 Etant donné qu'une structure est composée d'éléments de taille fixe, il est
possible de créer un tableau ne contenant que des éléments du type d'une
structure donnée.
 Syntaxe
struct Nom_Structure Nom_Tableau[Nb_Elements];
 Exemple
#define MAX_PERS 100
struct personne
{
char genre ;
float taille, poids ;
};
struct personne pers[MAX_PERS] ;
int nbPers ; /* le nombre effectif de personnes*/
28
Tableaux de structures : Exemple

Ecrire une fonction qui permet de saisir un tableau de livres au clavier.

void lecture_tab (int *n, struct ouvrage livre[ ])


{
int i ;
do
{
printf (« Donner le nombre d’ouvrages ») ;
scanf ("%d",n) ;
}while ((*n <= 0) || (*n > 10)) ;
for (i = 0 ; i < *n ; i ++)
lecture2 (livre+i) ;
}

29
Structure de structures
 Un des membres de la structure peut être lui-même une structure de données.
 Exemple
struct complex
{
int imag_value;
float real_value;
};
struct number
{ struct complex comp;
int real;
} num1, num2;
//struct number num1, num2;
num2.comp.imag_value;

30
Alias de structure
 Une structure de données peut être définit dans le fichier header.
 L’ajout de l’ instruction typedef permet de créer un alias de structure
 utiliser le nouveau type de données sans le mot clé « struct »
 Exemple 1
typedef unsigned long ulong;

typedef struct
{
int x;
int y;
}Coordonnees;

void main()
{ Coordonnees C; }
31
Exercice
Ecrire une fonction qui permet de saisir un tableau de livres au clavier.

typedef struct typedef struct


{ {
int jour ; char titre[20] ;
char mois[12] ; int code ;
int annee ; char auteur[30] ;
}date ; char editeur[20] ;
float prix ;
date date_edition ;
}ouvrage ;
Un ouvrage est :
Date edition
titre code auteur editeur prix jour mois Année

32
Exercice
Ecrire une fonction qui permet de saisir un ouvrage au clavier selon la
structure précédente.

void lecture3(ouvrage *l)


{
gets (ltitre) ;
scanf ("%d",&lcode) ;
gets (lauteur) ;
gets (lediteur) ;
scanf ("%f",&lprix) ;
scanf("%d",&ldate_edition.jour) ;
gets(ldate_edition.mois) ;
scanf("%d",&ldate_edition.annee) ;
}
33
Exercice

Ecrire une fonction qui permet d’afficher un livre selon la structure précédente.

void affich_livre2(ouvrage l)
{
puts (l.titre) ;
printf ("%d",l.code) ;
puts (l.auteur) ;
puts (l.editeur) ;
printf ("%f",l.prix) ;
printf ("%d",l.date_edition.jour) ;
puts (l.date_edition.mois);
printf ("%d",l.date_edition.annee) ;
}
34
Exercice
Si on veut ajouter un tableau indiquant le nombre de sorties du livre pour
chaque jour du mois :
typedef struct
{
char titre[20] ;
int code ;
char auteur[30] ;
char editeur[20] ;
float prix ;
date date_edition ;
int nb_sorties[31] ;
}ouvrage ;

Date edition Nombre de sorties


titre code auteur editeur prix 1 4 … 2
jour mois Année

35
Exercice

Ecrire une fonction qui permet d’afficher un livre selon la structure


précédente.
void Affich_livre3(ouvrage l)
{
puts (l.titre) ;
printf ("%d",l.code) ;
puts (l.auteur) ;
puts (l.editeur) ;
printf ("%f",l.prix) ;
printf ("%d",l.date_edition.jour) ;
puts (l.date_edition.mois);
printf ("%d",l.date_edition.annee) ;
for (i = 0; i <31; i ++)
printf ("%d",l.nb_sorties[i]);
}
36

Vous aimerez peut-être aussi

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy