gef 243b programmation informatique appliquée structures §12.3

23
GEF 243B Programmation informatique appliquée Structures §12.3

Upload: corbin-berry

Post on 03-Apr-2015

108 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: GEF 243B Programmation informatique appliquée Structures §12.3

GEF 243BProgrammation informatique

appliquée

Structures

§12.3

Page 2: GEF 243B Programmation 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?

Page 3: GEF 243B Programmation informatique appliquée Structures §12.3

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

Page 4: GEF 243B Programmation informatique appliquée Structures §12.3

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

Page 5: GEF 243B Programmation informatique appliquée Structures §12.3

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

Page 6: GEF 243B Programmation informatique appliquée Structures §12.3

JGA Beaulieu4/11/23 6

Structures - Étiquetée

• Exemple:

struct ETUDIANT{

char prenom[15]; char surnom[25]; int numDeCollege; float moyenne;

};

Page 7: GEF 243B Programmation informatique appliquée Structures §12.3

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;

Page 8: GEF 243B Programmation informatique appliquée Structures §12.3

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

Page 9: GEF 243B Programmation informatique appliquée Structures §12.3

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

Page 10: GEF 243B Programmation informatique appliquée Structures §12.3

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

Page 11: GEF 243B Programmation informatique appliquée Structures §12.3

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

Page 12: GEF 243B Programmation informatique appliquée Structures §12.3

JGA Beaulieu4/11/23 12

Exemple

typedef enum {MANUELLE, AUTOMATIQUE} TRANSMISSION;

typedef enum {ROUGE, BLANC, JAUNE, VERT, BEIGE, GRIS, NOIR} COULEUR;

Page 13: GEF 243B Programmation informatique appliquée Structures §12.3

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;

Page 14: GEF 243B Programmation informatique appliquée Structures §12.3

JGA Beaulieu4/11/23 14

Exemple

AUTO monPremierChar ={

"CHRYSLER",

"NEWYORKER",

1978,

4,

AUTOMATIQUE,

ROUGE,

8

} AUTO;

Page 15: GEF 243B Programmation informatique appliquée Structures §12.3

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 …

Page 16: GEF 243B Programmation informatique appliquée Structures §12.3

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");

Page 17: GEF 243B Programmation informatique appliquée Structures §12.3

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));

}

Page 18: GEF 243B Programmation informatique appliquée Structures §12.3

JGA Beaulieu4/11/23 18

Pointer aux structures?

Point!

Page 19: GEF 243B Programmation informatique appliquée Structures §12.3

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

Page 20: GEF 243B Programmation informatique appliquée Structures §12.3

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;

Page 21: GEF 243B Programmation informatique appliquée Structures §12.3

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));

Page 22: GEF 243B Programmation informatique appliquée Structures §12.3

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);

Page 23: GEF 243B Programmation informatique appliquée Structures §12.3

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?