Analyse et programmation 1
Structures
Thèmes abordés
• Applications des structures.
Défi iti d t t
• Définition des structures.
• Opérations sur les structures.
• Passage en paramètre de fonctions.
Les structures
Applications
• Quelles sont les caractéristiques représentatives :
d’ n DVD ? – d’un DVD ? – d’une photo ?
– d’un nombre complexe en représentation polaire ? – d’un composant électronique ?
• Comment les mémoriser dans un programme ?
– Type de la variable à utiliser ?
Analyse et programmation 1 - Les structures 2
Les structures
Applications
Définition
• Les structures
T pe de données d langage C – Type de données du langage C
– Constitué de plusieurs éléments, appelés champs.
– Chaque champ a un nom.
– Chaque champ peut être de type différent.
• Intérêt
– Permet de représenter des données structurées, composées.
Analyse et programmation 1 - Les structures 4
Les structures
Déclaration
• Déclaration générale avec le mot réservé struct
struct LIVRE Déclaration
struct LIVRE {
char titre[80];
char auteur[40];
char editeur[40];
char ISBN10[11];
int nombre_pages;
int annee edition;
Déclaration optionnelle d’un type
int annee_edition;
double prix_chf;
} un_livre; Déclaration optionnelle d’une variable
Les structures
Déclaration
• Forme plus habituelle
struct LIVRE struct LIVRE {
char titre[80];
char auteur[40];
char editeur[40];
char ISBN10[11];
int nombre_pages;
int annee edition;
Analyse et programmation 1 - Les structures 6
Le mot struct doit être répété lors de l‘utilisation du type
int annee_edition;
double prix_chf;
};
• Réutilisation du type pour déclarer des variables
struct LIVRE livre1, livre2;
Les structures
Signification
• Type livre: comporte plusieurs champs (sous variables)
De t pe différent – De type différent.
– Identifiés par un nom.
• Taille mémoire utilisée
struct LIVRE livre1;
printf("%d\n", sizeof livre1); // Affiche 192
• Accès aux différents champs
nom variable nom champ nom_variable.nom_champ – Exemple
livre1.nombre_pages = 64;
Utilisation
struct LIVRE livre1;
livre1.titre = "Le tresor de Rackham le Rouge";
strcpy(livre1.titre, "Le tresor de Rackham le Rouge");
strcpy(livre1.auteur, "Herge (Georges Prosper Remi)");
strcpy(livre1.editeur, "Casterman");
strcpy(livre1.ISBN10, "2203011459");
livre1.nombre_pages = 64;
livre1.annee edition = 1944;
Analyse et programmation 1 - Les structures 8
_
livre1.prix_chf = 22.30;
Les structures
Créer un type facile à utiliser
• Observation
Commodité de po oir créer de no ea t pes en C – Commodité de pouvoir créer de nouveaux types en C.
– Limitation : il faut penser à répéter le mot struct : malcommode.
• Alternative : création d’un nouveau type avec typedef
– Rappel de la syntaxe
•typedef definition_du_type NOM_DU_TYPE;
Les structures
Créer un type facile à utiliser
• Définition d’un type structure avec typedef
typedef struct
Forme recommandée
typedef struct {
char titre[80];
char auteur[40];
char editeur[40];
char ISBN10[11];
int nombre_pages;
int annee edition;
Analyse et programmation 1 - Les structures 10
Ici, il s’agit bien du nom du type, et non pas d’une variable
int annee_edition;
double prix_chf;
} LIVRE;
• Déclaration de variables avec le nouveau type créé
LIVRE livre1; Syntaxe habituelle
Les structures
Quels types sont autorisés dans une structure ?
• Tous les types valides du langage C
Les t pes simples : char int long do ble – Les types simples : char, int, long, double, … – Les tableaux.
– D’autres structures.
– Des unions, des types énumérés.
Exemple – une structure contenant une structure
typedef struct {
char nom[40];
char adresse[80];
} EDITEUR;
typedef struct {
char titre[80];
char auteur[40];
EDITEUR editeur_livre;
char ISBN10[11];
int nombre_pages;
int annee_edition;
double prix_chf;
} LIVRE;
Analyse et programmation 1 - Les structures 12
} LIVRE;
intmain() {
LIVRE livre1;
. . .
strcpy(livre1.editeur_livre.nom, "Casterman");
. . . }
Les structures
Représentation en mémoire
typedef struct {
char nom[40];
char adresse[80];
} EDITEUR;
} EDITEUR;
typedef struct {
char titre[80];
char auteur[40];
EDITEUR editeur_livre;
char ISBN10[11];[ ];
int nombre_pages;
int annee_edition;
double prix_chf;
} LIVRE;
Les structures
Initialisation
EDITEUR editeur_casterman = {"Casterman",
"132, bt2\nrue Royale\nB-1000 Bruxelles", \ y \ };};
LIVRE livre1 = {"Le tresor de Rackham le Rouge", "Herge", {"Casterman",
"132, bt2\nrue Royale\nB-1000 Bruxelles" },
"2203011459", 64, 1944, 22.30 };
Analyse et programmation 1 - Les structures 14
Les structures
Les opérations de base
• Accès aux champs d’une variable
LIVRE livre1;
LIVRE livre1;
livre1.nombre_pages = 64;
• Accès aux champs avec un pointeur
LIVRE livre1;
LIVRE * plivre;
plivre = &livre1;
– Syntaxe habituelle : fastidieuse (*plivre).nombre_pages = 64;
– Syntaxe spéciale pour les pointeurs sur des structures plivre->nombre_pages = 64;
Les opérations de base
• Taille
Comme a ec to s les t pes l’opérate r si eof est tilisable – Comme avec tous les types, l’opérateur sizeof est utilisable.
• Affectation
– Elle est utilisable avec les structs LIVRE livre1, livre2;
. . .
livre2 = livre1;
– Effet : copie tous les champs.
Analyse et programmation 1 - Les structures 16
p p
Les structures
Passage en paramètre de fonctions – par valeur
• Exemple
void afficher editeur(EDITEUR e) void afficher_editeur(EDITEUR e) {
puts("Editeur ************");
puts(e.nom);
puts(e.adresse);
} . . .
afficher_editeur(livre1.editeur_livre);
• Conséquences
– La variable passée est recopiée sur la pile.
– 120 octets de données à recopier.
– Lent et coûteux en mémoire sur la pile.
• Mode déconseillé pour les structures volumineuses.
Les structures
Passage comme résultat de fonction
• Exemple
EDITEUR saisir_editeur() {
EDITEUR e;
printf("Nom de l'editeur:");
gets(e.nom);
printf("Adresse:");
gets(e.adresse);
return e;
} . . .
livre1 editeur livre = saisir editeur();
Analyse et programmation 1 - Les structures 18
livre1.editeur_livre = saisir_editeur();
• Conséquences
– Le résultat est recopié sur la pile.
– 120 octets de données à recopier.
– Lent et coûteux en mémoire sur la pile.
• Mode déconseillé pour les structures volumineuses.
Les structures
Passage en paramètre de fonctions – par adresse
• Exemple
void saisir editeur(EDITEUR * pediteur) void saisir_editeur(EDITEUR pediteur) {
printf("Nom de l'editeur:");
gets(pediteur->nom);
printf("Adresse:");
gets(pediteur->adresse);
}
. . .
saisir_editeur(&livre1.editeur_livre);
• Conséquences
– Seule l’adresse est recopiée, très efficace.
Passage en paramètre de fonctions – par adresse sur une constante
• Exemple
void afficher editeur(const EDITEUR * pediteur)_ ( p ) {
puts("Editeur ************");
puts(pediteur->nom);
puts(pediteur->adresse);
} . . .
afficher_editeur(&livre1.editeur_livre);
Conséquences
Analyse et programmation 1 - Les structures 20
• Conséquences
– Seule l’adresse est recopiée, très efficace.
– La variable passée en paramètres n’est pas modifiable dans la fonction.
• Mode à utiliser toujours pour les structures volumineuses à la place du passage par valeur.
Les structures
Exemple d’utilisation – les nombres complexes
typedef struct {
double x, y;
} COMPLEXE_CARTESIEN;
voidafficher_complexe_cartesien(COMPLEXE_CARTESIEN c1) {
printf("(%lf, %lf)", c1.x, c1.y);
}
voidsaisir_complexe_cartesien(COMPLEXE_CARTESIEN * c1) {
printf("x:");
scanf("%lf", &c1->x);
printf("y:");
scanf("%lf" &c1->y);
scanf( %lf , &c1 >y);
}
COMPLEXE_CARTESIEN somme_complexe_cartesien(COMPLEXE_CARTESIEN c1, COMPLEXE_CARTESIEN c2) {
COMPLEXE_CARTESIEN resultat;
resultat.x = c1.x + c2.x;
resultat.y = c1.y + c2.y;
Les structures
Exemple d’utilisation – les nombres complexes
int main() {
COMPLEXE CARTESIEN c1, c2, c3;
COMPLEXE_CARTESIEN c1, c2, c3;
// Saisir c1 printf("c1:\n");
saisir_complexe_cartesien(&c1);
// Saisir c2 printf("c2:\n");
saisir_complexe_cartesien(&c2);
// Calculer et afficher la somme c3 = somme complexe cartesien(c1 c2);
Analyse et programmation 1 - Les structures 22
c3 = somme_complexe_cartesien(c1, c2);
printf("somme:\n");
afficher_complexe_cartesien(c3);
printf("\n");
system("PAUSE");
return 0;
}
Qu’avons-nous appris ?
• La représentation de données composées avec les structures
structures.
• Déclaration, initialisation, utilisation de structures.
• Passage en paramètre.
• Syntaxe particulière avec les pointeurs.
Vos questions
Analyse et programmation 1 - Les structures 24