Structures donnes 1 Structures donnes Le tableau permettait
Structures données 1
Structures données § Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée par un indice. § La structure va nous permettre de désigner sous un seul nom un ensemble de valeurs pouvant être de types différents. § L'accès à chaque élément de la structure (nommé champ) se fera non plus par une indication de position, mais par son nom au sein de la structure. 2
Structures données DÉCLARATION D'UNE STRUCTURE § Première méthode struct personne { char nom[20]; char prenom[20]; int no_employe; }; On définit un modèle de structure § Ce modèle s'appelle ici personne et il précise le nom et le type de chacun des "champs" constituant la structure. § Le modèle de structure ne réserve pas de variables correspondant à cette structure. 3
Structures données DÉCLARATION D'UNE STRUCTURE § Première méthode § Une fois un tel modèle défini, on peut déclarer des "variables" du type correspondant. On réserve deux emplacements p 1 et p 2 du type personne. struct personne p 1, p 2; nom prenom no_employe nom 20 octets 20 octets prenom no_employe 20 octets 2 octets 84 octets p 1 p 2 4
Structures données DÉCLARATION D'UNE STRUCTURE § Deuxième méthode On déclare des variables de type structure sans utiliser un modèle de structure. struct { char nom[20]; char prenom[20]; int no_employe; } p 1, p 2; 5
Structures données DÉCLARATION D'UNE STRUCTURE § Troisième méthode struct personne { char nom[20]; char prenom[20]; int no_employe; } p 1, p 2; . . . struct personne pers 1, pers 2, pers 3; On peut combiner déclaration du modèle de structure et déclaration de variables. 6
Structures données DÉCLARATION D'UNE STRUCTURE § Quatrième méthode – avec TYPEDEF struct personne { char nom[20]; char prenom[20]; int no_employe; }; . . . typedef struct personne PERSONNE; PERSONNE p 1, p 2; typedef struct { char nom[20]; char prenom[20]; int no_employe; }personne; personne p 1, p 2, *p 3, p 4[5]; Variant A Variant B 7
Structures données DÉCLARATION D'UNE STRUCTURE LA PORTÉE DU MODÈLE DE STRUCTURE § La "portée" d'un modèle de structure dépend de l'emplacement de sa déclaration: § si elle se situe au sein d'une fonction (y compris, la "fonction main"), elle n'est accessible que depuis cette fonction; § si elle se situe en dehors d'une fonction, elle est accessible de toute la partie du fichier source qui suit sa déclaration; elle peut ainsi être utilisée par plusieurs fonctions; § il est possible de placer un certain nombre de déclarations de modèles de structures dans un fichier séparé que l'on incorpore par #include. 8
Structures données Accès aux membres des structures § L'opérateur de sélection de membre qui se note. (point) ou bien -> (flèche). personne p 1, p 2, *p 3, p 4[5]; . . . p 1. no_employe p 2. nom p 3 -> no_employe ou bien p 4[0]. no_employe (*p 3). no_employe 9
Structures données UTILISATION D'UNE STRUCTURE § Utilisation des champs d'une structure Le champ peut être manipulé comme n'importe quelle variable p 1. no_employe=12345; printf (“%d", p 1. no_employe); scanf(“%d”, & p 1. no_employe); p 3 -> no_employe=2345; p 4[0]. no_employe=5678; strcpy(p 1. prenom, ”Lili”); § Utilisation globale d'une structure personne x, y; x = y; L'affectation globale n'est pas possible entre tableaux. 10
Structures données INITIALISATION D'UNE STRUCTURE § Lors de sa déclaration. En utilisant constantes ou des expressions constantes struct personne p = {"Jean", "Dupond", 7845}; § Lors d’exécution du programme. struct personne p; printf(“Entrer le nom: ”); gets(p. nom); printf(“Entrer le prenom: ”); gets(p. prenom); printf(“Entrer le no_employe: ”); scanf(“%d”, &p. no_emploe); 11
Structures données IMBRICATION DE STRUCTURES § Chacun des champs d'une structure peut être d'un type absolument quelconque: pointeur, tableau, structure, . . . § Champ - tableau struct personne { char nom[30] ; char prenom [20] ; double heures [31] ; } employe ; employe. heures[4] désigne le cinquième élément du tableau heures de la structure employe. 12
Structures données IMBRICATION DE STRUCTURES § Chacun des champs d'une structure peut être d'un type absolument quelconque: pointeur, tableau, structure, . . . § Champ structure struct s_date { int jour; int mois; int an; }; struct personne { char nom[20]; int numero; struct s_date naissance; } p; p. nom désigne le nom p. naissance. mois désigne le mois 13
Structures données TABLEAUX DE SRUCTURES struct point { char nom ; int x ; int y ; }; struct point courbe[50]; un point d'un plan représente un ensemble de 50 points du type défini struct point § point est un nom de modèle de structure. § courbe représente effectivement un ''objet'' de type "tableau de 50 éléments du type point". § courbe[i]. nom représente le nom du point de rang i du tableau courbe. 14
Structures données Exemple § Faire un programme C de: 1) remplir une structure imbriquée personne avec les champs (nom, numéro, date de naissance) en utilisant la structure date (avec les champs: jour, mois, an); 2) afficher la structure remplie. Utiliser les fonctions: saisir la date; saisir la personne, afficher la personne. #include <stdio. h> struct s_date { int jour; int mois; int an; }; struct personne { char nom[20]; int numero; struct s_date naissance; }; 1/5 Les déclarations des modèles des structures 15
Structures données Exemple Les déclarations des fonctions void afficher( struct personne ); struct s_date Saisir. Date( void ); void Saisir. Personne( struct personne *f ); 2/5 /*------ programme principal -------*/ main() { struct personne p; Nom? Lili Saisir. Personne(&p); afficher(p); return 0; } Numero? 123 Jour? 9 Mois? 8 Annee? 1978 Affichage de la personne Nom: Lili Numero: 123 Date de naissance: 9/8/1978 16
Structures données Exemple La définition de la fonction d’affichage void afficher( struct personne f ) { 3/5 printf("Affichage de la personne"); printf("Nom : %sn", f. nom ); printf("Numero : %dn", f. numero); printf("Date de naissance : %d/%d/%dn", f. naissance. jour, f. naissance. mois, f. naissance. an ); } 17
Structures données Exemple struct s_date Saisir. Date( void ) { struct s_date; printf("Jour ? "); scanf("%d", &date. jour); printf("Mois ? "); scanf("%d", &date. mois); printf("Annee ? "); scanf("%d", &date. an); return date; } La définition de la fonction de saisie date 4/5 18
Structures données Exemple La définition de la fonction de saisie personne void Saisir. Personne( struct personne *f ) { 5/5 printf("Nom ? "); gets( f->nom ); printf("Numero ? "); scanf("%d", &f->numero); f->naissance = Saisir. Date(); } 19
Structures données TRANSMISSION D'UNE STRUCTURE EN ARGUMENT D'UNE FONCTION § Transmission de la valeur d'une structure #include <stdio. h> struct enreg { int a; avant appel fct : 1 12. 50 double b; dans fct : 0 1. 00 }; au retour dans main : 1 12. 50 void fct (struct enreg y); int main(void) { struct enreg x; x. a = 1; x. b = 12. 5; printf ("navant appel fct: %d %. 2 f", x. a, x. b); fct (x); printf ("n au retour dans main: %d %. 2 f", x. a, x. b); } void fct (struct enreg s) { s. a = 0; s. b=1; printf ("ndans fct: %d %. 2 f", s. a, s. b); } 20
Structures données TRANSMISSION D'UNE STRUCTURE EN ARGUMENT D'UNE FONCTION § Transmission de l'adresse d'une structure: l'opérateur -> #include <stdio. h> struct enreg { int a; float b; avant appel fct : 1 12. 50 }; dans fct : 0 1. 00 void fct (struct enreg *); au retour dans main : 0 1. 00 int main(void) { struct enreg x; x. a = 1; x. b = 12. 5; printf ("navant appel fct: %d %. 2 f", x. a, x. b); fct (&x); printf ("n au retour dans main : %d %. 2 f", x. a, x. b); retunr 0 ; } void fct (struct enreg * ads) { ads->a = 0; ads->b = 1; printf ("ndans fct: %d %. 2 f", ads->a, ads->b); } 21
Structures données TABLEAUX DE STRUCTURES - modèle 1 § Exemple - Faire un programme C de création d'un tableau d'éléments – étudiants (nombre maximale 20), de type structuré. Chaque structure est composée des champs suivants: a) nom - chaîne de caractères; b) note - nombre réel. Trier le tableau selon le champ note en ordre décroissant. Afficher le tableau créé et le tableau après le tri. 22
Structures données TABLEAUX DE STRUCTURES - modèle 1 nom note pointeur nom El. 1 note nom El. 2 note . . . nom note El. n 23
Structures données TABLEAUX DE STRUCTURES - modèle 1 § Exemple Le modèle de la structure #include <stdio. h> #include <string. h> #define MAX 20 struct etud { char nom[81]; float note; }; typedef struct etud STUD; int enter(STUD *ps); int print(STUD s); void sort(STUD *s, int n); Les prototypes des fonctions 24
Structures données TABLEAUX DE STRUCTURES - modèle 1 int main() { STUD fac[MAX]; int n, res, i, flag; do { printf("nombre: "); scanf("%d", &n); } while(n < 0 || n > MAX); printf ("n. Entrer les etudiantsn"); for (i=0, flag = 1; i<n && flag == 1; i++) { res = enter(&fac[i]); if(res == 0) flag = 0; } if(flag == 0) n = i; 25
Structures données TABLEAUX DE STRUCTURES - modèle 1 printf("n. Liste des etudiantsn"); printf("nom ttt noten"); for (i=0; i<n; i++) if(print (fac[i]) == 0) printf("problem d'affichage!n"); sort(fac, n); printf("n. Liste des etudiants apres le trin"); printf("nom ttt noten"); for (i=0; i<n; i++) if(print (fac[i]) == 0) printf("problem d'affichage!n"); } 26
Structures données TABLEAUX DE STRUCTURES - modèle 1 res: 0 (erreur en entrant les donnees) int enter(STUD *ps) res: 1 (entre les donnees sans erreur) { int res; if(ps == NULL) return 0; fflush(stdin); printf("nnom: "); if(gets(ps->nom) == NULL) return 0; // CTRL/Z if(ps->nom[0] == '