gef 243b programmation informatique appliquée structures §12.3
TRANSCRIPT
GEF 243BProgrammation informatique
appliquée
Structures
§12.3
JGA Beaulieu4/11/23 2
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 Beaulieu4/11/23 3
Synopsis
• Structures – Définition et déclarationÉtiquetéeType définit
• Structures – initialisation• Structures – accès au champs• Structures et pointeurs • Mémoire dynamique et structures
JGA Beaulieu4/11/23 4
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 Beaulieu4/11/23 5
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 Beaulieu4/11/23 6
Structures - Étiquetée
• Exemple:
struct ETUDIANT{
char prenom[15]; char surnom[25]; int numDeCollege; float moyenne;
};
JGA Beaulieu4/11/23 7
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 Beaulieu4/11/23 8
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 typeETUDIANT unEtudiantCMR;//déclaration
• C’est plus puissant et c’est la méthode préférée
JGA Beaulieu4/11/23 9
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 Beaulieu4/11/23 10
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 Beaulieu4/11/23 11
Exemple
• En utilisant la structure de type définit que vous avez fait TYPE_VEHICLE déclarez une variable avec:Manufacturier ChryslerModèle NewYorkerAnnée 1978PORTES 4Cylindres 8COULEUR ROUGETRANSMISSION AUTOMATIQUE
JGA Beaulieu4/11/23 12
Exemple
typedef enum {MANUELLE, AUTOMATIQUE} TRANSMISSION;
typedef enum {ROUGE, BLANC, JAUNE, VERT, BEIGE, GRIS, NOIR} COULEUR;
JGA Beaulieu4/11/23 13
Exemple
typedef struct{
char manufacturier[25];
char modele[25];
int annee;
int nombrePortes;
TRANSMISSION typeTrans;
COULEUR couleurAuto;
int nombreCylindres;
} AUTO;
JGA Beaulieu4/11/23 14
Exemple
AUTO monPremierChar ={
"CHRYSLER",
"NEWYORKER",
1978,
4,
AUTOMATIQUE,
ROUGE,
8
} AUTO;
JGA Beaulieu4/11/23 15
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 Beaulieu4/11/23 16
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 Beaulieu4/11/23 17
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 Beaulieu4/11/23 18
Pointer aux structures?
Point!
JGA Beaulieu4/11/23 19
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 Beaulieu4/11/23 20
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 Beaulieu4/11/23 21
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 Beaulieu4/11/23 22
Quiz Time
• 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);
JGA Beaulieu4/11/23 23
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?