230 likes | 341 Views
GEF 243B Programmation informatique appliquée. Structures §12.3. Revue. Quelle est la syntaxe pour la définition d’un type ? Le type énuméré est bâti sur quel autre type? Quelle est la valeur de MER ? enum JOURS {DIM, LUN, MAR, MER, JEU, VEN, SAM};
E N D
GEF 243BProgrammation informatique appliquée Structures §12.3
Revue • Quelle est la syntaxe pour la définition d’un type? • Le type énuméré est bâti sur quel autre type? • Quelle est la valeur de MER? enum JOURS {DIM, LUN, MAR, MER, JEU, VEN, SAM}; • Comment est-ce que je changerais cette énumération pour en faire un type qui s’appèle JOURS? JGA Beaulieu
Synopsis • Structures – Définition et déclaration • Étiquetée • Type définit • Structures – initialisation • Structures – accès au champs • Structures et pointeurs • Mémoire dynamique et structures JGA Beaulieu
Structures • De nos jours les solutions informatiques demandent que nous soyons capables de définir des structures de données complexes • Comme nous l’avons appris dans les cours précédents, nous pourrions écrire des programmes complexes en utilisant seulement les types standards, mais les programmes seraient gigantesques et pas soutenables • Une structure est une collection d’éléments apparentés possiblement de différents types portant un seul nom • Chaque élément dans une structure est appelé un champ JGA Beaulieu
Structures • Si je veux décrire un étudiant (mon abstraction d’un étudiant) je pourrais ramasser l’information suivante:: • Prénom • Surnom • Numéro de collège • Moyenne • Nous voyons maintenant comment créer une structure et comment déclarer une variable pour entreposer cette information • Il y a trois façons de déclarer une structure en C • variable structure (très limité donc pas utilisé souvent) • structure étiquetée • structure de type définit JGA Beaulieu
Structures - Étiquetée • Exemple: struct ETUDIANT { char prenom[15]; char surnom[25]; int numDeCollege; float moyenne; }; JGA Beaulieu
Structures • Pour déclarer une variable pour cette structure, je fais principalement ce que j’ai fais pour les types énumérés: • Le nom réservé struct est répété de la même façon que enum l’était: struct ETUDIANT unEtudiantCMR; JGA Beaulieu
Définition de type structure • Et similairement aux types énumérés, je peux aussi typedef toutes structures pour ne pas avoir à taper le mot clé structchaque fois: typedef struct { char prenom[15]; char surnom[25]; int numDeCollege; float moyenne; } ETUDIANT; //nom du type ETUDIANT unEtudiantCMR;//déclaration • C’est plus puissant et c’est la méthode préférée JGA Beaulieu
Structure - initialisation • Les structures sont initialisées de façon semblable aux tableaux. Si nous prenons le type (typedef)ETUDIANT et la variable unEtudiantCMR de la diapo précédente: ETUDIANT unETUDIANTCMR = {"Ti-Joe", "Branch",45239,78.3}; Vous devez revenir pour rencontrer cet étudiant JGA Beaulieu
Exemple • Définissez une structure de type définit (typedef) qui inclut: • le manufacturier, • nom du modèle, • type de transmission, • nombre de portes (2,3,4 ou 5) • couleur, • année, • grosseur du moteur (# de cylindres) • Vous pouvez utiliser les typedef enum du dernier cours JGA Beaulieu
Exemple • En utilisant la structure de type définit que vous avez fait TYPE_VEHICLE déclarez une variable avec: • Manufacturier Chrysler • Modèle NewYorker • Année 1978 • PORTES 4 • Cylindres 8 • COULEUR ROUGE • TRANSMISSION AUTOMATIQUE JGA Beaulieu
Exemple typedef enum {MANUELLE, AUTOMATIQUE} TRANSMISSION; typedef enum {ROUGE, BLANC, JAUNE, VERT, BEIGE, GRIS, NOIR} COULEUR; JGA Beaulieu
Exemple typedef struct { char manufacturier[25]; char modele[25]; int annee; int nombrePortes; TRANSMISSION typeTrans; COULEUR couleurAuto; int nombreCylindres; } AUTO; JGA Beaulieu
Exemple AUTO monPremierChar = { "CHRYSLER", "NEWYORKER", 1978, 4, AUTOMATIQUE, ROUGE, 8 } AUTO; JGA Beaulieu
Structures et champs • Les structures sont construites avec des champs. Chaque place que vous pouvez vous servir d’une variable, vous pouvez vous servir d’un champ de structure • Chaque champ peut être accédé individuellement avec l’opérateur de membre de structure (.): strcpy(unEtudiantCMR.prenom, "Bob"); unEtudiantCMR.numeroDeCollege = 98876; Vous pourriez rencontrer cet étudiant un jour … JGA Beaulieu
Structures et champs • Les structures sont des entités qui peuvent être traités en entièreté, mais SEULEMENT pendant une opération d’affectation: ETUDIANT fEtudiant = {"Collete", "Stérole", 23498, 33.2}; //pauvre Collette! unEtudiantCMR = fEtudiant; • Vous ne pouvez pas comparer deux structures: if (unEtudiantCMR == fEtudiant) printf("Totalement une erreur"); JGA Beaulieu
Structures et champs • Pour que vous puissiez comparer deux structures du même type, vous devriez écrire une fonction qui compare chaque champ en ordre : … //fonction retourne 1 si tout les champs sont égales int CompareEtudiants(ETUDIANT et1, ETUDIANT et2) { return (!strcmp (et1.prenom,et2.prenom) && !strcmp (et1.surnom,et2.surnom) && et1.numeroDeCollege == et2.numeroDeCollege && (fabs(et1.moyenne - et2.moyenne) < 0.0001)); } JGA Beaulieu
Pointer aux structures? Point! JGA Beaulieu
Pointer aux structures • Comme n’importe quel type en C, les pointeurs peuvent être utilisés pour pointer aux structures. Le pointeur pointe au premier octet de la structure. • Vous pouvez aussi utiliser les pointeurs pour avoir accès aux champs de la structure: ETUDIANT* pEtudiant = &unEtudiantCMR; unEtudiantCMR.numeroDeCollege = 12345; (*pEtudiant).numeroDeCollege = 12345; • Résulte à la même chose; mais nous avons besoin des parenthèses autour de la déréférence à cause de la précédence des opérateurs JGA Beaulieu
Pointer aux structures • Par chance, C nous donne un autre opérateur qui nous permet de déréférencer le pointeur et d’avoir accès à un des champ en même temps; l’opérateur de sélection de structure: pEtudiant->numeroDeCollege = 54321; JGA Beaulieu
Allocation dynamique de la mémoire • Vous pouvez allouer de la mémoire pour n’importe quel type incluant des structures de type définit: typedef struct { char prenom[15]; char surnom[25]; } NOM; NOM* pNom = NULL; pNom = (NOM*)malloc (sizeof(NOM)); JGA Beaulieu
Quiz Time JGA Beaulieu • Qu’est-ce qui est imprimé avec ce code? int* pInt; ETUDIANT unEtudiant ={"Collete", "Stérole", 23498, 33.2}; ETUDIANT* pEtudiant = &unEtudiant; pInt = &unEtudiant.numDeCollege; printf("%s numéro d’étudiant est %d", (*pEtudiant).prenom, *pInt); printf("%s numéro d’étudiant est %d", pEtudiant->prenom, unEtudiant.numDeCollege);
Quiz Time • Si vous déclarez une variable qui est une définition de type structure quel opérateur est-ce que vous utilisez pour accéder les champs? • Si vous avez un pointeur à la structure, quel opérateur utilisez vous? • Pouvez vous affecter une structure à une autre au complet? • Comment est-ce que vous comparez les structures? JGA Beaulieu