8PRO100 Éléments de programmation Les types composés.

22
8PRO100 Éléments de programmation Les types composés

Transcript of 8PRO100 Éléments de programmation Les types composés.

Page 1: 8PRO100 Éléments de programmation Les types composés.

8PRO100

Éléments de programmation

Les types composés

Page 2: 8PRO100 Éléments de programmation Les types composés.

Types composés

En plus des types de base (entier, réels, charactères, etc) il est possible dans la plupart des langages de programmation de définir ses propres types.

Il s’agit en fait de rassembler une ou plusieurs variables, qui peuvent être de types différents, et de les regrouper sous un seul nom afin de les manipuler plus facilement.

Page 3: 8PRO100 Éléments de programmation Les types composés.

Exemple Un nombre complexe est un nombre de la forme

a + b*i

où a et b sont des nombres réels et le symbole i vaut

On doit d'abord définir un nouveau type dont le nom est complexe. Ce nouveau type aura l'espace mémoire nécessaire pour contenir les 2 nombre réels a et b.

Après la déclaration: complexe x la mémoire associée sera:

1

x.a:

x.b:

réel

réel

Page 4: 8PRO100 Éléments de programmation Les types composés.

Exemple en C

struct complexe { double reel; double imag;};

struct complexe x;

x.reel:

x.imag:

double

double

Page 5: 8PRO100 Éléments de programmation Les types composés.

Où définir un nouveau type

#include <stdio.h>struct complexe { double reel; double imag;};

fonction(...){struct complexe x;}

Si on défini un nouveau type à l’intérieur d’une fonction alors il ne sera visible qu’à l’intérieur de cette fonction.

Pour qu’un type composé soit visible dans toutes les fonctions d’un fichier, il faut le déclarer au début du fichier, à l’extérieur de toute fonction.

Note: La même chose s’applique à la déclaration de variables: c’est ce que l’on appelle les variables globales.

Page 6: 8PRO100 Éléments de programmation Les types composés.

Assignation d'une valeur dans une structure

struct complexe { double reel; double imag;};

struct complexe x;

x.reel = 5;x.imag = 3;

5

3x.reel:

x.imag:

Page 7: 8PRO100 Éléments de programmation Les types composés.

Accéder aux membres d’une structure

struct complexe x, y, z;

x.reel = 5;x.imag = 3;

y = x;

z.reel = x.réel;z.imag = 8;

5

3x.reel:

x.imag:

5y.reel:

3y.imag:

5z.reel:

8z.imag:

Page 8: 8PRO100 Éléments de programmation Les types composés.

Comparer deux structures

if (x == y) printf(“Deux structures égales”);

if (x != z) printf(“Deux structures différentes”);

5

3x.reel:

x.imag:

5y.reel:

3y.imag:

5z.reel:

8z.imag:

Page 9: 8PRO100 Éléments de programmation Les types composés.

Les structures et les fonctions

• On peut passer des structures en paramètre.

• On peut utiliser les structures comme valeur de retour.

• Contrairement aux tableaux, les structures sont passées par copie.

Page 10: 8PRO100 Éléments de programmation Les types composés.

Exemple

struct complexe somme(struct complexe x, struct complexe y){ struct complexe a;

a.reel = x.reel + y.reel; a.imag = x.imag + y.imag; return a;}

Page 11: 8PRO100 Éléments de programmation Les types composés.

typedef

Dans l’exemple précédent, il est laborieux d’avoir à écrireautant de struct complexe.

Le C fournit une fonctionnalité appelée typedef servant à créer des noms de nouveaux types de donnéees.

Exemple:typedef struct complexe ComplexeComplexe x, y;

Le nom Complexe devient synonyme de struct complexe

Page 12: 8PRO100 Éléments de programmation Les types composés.

Les structures contenant des structures

Les membres d’un type composé peuvent être eux mêmes desvariables de types composé différents.

En C, cela se traduit par le fait qu’une structure peut être membre d’une autre structure.

Page 13: 8PRO100 Éléments de programmation Les types composés.

Exemple struct point{ int x; int y; };

struct point p1={2, 1}, p2={8, 5};

0 1 2 3 4 5 6 7 8 9

543210

y

x

p1

p2

Page 14: 8PRO100 Éléments de programmation Les types composés.

Exemple

struct rect{ struct point q1; struct point q2; };

struct rect r ;

r.q1.x = p1.x;r.q1.y = p1.y;r.q2.x = p2.x;r.q2.y = p2.y;

ou encore:

r.q1=p1;r.q2=p2;

0 1 2 3 4 5 6 7 8 9

543210

y

x

p1

p2

Page 15: 8PRO100 Éléments de programmation Les types composés.

Remarque

Le type des membres ne peut pas être la structure elle-même.

Ainsi l’exemple suivant est invalide.struct objet{

int n; struct objet x;

}

Mais l’exemple suivant est valide et même très courantstruct objet{ int n; struct *objet x;}

Page 16: 8PRO100 Éléments de programmation Les types composés.

Les tableaux de structures

On peut faire des tableaux de types composés tout comme on peut faire des tableaux de type de base.

Exemple: struct complexe tab[1000];

for (i=0; i<1000; i=i+1){ tab[i].reel = 0; tab[i].imag = 0;}

tab[0].reel tab[1].reel tab[999].reel...tab:

tab[0].imag tab[1].imag tab[999].imag...

Page 17: 8PRO100 Éléments de programmation Les types composés.

Les structures et les pointeurs

L’opérateur de prise d’adresse & fonctionne avec les structures.

On peut définir des pointeurs sur des types composés.

struct complexe *pc, x;pc = &x;(*pc).reel = 3;(*pc).imag = 5;

Remarque: Les parenthèse sont nécessaires puisque l’opérateur . a une priorité supérieure à l’opérateur *.

Page 18: 8PRO100 Éléments de programmation Les types composés.

Les structures et les pointeurs

Les pointeurs de structures sont si fréquemment utilisés qu’il existe une notation abrégée.

Exemple:struct complexe *p, x;pc = &x;

pc->reel = 3; /* identique à (*pc).reel=3 */pc->imag = 5; /* identique à (*pc).imag=5 */

Page 19: 8PRO100 Éléments de programmation Les types composés.

La taille d’une structure

Le nombre d’octets alloués pour chaque variable d’un type composé n’est pas toujour la somme de la taille de ses membres.

Exemple: struct exemple{ char c1, c2, c3; int n;} x;

Sur sunens il y a toujours un nombre pair d’octets réservés pour chaque variable (sauf si un seul octet est nécessaire).Donc, 8 octets seront alloués pour x, c’est-à-dire qu’un octet sera perdu.

Page 20: 8PRO100 Éléments de programmation Les types composés.

La taille d’une structure

Le C dispose d’un opérateur permettant de déterminer le nombre d’octets nécessaires pour mémoriser un objet du type de son opérande.

sizeof expression (L’expresion n’est pas évalué)sizeof (nom de type)

exemple: sizeof ‘a’ vaut 1sizeof (char) vaut 1sizeof (121+434)/2 vaut 4 sur sunenssizeof (int) vaut 4 sur sunenssizeof (struct complexe) vaut 8 sur sunens

Page 21: 8PRO100 Éléments de programmation Les types composés.

ExempleSupposons qu’une banque utilise un ordinateur pour conserver les principales informations sur ses clients.On associe à chaque client une variable dont le type est une structure qui pourrais ressembler à ce qui suit.

structure client{ int folio; char prenom[15]; char nom[15]; int solde; int type_de_compte; char *imprimer; /* ce qui reste à imprimer dans le livret */ int derniere_transaction;};

Page 22: 8PRO100 Éléments de programmation Les types composés.

ExempleSupposons qu’une banque utilise un ordinateur pour conserver les principales informations sur ses clients.On associe à chaque client une variable dont le type est une structure qui pourrais ressembler à ce qui suit.

structure client{ int folio; char prenom[15]; char nom[15]; int solde; int type_de_compte; char *imprimer; /* ce qui reste à imprimer dans le livret */ int derniere_transaction;};