GEF 243B Programmation informatique appliquée Structures §12.3
21-Jan-14 2 JGA Beaulieu Revue Quelle est la syntaxe pour la définition dun 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 sappèle JOURS?
21-Jan-14 3 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
21-Jan-14 4 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 lavons 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
21-Jan-14 5 JGA Beaulieu Structures Si je veux décrire un étudiant (mon abstraction dun étudiant) je pourrais ramasser linformation 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
21-Jan-14 6 JGA Beaulieu Structures - Étiquetée Exemple: struct ETUDIANT { char prenom[15]; char surnom[25]; int numDeCollege; float moyenne; };
21-Jan-14 7 JGA Beaulieu Structures Pour déclarer une variable pour cette structure, je fais principalement ce que jai 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;
21-Jan-14 8 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é struct chaque fois: typedef struct { char prenom[15]; char surnom[25]; int numDeCollege; float moyenne; } ETUDIANT; //nom du type ETUDIANT unEtudiantCMR;//déclaration Cest plus puissant et cest la méthode préférée
21-Jan-14 9 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
21-Jan 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
21-Jan JGA Beaulieu Exemple En utilisant la structure de type définit que vous avez fait TYPE_VEHICLE déclarez une variable avec: ManufacturierChrysler ModèleNewYorker Année1978 PORTES4 Cylindres8 COULEURROUGE TRANSMISSIONAUTOMATIQUE
21-Jan JGA Beaulieu Exemple typedef enum {MANUELLE, AUTOMATIQUE} TRANSMISSION; typedef enum {ROUGE, BLANC, JAUNE, VERT, BEIGE, GRIS, NOIR} COULEUR;
21-Jan JGA Beaulieu Exemple typedef struct { char manufacturier[25]; char modele[25]; int annee; int nombrePortes; TRANSMISSION typeTrans; COULEUR couleurAuto; int nombreCylindres; } AUTO;
21-Jan JGA Beaulieu Exemple AUTO monPremierChar = { "CHRYSLER", "NEWYORKER", 1978, 4, AUTOMATIQUE, ROUGE, 8 } AUTO;
21-Jan JGA Beaulieu Structures et champs Les structures sont construites avec des champs. Chaque place que vous pouvez vous servir dune variable, vous pouvez vous servir dun champ de structure Chaque champ peut être accédé individuellement avec lopérateur de membre de structure (.): strcpy(unEtudiantCMR.prenom, "Bob"); unEtudiantCMR.numeroDeCollege = 98876; Vous pourriez rencontrer cet étudiant un jour …
21-Jan 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 daffectation: 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");
21-Jan 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) < )); }
21-Jan JGA Beaulieu Pointer aux structures? Point!
21-Jan JGA Beaulieu Pointer aux structures Comme nimporte 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
21-Jan 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 davoir accès à un des champ en même temps; lopérateur de sélection de structure: pEtudiant->numeroDeCollege = 54321;
21-Jan JGA Beaulieu Allocation dynamique de la mémoire Vous pouvez allouer de la mémoire pour nimporte 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));
21-Jan JGA Beaulieu Quiz Time Quest-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);
21-Jan JGA Beaulieu 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?