• Aucun résultat trouvé

Analyse et programmation 1

N/A
N/A
Protected

Academic year: 2022

Partager "Analyse et programmation 1"

Copied!
13
0
0

Texte intégral

(1)

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.

(2)

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

(3)

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

(4)

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;

(5)

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;

(6)

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.

(7)

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;

(8)

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;

(9)

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.

(10)

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.

(11)

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;

(12)

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.

(13)

Vos questions

Analyse et programmation 1 - Les structures 24

Références

Documents relatifs

char short (short int) int long (long int) – char, short (short int), int, long (long int) – Par défaut, ce sont des types entiers signés. • Contiennent des

Les chaînes de format de printf – valeurs entières - modificateurs Modificateur Exemples

– Règles définissant l’ordre d’évaluation par défaut – Usage des parenthèses pour forcer un ordre d’évaluation.

le contrôle passe en déb t de bo cle po r é al er la condition et – le contrôle passe en début de boucle pour évaluer la condition et. décider de

– Dans les cas simples le type et le rôle d’une variable sont évidents – Dans les cas simples, le type et le rôle d une variable sont évidents. – Dans les autres cas, il

Lorsque le compilateur rencontre un appel à cette fonction, il dispose de toute l’information nécessaire sur les paramètres et le résultat.. Donc,

• La fonction peut modifier le contenu du tableau passé en paramètre..

// retourne l'adresse de la première occurence d'un caractère dans une chaine char* strchr(const char* str, int c);. // retourne l'adresse de la première occurence d'un caractère