Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 1
18/02/2018 Khaled Hassine 1
Par :Khaled Hassine
CHAPITRE II – LESENREGISTREMENTS
18/02/2018 Khaled Hassine 2
Cas des tableaux et des pointeurs
Manipulation des enregistrements
Introduction
Enregistrement et fonction
PLAN
Déclaration des enregistrements
18/02/2018 Khaled Hassine 3
Cas des tableaux et des pointeurs
Manipulation des enregistrements
Introduction
Enregistrement et fonction
PLAN
Déclaration des enregistrements
18/02/2018 Khaled Hassine 4
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 2
Motivations
Le tableau : est la structure de données la plus connue est une structure homogène : tous les éléments sont de même type et codées de la
même façon sur le même nombre de bits occupe de la place successive dans la mémoire
Impossible de décrire des informations de type différents Dans certaines applications, ces types de données ne répondent pas à nos
besoins car nous voulons regrouper des données de différents type différents Exemple fiche d’un étudiant :
Nom : chaine de caractères Age : entier Sexe : typé énumératif (masculin ou féminin) Matricule : Entier CIN : …
18/02/2018 Khaled Hassine 5
Motivations …
Il est généralement utile de pouvoir rassembler des éléments de
type différents.
On parle alors d’enregistrement ou de structure.
L'avantage d'une structure est de regrouper des informationssémantiquement liées pour éviter de multiplier les variables
et bien faire apparaitre la logique du traitement : il est plus
simple de comprendre un programme qui manipule des dates
qu'un programme qui manipule trois variables (jours, mois,
année).
18/02/2018 Khaled Hassine 6
Définition d’un enregistrement
Une structure (ou enregistrement) est une collection deplusieurs variables (champs, rubriques) groupéesensemble.
Une structure permet de rassembler sous un même nomdes données de types différents (structure hétérogène).
Les champs d’une structure sont appelées membres etpeuvent être de n’importe quel type (entières, flottantes,tableaux, caractères, pointeurs, autres structures, …)
Exemple : fiche d'indentification d'une personne nom, prénom, âge, liste des diplômes, etc.
18/02/2018 Khaled Hassine 7
Définition …
Une structure est un moyen de regrouper desobjets (des variables), de même ou de différentstypes, au sein d’une entité repérée par un seulnom de variable.
Les variables contenues dans la structure sontappelées champs de la structure.
Pour une variable de type structure, le compilateurréserve une zone mémoire de taille la somme detous les champs de cette structure.
18/02/2018 Khaled Hassine 8
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 3
Cas des tableaux et des pointeurs
Manipulation des enregistrements
Introduction
Enregistrement et fonction
PLAN
Déclaration des enregistrements
18/02/2018 Khaled Hassine 9
Déclaration d’un enregistrement
Deux approches : Définir une variable de type enregistrement
Définir un type générique de l’enregistrement (unmodèle) puis définir la variable
La deuxième est l’approche la plus structurée;c’est l’approche recommandée
18/02/2018 Khaled Hassine 10
Déclaration d’un enregistrement commevariable
Déclaration de la variableId_Variable : Enregistrement (Structure)
type1 nom_de_champ_1;type2 nom_de_champ_2 ;
...typen nom_de_champ_n;
Fin Enregistrement
Structure hétérogène : les éléments peuvent être d’un typedifférent
Occupe des zones successives en mémoire
18/02/2018 Khaled Hassine 11
Déclaration d’un enregistrement à traversun type générique
Déclaration du Type enregistrement : Type_Enr = Enregistrement (Structure)
type1 nom_de_champ_1;type2 nom_de_champ_2;
...typen nom_de_champ_n;
Fin Enregistrement; Ceci définit le modèle de la structure mais ne réserve pas de variables
correspondant à cette structure.
Déclaration de la variable : Type_Enr Id_Variable
18/02/2018 Khaled Hassine 12
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 4
Initialisation des enregistrements
La valeur initiale de chaque champ ne peut êtreintroduite à l’intérieur de la définition du typegénérique de donnée et non une variable.
C’est seulement lors de la déclaration d’unevariable que l’on peut introduire des valeursinitiales pour les différents champs.
18/02/2018 Khaled Hassine 13
Exemple
Déclaration du type générique :t_date = Enregistrement
entier : anentier court : moisentier court : jour :
Fin Enregistrement; Déclaration d’une variable :
aujourdhui : t_date;
AffectationAvec aujourdhuifaire
jour 17;mois10;an 2006;
Fin faire
18/02/2018 Khaled Hassine 14
Enregistrement en mémoire
18/02/2018 Khaled Hassine 15
aujourdhui.an #4000
...
...
aujourdhui.an; #4002
...
aujourdhui.an;#4001
000007
11
#0
Occupe de la placesuccessivedans la mémoire
aujourdhui.an; #4003aujourdhui.mois; #4004aujourdhui.jour; #4005
D60A
Déclaration d’une structure en C
Syntaxe de la déclaration de la gabarie :
struct <Identificateur de la structure>
{ <Type 1> < Identificateur champ 1> ;
<Type 2> < Identificateur champ 2> ;
….<Type n> < Identificateur champ n> ;
} ;
Syntaxe de la déclaration de variable de type structure :
struct <id. de la structure> <identificateur de la variable> ;
18/02/2018 Khaled Hassine 16
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 5
Exemple d’une structure en C
Déclaration d’une structure complexe et d’une variable z de type
complexe :
struct complexe
{ float Partie_reelle ;
float Partie_imaginaire ;
} ;
struct complexe z ;
18/02/2018 Khaled Hassine 17
Portée du nom des champs
Deux structures différentes peuvent contenir desmembres de même nom sans qu’il y ait de conflit.
La portée du nom d'un membre est limité à la structuredans laquelle il est défini. On peut avoir des membreshomonymes dans des structures distinctes.
Pas de confusion dans les déclarations suivantes :
18/02/2018 Khaled Hassine 18
struct s1{ float x;
int y ;};
struct s2{ char x;
float y;};
Exemple 2 :
18/02/2018 Khaled Hassine 19
struct Date{int jour;int mois;int an;} hier, demain;
struct Date Début_vacances;struct Date semaine[7];
struct Date nouvel_an = { 1, 1, 2018 };
struct Date{int jour;int mois;int an;} hier, demain;
struct Date Début_vacances;struct Date semaine[7];
struct Date nouvel_an = { 1, 1, 2018 };
Déclaration desvariables avant ‘;’ .
Initialisation .
Identificateur de lastructure (type)
Type personnalisé des données
La déclaration typedef permet de définir ce que l'on nommeen langage C des types synonymes.
S'applique à tous les types et pas seulement aux structures. Syntaxe :
typedef <Ancien id de type> <nouveau id. de type> Exemple :
typedef int entier;signifie que entier est ''synonyme'' de int, de sorte que lesdéclarations suivantes sont équivalentes :int n, p ;entier n, p ;
18/02/2018 Khaled Hassine 20
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 6
Exemples : typedef
Le type vecteur est synonyme de tableau de 3entiers :
typedef int vecteur[3] ; v1,v2 deux tableaux de 3 entiers chacun :vecteur v1, v2 ;
Le nouveau type fpointeur est synonyme depointeur sur un réel
typedef float *fpointeur ; fa, fb sont deux pointeurs sur réel
fpointeur fa, fb ;
18/02/2018 Khaled Hassine 21
typedef et les structures
En faisant usage de typedef, les déclarations des structurespeuvent être réalisées comme suit:struct enreg{ int numero ; int qte ; double prix ;};typedef struct enreg s_enreg ;s_enreg art1, art2 ;
ou encore, plus simplement:typedef struct{ int numero ; int qte ; float prix ;} s_enreg ;s_enreg art1, art2 ;
18/02/2018 Khaled Hassine 22
Typedef : Exemple
Définition du type date :struct date {int jour ;int mois ;int année ;} ;typedef struct date DATE ;
La déclaration d’une variable de type DATEDATE d1 ;
est équivalent à struct date d1 ;
18/02/2018 Khaled Hassine 23
Structures imbriquées
Le type de chaque champs peut être lui-mêmeune structure.
typedef struct{ int jours ;
int mois ;int annee ;
} date ;
typedef struct{ int code ;
char nom[20] ;char prenom [20] ;date dtn ;
} etudiant ;
18/02/2018 Khaled Hassine 24
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 7
Structures imbriquées …
18/02/2018 Khaled Hassine 25
struct Livre{char titre[80];char auteur[80];float prix;};
struct Livre{char titre[80];char auteur[80];float prix;};
struct Date{int jour;int mois;int an;};
struct Date{int jour;int mois;int an;};
struct Membre{char nom[80];char adresse[200];int numero;float amende[10];struct Date creation;};
struct Membre{char nom[80];char adresse[200];int numero;float amende[10];struct Date creation;};
struct Pret{ struct Livre b;struct Date d;struct Membre *p;};
struct Pret{ struct Livre b;struct Date d;struct Membre *p;};
Structures dans des structures
18/02/2018 Khaled Hassine 26
struct Membre{char nom[80];char adresse[200];int numero;float amende[10];struct Date emprunt;struct Date creation;};
struct Membre{char nom[80];char adresse[200];int numero;float amende[10];struct Date emprunt;struct Date creation;}; struct Membre m = {
“Foulen",”rue de la …..",42,{ 0.0 },{ 0, 0, 0 },{ 5, 2, 2001 }};
struct Membre m = {“Foulen",”rue de la …..",42,{ 0.0 },{ 0, 0, 0 },{ 5, 2, 2001 }};
struct Date{int jour;int mois;int an;};
struct Date{int jour;int mois;int an;};
Cas des tableaux et des pointeurs
Manipulation des enregistrements
Introduction
Enregistrement et fonction
PLAN
Déclaration des enregistrements
18/02/2018 Khaled Hassine 27
Utilisation d'une structure
Deux manières d'utilisation d’une structure : individuellement sur chacun de ses champs, de manière "globale'' sur l'ensemble de la structure.
Exemple à adopter : Type enreg = Enregistrement
Entier : numero;Entier : qte;Réel : prix;
Fin Enregistrementenreg art1, art2, *art3 ;
18/02/2018 Khaled Hassine 28
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 8
Utilisation individuelle des champs d'unestructure
Chaque champ d'une structure peut être manipulé commen'importe quelle variable du type correspondant.
La désignation d'un champ se note en faisant suivre le nomde la variable structure de l'opérateur ''point'' (.) suivi dunom du champ tel qu'il a été défini dans le modèle (le nomdu modèle lui-même n'intervenant d'ailleurs pas).
La priorité de l'opérateur ''.'' est très élevée, de sortequ'aucune des expressions utilisant les champs d’unestructure ne nécessite des parenthèses.
18/02/2018 Khaled Hassine 29
Utilisation globale d'une structure
L'opérateur d'affectation et l'opérateur d'adresse & sontles seuls opérateurs s'appliquant à une structure (demanière globale) à une structure définie à partir dumême modèle.
Par exemple, on peut écrire :artl art2;art3 &art1;
L’affectation artl art2 remplace avantageusement :art1.numero art2.numero ;art1.qte art2.qte ;art1.prix art2.prix ;
18/02/2018 Khaled Hassine 30
Remarques
Une affectation globale n'est possible que si les structures ont étédéfinies avec le même nom de modèle; en particulier, elle estimpossible avec des variables ayant une structure analogue maisdéfinies sous deux noms différents.
Aucune comparaison n’est possible sur les structures. Pour saisir une variable structure, on doit saisir les champs membres
de cette structure. Une structure d’enregistrement peut être traitée globalement à
seulement deux occasions : l’opérateur & pour obtenir l’adresse d’une variable de type enregistrement, l’opérateur d’affectation pour copier le contenu d’une variable de type
enregistrement dans une autre.
18/02/2018 Khaled Hassine 31
Initialisation des structures en C
Les règles d'initialisation des structures sont les mêmes que tous lestypes de variables : En l'absence d'initialisation explicite, les structures de classe ''statique" sont, par
défaut, initialisées à zéro; celles possédant la classe "automatique'' ne sont pasinitialisées par défaut (elles contiendront donc des valeurs aléatoires).
Il est possible d'initialiser explicitement une structure lors de sa déclaration. On nepeut toutefois employer que des constantes ou des expressions constantes et celaaussi bien pour les structures statiques que pour les structures automatiques (alors que,pour les variables scalaires automatiques, il était possible d'employer une expressionquelconque)
Exemple d'initialisation de la structure artl:struct enreg art1 = { 100, 285, 2000 };
Il est possible d'omettre certaines valeurs.
18/02/2018 Khaled Hassine 32
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 9
Cas des tableaux et des pointeurs
Manipulation des enregistrements
Introduction
Enregistrement et fonction
PLAN
Déclaration des enregistrements
18/02/2018 Khaled Hassine 33
Contenu des structures
Chacun des champs d'une structure peut être untype absolument quelconque : pointeur,
tableau,
structure,
...
De même, un tableau peut être constituéd'éléments qui sont eux- mêmes des structures.
18/02/2018 Khaled Hassine 34
Structures comportant des tableaux
Soit le modèle de la structure suivante :
Personne = Enregistrement
Caractère nom[30] ;
Caractère prenom [20] ;
Réel heures [31] ;
Fin Enregistrement
Persone employe, courant ;
18/02/2018 Khaled Hassine 35
Structures comportant des tableaux
employe.heures[4] : désigne le cinquième élément du tableau heures de lastructure employe. Il s'agit d'un élément de type réel. Notez que, malgré lespriorités identiques des opérateurs . et [], leur utilisation de gauche à droiteévite l'emploi de parenthèses.
employe.nom[0] : représente le premier caractère du champ nom de lastructure employe.
&courant.heures[4] : représente l'adresse du cinquième élément du tableauheures de la structure courant. Notez que, la priorité de l'opérateur & étantinférieure à celle des deux autres, les parenthèses ne sont pas nécessaires.
courant.nom : représente le champ nom de la structure courant, c'est-à-direplus précisément l'adresse du tableau nom.
18/02/2018 Khaled Hassine 36
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 10
Remarque
L'affectation globale n'est pas possible entredeux tableaux. Elle l'est, par contre, entre deuxstructures.
Ainsi il est possible, en créant artificiellementune structure contenant un seul champ qui est untableau, de réaliser une affectation globale entretableaux.
18/02/2018 Khaled Hassine 37
Exemple de tableaux d’enregistrements
type chanson =Enregistrement
caracrère titre[100]Réel Prixt_date date
Fin;var chanson collection[10];
Trouver l’artiste d’une chanson donnée ‘titre’i ← 0;tant que (i<10) et (collection[i].titre ≠ “titre”)fairei ← i + 1;
fin tant queSi i = 10 alors Ecrire “enregistrement inexistant”
sinon ….
18/02/2018 Khaled Hassine 38
Tableaux des structures en C
Voyez ces déclarations :struct point { char nom ;
int x ;
int y ; };
struct point courbe[50];
La structure point représente un point d'un plan défini par son nom (caractère) et ses deuxcoordonnées.
courbe pourrait servir à représenter un ensemble de 50 points du type point.
point est un nom de modèle de structure, tandis que courbe représente effectivement un''objet "tableau de 50 éléments du type point".
courbe[10].nom représente le nom du point de rang 10 du tableau courbe. Il s'agit doncd'une valeur de type char.
La notation : courbe.nom[i] n’a pas de sens.
courbe[i].x représente la valeur du champ x de l’élément de rang i de courbe.
18/02/2018 Khaled Hassine 39
Tableau de structures en C : exemple denombre complexe
On peut déclarer un tableau de structure de lamême manière que de déclarer un tableau detype simple.
Exemple : struct complexe N[4] ;
Partie réelle Partie
imaginaire
Partie réelle Partie
imaginaire
Partie réelle Partie
imaginaire
Partie réelle Partie
imaginaire
N[0] N[1] N[2] N[3]
18/02/2018 Khaled Hassine 40
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 11
Exemple complet de tableaud’enregistrement en C
#include <stdio.h>struct Fiche_etudiant
{ char nom[25];char prenom[25];int age;char sexe;int matricule; };
struct Fiche_etudiant Ensemble_des_fiches[50];void main(){ int Nombre_de_fiches = 0;
char test;
18/02/2018 Khaled Hassine 41
Exemple complet de tableaud’enregistrement en C
for (Nombre_de_fiches = 0; Nombre_de_fiches < 50; Nombre_de_fiches++){ printf("\nVoulez-vous entrer les données de la %d fiche (O ou N) ? ",
Nombre_de_fiches);scanf(" %c", &test);if(test == 'N' || test == 'n') break;scanf("%s%s%i%c%i",
Ensemble_des_fiches[Nombre_de_fiches].nom,Ensemble_des_fiches[Nombre_de_fiches].prenom,&Ensemble_des_fiches[Nombre_de_fiches].age,&Ensemble_des_fiches[Nombre_de_fiches].sexe,&Ensemble_des_fiches[Nombre_de_fiches].matricule);
}
18/02/2018 Khaled Hassine 42
Exemple complet de tableaud’enregistrement en C
for (int i = 0; i < Nombre_de_fiches; i++){
printf("\n%s %s %d %c %d",Ensemble_des_fiches[i].nom,Ensemble_des_fiches[i].prenom,Ensemble_des_fiches[i].age,Ensemble_des_fiches[i].sexe,Ensemble_des_fiches[i].matricule);
}}
18/02/2018 Khaled Hassine 43
Structures et Pointeurs
On peut déclarer des pointeurs sur des structures. Elle estnotamment nécessaire lorsque la structure est unparamètre modifiable par une fonction.
Exemple :struct enreg *pe1 ; /*pointeur sur une structure enreg*/Si pe1 = &art1 alors (*pe1) et art1 sont équivalents.
Pour accéder à un membre (membre) d’unestructure (pointée par pt: En utilisant l’opérateur . : (*pt).membre Accès en utilisant l’opérateur spécial ->i : pt->membre
18/02/2018 Khaled Hassine 44
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 12
Exemple de pointeur surenregistrement en C
typedef struct {int no_compte ;char etat ;char nom[80];float solde;struct date dernier_versement;} cpt ;
cpt c1 , * pc;/*c1 est de type cpt, pc est un pointeur sur une variable detype cpt*/
18/02/2018 Khaled Hassine 45
Exemple de pointeur sur enregistrement enC
pc = &c1; *pc.no_compte = ... (*pc).no_compte = ... pc->no_compte = ...
18/02/2018 Khaled Hassine 46
Incorrect car . est plusprioritaire que *
Cas des tableaux et des pointeurs
Manipulation des enregistrements
Introduction
Enregistrement et fonction
PLAN
Déclaration des enregistrements
18/02/2018 Khaled Hassine 47
Passer des structures commeparamètres de fonction
Une structure peut être passée, comme touteautre variable, par valeur ou par adresse : Passer par valeur : simple copie des champs en
entrée.
Passer par adresse : toute modification est reproduitesur les champs.
18/02/2018 Khaled Hassine 48
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 13
Transmission d'une structure par adresse enargument d'une fonction
L'opérateur "." ne convient plus au sein du sous-programme car il supposecomme premier opérande un nom de structure et non une adresse.
Deux solutions possibles : adopter une notation telle que (*argument).champ ou pour désigner les champs
de la structure dont l’adresse est passée en paramètre. faire appel à l’opérateur -> , lequel permet d'accéder aux différents champs d'une
structure à partir de son adresse de début.
On préférera toujours le passage par référence, qui évite la duplication dela structure sur la pile (opération qui peut être couteuse, voire impossible sila structure occupe une taille mémoire importante).
18/02/2018 Khaled Hassine 49
Exemple de transmission d'une structure parvaleur en argument d'une fonction
typedef struct
{ int a;
double b;
} enreg;
void fct (enreg s)
{ s.a = 0; s.b=1;
printf ("\nDans la fonction : %d %6.3f", s.a, s.b);
}
void main (void)
{ enreg x ;x.a=1; x.b=12.5;
printf ("\nAvant l'appel\t : %d %6.3f",x.a,x.b);
fct (x);
printf ("\nApres l'appel\t : %d %6.3f", x.a, x.b);
}
18/02/2018 Khaled Hassine 50
Exemple de transmission d'une structurepar référence en argument d'une fonction
typedef struct{ int a;
double b;} enreg;void fct (enreg *s){ s->a = 0; s->b=1;
printf ("\nDans la fonction : %d %6.3f", s->a, s->b);}int main (void){ enreg x; x.a = 1; x.b = 12.5;
printf ("\nAvant l'appel\t : %d %6.3f",x.a,x.b);fct (&x);printf ("\nApres l'appel\t : %d %6.3f", x.a, x.b);
}
18/02/2018 Khaled Hassine 51
Structures et fonctions : exemple 1
float ajoute_au_compte(float solde1, float somme1) {solde1 = solde1+somme1;return (solde1);
}void main () {......cpt c1;c1.solde = 0.;ajoute_au_compte(c1.solde,1000.0);printf("%f\n",c1.solde); /*-> 0.000000*/c1.solde=ajoute_au_compte(c1.solde,1000.0);printf("%f\n",c1.solde); /* -> 1000.000000*/
18/02/2018 Khaled Hassine 52
Faculté des Sciences de GabesDépartement d’informatiqueCours ASD II
18/02/2018
LFSI 1 – LARI 1 14
Structures et fonctions : exemple 2
void ajoute_au_compte (float * solde1, float somme1) {*solde1 = *solde1+somme1;
}
void main () {......cpt c1;c1.solde = 0.;ajoute_au_compte(&(c1.solde),1000.0); /* ou &c1.solde */printf("%f\n",c1.solde); /*-> 1000.000000*/
18/02/2018 Khaled Hassine 53
Structures et fonctions : exemple 3 Un argument de fonction peut-
être de type structurefloat ajoute_au_compte(cpt c, floatsomme1){ return(c.solde+somme1);}void main (){ cpt c1;c1.solde = 0;ajoute_au_compte(c1,1000.0);printf("%f\n",c1.solde); /* 0*/
ou pointeur sur structurevoid ajoute_au_compte (cpt * c,float somme1){c->solde = c->solde + somme1;}void main (){ cpt c1;c1.solde = 0;ajoute_au_compte(&c1 ,1000.0);printf("%f\n",c1.solde); /*1000*/
18/02/2018 Khaled Hassine 54
Structures et fonctions : exemple 3
La valeur de retour d'une fonction peut être une structurecpt ajoute_au_compte(cpt c, float somme1){ cpt c2;
c2=c;c2.solde=c.solde+somme1;return(c2);
}void main (){ ......cpt c1;c1.solde = 0.;c1=ajoute_au_compte(c1,1000.0);printf("%f\n",c1.solde); /*1000.0*/
18/02/2018 Khaled Hassine 55
Application : nombres complexes
Ecrire les sous-programmes permettant de : saisir un nombre complexe z1.
afficher les parties réelle et imaginaire du nombrez1.
afficher les parties réelle et imaginaire du nombre z2image de z1 par symétrie centrale.
multiplier 2 nombres complexes z1, z2 passés enparamètres.
18/02/2018 Khaled Hassine 56