8 PRO 100 lments de programmation Les types

  • Slides: 22
Download presentation
8 PRO 100 Éléments de programmation Les types composés

8 PRO 100 É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

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.

Exemple Un nombre complexe est un nombre de la forme a + b*i où

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: x. a: réel x. b: réel

Exemple en C struct complexe { double reel; double imag; }; struct complexe x;

Exemple en C struct complexe { double reel; double imag; }; struct complexe x; x. reel: double x. imag: double

Où définir un nouveau type Si on défini un nouveau type à l’intérieur d’une

Où définir un nouveau type 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. #include <stdio. h> struct complexe { double reel; double imag; }; fonction(. . . ){ struct complexe x; }

Assignation d'une valeur dans une structure struct complexe { double reel; double imag; };

Assignation d'une valeur dans une structure struct complexe { double reel; double imag; }; struct complexe x; x. reel = 5; x. imag = 3; x. reel: x. imag: 5 3

Accéder aux membres d’une structure struct complexe x, y, z; x. reel = 5;

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; x. reel: x. imag: y. reel: y. imag: z. reel: z. imag: 5 3 5 8

Comparer deux structures x. reel: if (x == y) printf(“Deux structures égales”); if (x

Comparer deux structures x. reel: if (x == y) printf(“Deux structures égales”); if (x != z) printf(“Deux structures différentes”); x. imag: y. reel: y. imag: z. reel: z. imag: 5 3 5 8

Les structures et les fonctions • On peut passer des structures en paramètre. •

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.

Exemple struct complexe somme(struct complexe x, struct complexe y){ struct complexe a; a. reel

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; }

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

typedef Dans l’exemple précédent, il est laborieux d’avoir à écrire autant 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 Complexe x, y; Le nom Complexe devient synonyme de struct complexe

Les structures contenant des structures Les membres d’un type composé peuvent être eux mêmes

Les structures contenant des structures Les membres d’un type composé peuvent être eux mêmes des variables de types composé différents. En C, cela se traduit par le fait qu’une structure peut être membre d’une autre structure.

Exemple struct point{ int x; int y; }; struct point p 1={2, 1}, p

Exemple struct point{ int x; int y; }; struct point p 1={2, 1}, p 2={8, 5}; y 5 4 3 2 1 0 p 2 p 1 0 1 2 3 4 5 6 7 8 9 x

Exemple struct rect{ struct point q 1; struct point q 2; }; struct rect

Exemple struct rect{ struct point q 1; struct point q 2; }; struct rect r ; r. q 1. x = p 1. x; r. q 1. y = p 1. y; r. q 2. x = p 2. x; r. q 2. y = p 2. y; ou encore: r. q 1=p 1; r. q 2=p 2; y 5 4 3 2 1 0 p 2 p 1 0 1 2 3 4 5 6 7 8 9 x

Remarque Le type des membres ne peut pas être la structure elle-même. Ainsi l’exemple

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 courant struct objet{ int n; struct *objet x; }

Les tableaux de structures On peut faire des tableaux de types composés tout comme

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: tab[0]. reel tab[1]. reel tab[0]. imag tab[1]. imag . . . tab[999]. reel tab[999]. imag

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

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 *.

Les structures et les pointeurs Les pointeurs de structures sont si fréquemment utilisés qu’il

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 */

La taille d’une structure Le nombre d’octets alloués pour chaque variable d’un type composé

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 c 1, c 2, c 3; 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.

La taille d’une structure Le C dispose d’un opérateur permettant de déterminer le nombre

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 1 sizeof (char) vaut 1 sizeof (121+434)/2 vaut 4 sur sunens sizeof (int) vaut 4 sur sunens sizeof (struct complexe) vaut 8 sur sunens

Exemple Supposons qu’une banque utilise un ordinateur pour conserver les principales informations sur ses

Exemple Supposons 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; };

Exemple Supposons qu’une banque utilise un ordinateur pour conserver les principales informations sur ses

Exemple Supposons 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; };