8PRO100 Éléments de programmation Comment faire prendre une décision à un ordinateur?
8PRO100 Éléments de programmation Les types composés.
-
Upload
jeunesse-evrard -
Category
Documents
-
view
113 -
download
2
Transcript of 8PRO100 Éléments de programmation Les types composés.
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.
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
Exemple en C
struct complexe { double reel; double imag;};
struct complexe x;
x.reel:
x.imag:
double
double
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.
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:
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:
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:
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 = x.reel + y.reel; a.imag = x.imag + y.imag; return a;}
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
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.
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
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
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;}
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...
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 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é 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.
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
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;};
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;};