Vous êtes sur la page 1sur 15

Structures et tableaux des structures

A) Le type structure :

1) Domaines d'utilisation :
Le type structure se trouve dans les structures de données
suivantes :

- tableau de structures
- liste linéaire chaînée, arbre binaire (pour IFT 1166)
- fichier non texte (pour IFT 1166)
- classe (programmation orientée objet)
- etc ...

2) Introduction :
Le type structure (struct) est une collection des champs qui peuvent être
de types différents.

Exemple :

Une personne est une structure avec les champs possibles suivants :

- nom et prénom : chaîne de caractères


- taille et poids : réels
- âge : entier
- sexe : caractère
- etc ...

Grâce à ce type, on peut réduire le nombre de tableaux à traiter


dans un programme :

Pour la gestion des notes du cours IFT 1969 :

1. Avec les tableaux à un seul indice, on a besoin des tableaux


suivants :

nomPre : tableau des chaînes de caractères


numero : tableau des entiers (numéros d'inscription)

intra, final, tp1, tp2, tp3, tps, globale : 7 tableaux des


réels

code : tableau des chaînes de caractères ("A+", "C-",...)

Au total, on a 10 tableaux à déclarer, à écrire sur les


en-têtes des fonctions et des appels. De plus, quand on
fait la permutation dans le tri, il faut utiliser 3 affectations

Structure et tableaux des structures


par tableau. Avec ces 10 tableaux, ces échanges nécessitent
10 x 3 = 30 affectations. C'est long à écrire.

2. Avec les tableaux à deux indices, on peut réduire sensiblement


le nombre de tableaux à traiter :

nomPre : tableau des chaînes de caractères


numero : tableau des entiers (numéros d'inscription)
note : un seul tableau à 2 indices
code : tableau des chaînes de caractères ("A+", "C-",...)

Au total, on a 4 tableaux à déclarer, à manipuler sur les


en-têtes des fonctions et des appels. Pour le tri, on a
besoin de 12 (4 x 3) affectations afin de permuter les
informations.

3. Avec le type structure, il est possible d'utiliser un seul


tableau : tableau des étudiants, chaque élément de ce tableau
est une variable de type structure. On a ainsi un seul tableau
à déclarer et à manipuler.

Plus tard dans les autres cours, on utilisera le type "struct" dans les
listes linéaires chaînées, les arbres binaires, les fichiers non textes,
...

3) Déclaration et terminologie :
Supposons qu'on désire déclarer deux variables pers1 et pers2
de type structure et que chaque personne dispose de quatre
informations :

- numéro : un entier
- taille et poids : deux réels
- sexe : un caractère.

a) Façon 1 : déclaration directe sans le nom du type structure.

struct
{
int numero ;
float taille, poids ;
char sexe ;
} pers1, pers2 ;

Le désavantage de cette manière de faire est qu'il n'est pas


flexible pour la déclaration de nouvelles variables de même type
structure que nous aimerions utiliser ailleurs dans un même
programme.

Structure et tableaux des structures


Schéma d'une structure :
╔═════════════╗═══════╗════════╗═════╗
pers1 ║ 1325 ║ 1.75 ║ 67.9 ║ 'M' ║
╚═════════════╝═══════╝════════╝═════╝
╔═════════════╗═══════╗════════╗═════╗
pers2 ║ 6548 ║ 1.67 ║ 57.3 ║ 'F' ║
╚═════════════╝═══════╝════════╝═════╝

b) Façon 2: déclaration avec le nom du type structure.

b.1) on déclare d'abord le type :

struct Personne
{
int numero ;
float taille, poids ;
char sexe ;
} ;

b.2) on déclare après les variables :

struct Personne pers1, pers2 ;

Si on veut déclarer d'autres informations de ce type,


il suffit de se référer au type "struct Personne" :

Exemples :

1) void afficher ( struct Personne unePers )


/* afficher les informations d' "unePers" qui est
de type struct Personne */

2) struct Personne tempo ; /* une autre variable de


même type */

etc ...

c) Façon 3: déclarer en même temps le type et les variables:

struct Personne
{
int numero ;
float taille, poids ;
char sexe ;

} pers1, pers2 ;

Structure et tableaux des structures


d) Façon 4: déclarer en utilisant "typedef" :

typedef struct {

int numero ;
float taille, poids ;
char sexe ;

} Personne ; /* personne est le nom du type */

Personne pers1, pers2 ;

Remarques :

1. Pour le cours IFT 1969, on vous suggère fortement d'utiliser


la 4 ième façon.

2. Avec la déclaration selon la 4 ième façon :

a) Personne est le nom du type structure qui


dispose de 4 champs d'information.

b) numero est le nom d'un champ de type entier.


taille et poids sont deux champs de type réels.
sexe est un champ de type caractère.

c) pers1 et pers2 sont deux variables de type structure dont


le nom est Personne.

3. Le C++ (IFT 1166) permet de simplifier les déclarations :

struct Personne
{ int numero ;
float taille, poids ;
char sexe ;
};

Personne pers1, pers2 ;

Exemple :

Écrire les déclarations d'une variable "unEtud" de type "Etudiant"


pour la gestion de ses notes.

Structure et tableaux des structures


Solution :

#define LONG_NP 30 /* 30 caractères pour le nom et le prénom */


#define NB_NOTES 7 /* 7 notes */
#define LONG_CODE 2 /* 2 caractères pour le code littéral "B+" ...*/

typedef struct
{ char nomPre [LONG_NP +1] ;
int numIns ;

float note[NB_NOTES] ;

char code[LONG_CODE+1] ;
}
Etudiant ;

Etudiant unEtud ;

Exercice :

Écrire les déclarations d'une variable "unEmp" de type "Employe"


qui comporte les champs d'informations suivantes :

- nom et prénom
- numéro d'employé
- numéro d'assurance sociale
- âge
- salaire hebdomadaire
- poste de travail (parmi les postes : analyste, programmeur,
opérateur, secrétaire)

4) Manipulation du type structure :

4.1) Accès à un champ d'une structure :


Comme en langage PASCAL, le C utilise aussi le point "." pour
accéder à un champ d'une variable de type structure :

variable_de_type_structure.champ

Exemples :

1. Écrire les instructions pour donner à la "pers1" les


informations suivantes :

C'est un homme qui mesure 1.67 mètre et pèse 67.8 kgs.


Son numéro d'identification est le 7234.

pers1.numero = 7234 ;
pers1.sexe = 'M' ;
pers1.taille = 1.67 ;
pers1.poids = 67.8 ;

Structure et tableaux des structures


2. Écrire les instructions pour afficher les informations
de "pers1" à l'écran :

printf("Son numéro : %6d\n", pers1.numero);


printf("Son sexe : %6c\n", pers1.sexe);
printf("Son poids : %6.2f kgs\n", pers1.poids);
printf("Sa taille : %6.2f m\n", pers1.taille);

Cas spécial : Pointeur vers le type structure :


Avec la déclaration : Personne * p ;

p est un pointeur vers le type Personne.

*p est une variable de type Personne.

On peut accéder à n'importe quel champ de *p :

(*p).taille, (*p).poids, etc ....

Le C permet de simplifier l'écriture en utilisant l'opérateur ->

(*p).champ <======> p->champ

Interprétation : le champ pointé par p

4.2) Affectation entre deux variables de type structure :

Avec Personne pers1, pers2 ; on peut affecter l'une à l'autre :

pers1 = pers2 ; /* pers1 contiendra toutes les informations


de pers2. */

Exemple :

Écrire une fonction permettant d'échanger les informations de


deux personnes (de type Personne) :

Solution :

void echanger ( Personne * p1, Personne * p2)


{
Personne tempo = *p1 ;
*p1 = *p2 ;
*p2 = tempo ;
}

Structure et tableaux des structures


4.3) Comparaison entre deux variables de type structure :
La comparaison directe de deux informations de type structure

if ( pers1 == pers2 ) printf("C'est pareil") ;

n'est pas permise.

Cependant, le C permet de comparer octet par octet (comparaison


en mémoire) :

#include <mem.h> /* pour memcmp : memory comparaison */

.......

if ( memcmp(&pers1, &pers2, sizeof(Personne)) == 0)


printf("Elles sont identiques\n");
else
printf("Elles sont différentes\n");

B) Tableau de structures :
1) Domaines d'utilisation :
Supposons qu'on a besoin de manipuler les informations "structurées"
(des personnes, des étudiants, des employés, etc ...) dont les
traitements prévus sont :

- le tri, la recherche d'un élément


- l'affichage
- les statistiques
- la création de nouveaux fichiers

Si le nombre de données est raisonnable (exemple : 500 à 600 personnes


à traiter, 400 étudiants à calculer les notes , etc ... ), on peut
utiliser un tableau des structures.

2) Déclaration :
Écrire les déclarations d'un tableau de personnes. Chaque élément
du tableau est de type structure nommé "personne" qui comporte les
champs suivants :

sexe : 1 seul caractère


taille et poids : 2 réels

On a 100 personnes ou moins à traiter.

Structure et tableaux des structures


Solution :

#define MAX_PERS 100

typedef struct
{ char sexe ;
float taille, poids ;
}
Personne ;

Personne pers[MAX_PERS] ;

int nbPers ; /* le nombre effectif de personnes*/

3) Schéma d'un tableau des structures :


╔═══════╗════════╗═════╗
pers[0] ║ 'M' ║ 1.56 ║ 65.8║
╔═══════╗════════╗═════╗
pers[1] ║ 'F' ║ 1.70 ║ 56.4║
╔═══════╗════════╗═════╗
pers[2] ║ 'M' ║ 1.56 ║ 65.8║
.....

4) Compréhension de base :
Avec ces déclarations :

1) pers est un tableau des personnes ;

2) pers[0], pers[1], ..., pers[99] sont 100 éléments du


tableau pers. Chacun est une variable de type structure
nommé "Personne" ;

3) pers[15].sexe est le sexe de la 16 ième personne ;

4) La déclaration : Personne * p ;

rend valide l'affectation suivante :

p = pers ;

Cette affectation est équivalente à : p = &pers[0] ;

De plus, *(p + i) est équivalent à pers[i].


Ainsi :

*(p + i). taille est pers[i].taille

Donc, (p + i) -> taille est pers[i].taille

Structure et tableaux des structures


5) Exemples sur les tableaux des structures :

/* Fichier tab_struct.c (exemple de fichiers textes, tableaux, ...)

Données : fichier "Employe.txt"


F 357 39.0 20.25
M 980 40.0 20.25
M 756 40.0 10.25
F 356 40.0 20.25
etc . . .

Chaque ligne du fichier représente les informations


d'un employé
un caractère pour le sexe
le numéro de l'employé
le nombre d'heures de travail par semaine
le taux d'horaire
On a au maximum 100 employés dans le fichier

Ce programme permet de :
1. lire le fichier "employe.txt", remplir le tableau de structure
emp (tableau d'employés)et transmettre via pointeur le nombre
de personnes lues;
2. afficher le contenu de ce tableau avant le tri
3. trier ces tableaux selon leurs numeros;
4. afficher le contenu de ces tableaux apres le tri
etc

Cet exemple est expliqué en classe


*/

#include <stdio.h>
#include <stdlib.h>
#include <float.h>

typedef struct
{
char sexe ;
int numero;
float salHebdo ;

} Employe;

void lireRemplir(Employe emp[], int * p)


{
int n = 0;
float nbHr, taux;
FILE * aLire = fopen("employe.txt", "r");
while (!feof(aLire))
{
fscanf(aLire, "%c%d%f%f\n", &emp[n].sexe, &emp[n].numero, &nbHr,
&taux);
emp[n].salHebdo = nbHr * taux;
n++;
}

Structure et tableaux des structures


fclose(aLire);
*p = n;
}

void afficher(Employe emp[], int nbEmp, char mess[])


{ int i ;
printf("Contenu du tableau des employes %s :\n", mess);

for(i = 0; i < nbEmp; i++)


printf("%5d) %6c %10d %10.2f\n", i, emp[i].sexe, emp[i].numero,
emp[i].salHebdo);
printf("\n\n");
}

void permuter(Employe * p, Employe * r)


{
Employe tempo = *p;
*p = *r;
*r = tempo;
}

void trier(Employe emp[], int nbEmp)


{
int i, j, indMin ;
for(i = 0; i < nbEmp-1; i++)
{ indMin = i;
for (j = i+1; j < nbEmp; j++)
if (emp[j].numero < emp[indMin].numero)
indMin = j;
if (indMin != i)
permuter(&emp[i], &emp[indMin]);

}
}

int nombre(char sexeVoulu, Employe emp[], int nbEmp)


{
int n = 0, i ;
for(i = 0; i < nbEmp; i++)
if (emp[i].sexe == sexeVoulu)
n++;
return n ;
}

float meilleur(char sexeVoulu, Employe emp[], int nbEmp)


{ float salMax = FLT_MIN;
int i ;
for(i = 0; i < nbEmp; i++)
if (emp[i].sexe == sexeVoulu && emp[i].salHebdo > salMax)
salMax = emp[i].salHebdo;

return salMax;
}

int main() {

Structure et tableaux des structures


#define MAX_EMP 100
Employe emp[MAX_EMP];
int nbEmp, nbFem, nbHom ;
lireRemplir(emp, &nbEmp);

afficher(emp, nbEmp, "avant le tri");

nbFem = nombre('F', emp, nbEmp);


printf("Le nombre de femmes : %d\n", nbFem);

if (nbFem > 0)
printf("Meilleur salaire hebdo des femmes : %.2f $\n",
meilleur('F', emp, nbEmp));
else
printf("Pas de femmes => pas de meilleur salHebdo des femmes\n");

printf("Le nombre d'hommes : %d\n", nombre('M', emp, nbEmp));

trier(emp, nbEmp);
afficher(emp, nbEmp, "apres le tri selon les numeros");

system("pause");
return 0;
}
/* Execution :
Contenu du tableau des employes avant le tri :
0) M 972 810.00
1) M 758 630.00
2) F 860 2564.25
3) M 692 810.00
4) F 473 810.00
5) F 871 810.00
6) M 757 789.75
7) F 319 810.00
8) F 123 677.25
9) F 526 810.00
10) F 585 810.00
11) F 273 630.00
12) F 942 1959.75
13) M 927 661.50
14) F 146 810.00
15) F 281 789.75
16) F 343 870.75
17) F 948 430.50
18) F 206 630.00
19) M 771 749.25
20) M 731 379.25
21) F 375 1610.00
22) F 246 410.00
23) F 107 850.50
24) M 666 630.00
25) M 955 810.00

Structure et tableaux des structures


26) F 208 410.00
27) M 918 810.00
28) F 156 410.00
29) F 476 630.00
30) F 29 410.00
31) F 965 810.00
32) M 811 379.25
33) F 194 389.50
34) F 580 810.00
35) F 511 749.25
36) F 144 810.00
37) F 831 410.00
38) M 622 630.00
39) F 544 810.00
40) M 958 410.00
41) M 830 2630.00
42) M 936 630.00
43) F 269 630.00
44) F 840 810.00
45) M 776 810.00
46) F 970 810.00
47) M 829 810.00
48) F 232 630.00
49) F 362 630.00
50) M 993 410.00
51) F 467 430.50
52) F 528 810.00
53) M 905 410.00
54) F 463 870.75
55) F 517 614.25
56) M 807 850.50
57) F 446 630.00
58) F 515 630.00
59) F 118 410.00
60) M 845 410.00
61) F 436 410.00
62) F 360 810.00
63) F 414 769.50
64) F 527 850.50
65) M 900 410.00
66) F 28 810.00
67) F 61 614.25
68) F 66 630.00
69) M 780 810.00
70) F 559 810.00
71) F 163 440.75
72) M 781 614.25
73) F 123 440.75
74) M 832 630.00
75) M 827 850.50
76) M 805 810.00
77) F 551 749.25
78) M 856 410.00
79) M 963 440.75
80) M 982 630.00
81) M 872 410.00
82) M 949 810.00

Structure et tableaux des structures


83) F 429 630.00
84) F 8 810.00
85) F 42 810.00
86) M 848 410.00
87) M 649 810.00
88) M 815 630.00
89) F 439 410.00
90) F 295 630.00
91) F 466 410.00
92) F 371 582.75
93) F 474 389.50
94) M 964 810.00

Le nombre de femmes : 59
Meilleur salaire hebdo des femmes : 2564.25 $
Le nombre d'hommes : 36
Contenu du tableau des employes apres le tri selon les numeros :
0) F 8 810.00
1) F 28 810.00
2) F 29 410.00
3) F 42 810.00
4) F 61 614.25
5) F 66 630.00
6) F 107 850.50
7) F 118 410.00
8) F 123 677.25
9) F 123 440.75
10) F 144 810.00
11) F 146 810.00
12) F 156 410.00
13) F 163 440.75
14) F 194 389.50
15) F 206 630.00
16) F 208 410.00
17) F 232 630.00
18) F 246 410.00
19) F 269 630.00
20) F 273 630.00
21) F 281 789.75
22) F 295 630.00
23) F 319 810.00
24) F 343 870.75
25) F 360 810.00
26) F 362 630.00
27) F 371 582.75
28) F 375 1610.00
29) F 414 769.50
30) F 429 630.00
31) F 436 410.00
32) F 439 410.00
33) F 446 630.00
34) F 463 870.75
35) F 466 410.00
36) F 467 430.50
37) F 473 810.00
38) F 474 389.50

Structure et tableaux des structures


39) F 476 630.00
40) F 511 749.25
41) F 515 630.00
42) F 517 614.25
43) F 526 810.00
44) F 527 850.50
45) F 528 810.00
46) F 544 810.00
47) F 551 749.25
48) F 559 810.00
49) F 580 810.00
50) F 585 810.00
51) M 622 630.00
52) M 649 810.00
53) M 666 630.00
54) M 692 810.00
55) M 731 379.25
56) M 757 789.75
57) M 758 630.00
58) M 771 749.25
59) M 776 810.00
60) M 780 810.00
61) M 781 614.25
62) M 805 810.00
63) M 807 850.50
64) M 811 379.25
65) M 815 630.00
66) M 827 850.50
67) M 829 810.00
68) M 830 2630.00
69) F 831 410.00
70) M 832 630.00
71) F 840 810.00
72) M 845 410.00
73) M 848 410.00
74) M 856 410.00
75) F 860 2564.25
76) F 871 810.00
77) M 872 410.00
78) M 900 410.00
79) M 905 410.00
80) M 918 810.00
81) M 927 661.50
82) M 936 630.00
83) F 942 1959.75
84) F 948 430.50
85) M 949 810.00
86) M 955 810.00
87) M 958 410.00
88) M 963 440.75
89) M 964 810.00
90) F 965 810.00
91) F 970 810.00
92) M 972 810.00
93) M 982 630.00
94) M 993 410.00

Structure et tableaux des structures


Appuyez sur une touche pour continuer...
*/

Structure et tableaux des structures

Vous aimerez peut-être aussi