Vous êtes sur la page 1sur 36

Universit

Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

Langage C

KHALID SBAI
Enseignant Chercheur
Ecole Suprieure de Technologie
Dpartement de Gnie Electrique

kh.sbai@yahoo.fr
Universit Moulay Ismal
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Dfinition

Les structures
Type de donnes du langage C
Constitu de plusieurs lments, appels champs
ou membres.
Chaque membre a un nom.
Chaque membre peut tre de type diffrent.

Intrt
Rassembler des donnes htrognes caractrisant
une entit pour en faire un type utilisateur.
quivalence base de donnes :
Champ de la table /membre de la structure
Enregistrement / variable du type structure
Table / structure
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique

IV. STRUCTURE DE DONNES

23/02/2012

Une structure est un lment qui regroupe un ensemble fini de


variables de type diffrents et groupes sous le mme nom pour tre
traites comme une seule entit.
Chaque lment ou variable dune structure est appel membre (ou
champ). Chaque membre est identifi par un identificateur.

Dclaration de base du
modle formel de la structure
avec le mot cl struct et non la
variable.
est appel tiquette de la
structure. Ltiquette permet
didentifier un modle de
structure.

struct nom_structure
{
type1 nomchamps1;
type2 nomchamps2;
.
.
.
typeN nomchampsN;
};
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

IV. STRUCTURE DE DONNES


Exemple1
struct LIVRE
{
char titre[80];
char auteur[40];
char editeur[40];
char ISBN[10];
int nombre_pages;
int annee_edition;
double prix;
} un_livre;

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

Dclaration optionnelle
dun type

Dclaration optionnelle
dune variable
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique

IV. STRUCTURE DE DONNES


Signification

23/02/2012

Type livre: comporte plusieurs membres (sous variables)

De type diffrent.

Identifis par un nom.

Taille mmoire utilise


struct LIVRE livre1;
printf("%d\n", sizeof (livre1));

// Affiche 190
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique

IV. STRUCTURE DE DONNES

23/02/2012

Forme plus habituelle

struct LIVRE
{
char titre[80];
char auteur[40];
char editeur[40];
char ISBN[11];
int nombre_pages;
int annee edition;
double prix;
};

Dclaration du type structure

Rutilisation du type pour dclarer


des variables

struct LIVRE livre1, livre2;

Le mot struct doit tre rpt lors


de lutilisation du type
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Exemple1
struct pt
{
int x;
int y;
int z;
char nom;
};
main()
{

Exemple2
struct personne
{
char nom[20];
char prenom[20];
int no_employe;
};
struct personne p1, p2;

struct pt p;
}
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES

Dfinition dun type structure avec typedef: On peut crer le synonyme


dune structure en utilisant typedef. La syntaxe est la suivante :

Forme recommande
typedef struct
{
char titre[80];
char auteur[40];
char editeur[40];
char ISBN10[11];
int nombre_pages;
int annee edition;
double prix;
} LIVRE;

Ici, il sagit bien du


nom du type, et non
pas dune variable

Dclaration de variables avec le nouveau type cr

Syntaxe habituelle:

LIVRE livre1;
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Simplification de l'criture
struct pt
{
int x;
int y;
int z;
char nom;
};
typedef struct pt point;

Notations
quivalentes

typedef struct pt
{
int x;
int y;
int z;
char nom;
} point;

main()
{
point p;
}
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Oprations permises

Les seules oprations permises sur une structure sont:


1. La copie ou laffectation. Ce, en considrant la structure
dans son ensemble.
2. La rcupration de son adresse au moyen de
loprateur &.
3. Laccs ses membres.

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Accs aux donnes des membres dune structure
Chaque membre dune structure peut tre utilise comme
une variable isole du mme type. Pour faire rfrence un
membre particulier, on spare le nom de la structure
concerne de celui du membre vise, par loprateur (.).
struct LIVRE livre1;
livre1.titre = "Les misrables";
strcpy(livre1.titre, "Les misrables");
strcpy(livre1.auteur, "Victor Hugo");
strcpy(livre1.editeur, "Mason");
strcpy(livre1.ISBN, "2203011459");
livre1.nombre_pages = 64;
livre1.annee_edition = 1944;
livre1.prix = 22.30;

(non)

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

IV. STRUCTURE DE DONNES


Exemple

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

#include <math.h>
struct complexe
{
double reelle;
double imaginaire;
};
main()
{
struct complexe z;
double norme;
...
norme = sqrt(z.reelle * z.reelle + z.imaginaire * z.imaginaire);
printf("norme de (%f + j %f) = %f \n",z.reelle,z.imaginaire,norme);
}
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique

IV. STRUCTURE DE DONNES

23/02/2012

En C, on peut appliquer loperateur daffectation aux


structures (`a la diffrence des tableaux). Dans le contexte
prcdent, on peut crire :
main()
{
struct LIVRE livre1, livre2;

livre2=livre1;
}

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

IV. STRUCTURE DE DONNES

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

Tableaux de structures
Comme le mot clef struct dfinit un type alors il est
parfaitement possible de crer des tableaux stockant
des structures du mme type.
Exemple
struct eleve
{
int module1;
int module2;
};
struct eleve promotion[35];

La rcupration de la valeur dun


membre dun lment du tableau
devient:
promotion[25].module1=20;

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Structures comportant des tableaux

Une structure peut avoir des champs qui sont des


tableaux. Il est donc parfaitement possible de
mlanger ces deux types de structures de donnes.
Une telle structure pourrait tre de la forme :

struct eleve
{
char nom[50];
double notes[10];
};

Chaque variable de type lve


caractrise le nom dun lve
(tableau de caractre) et
lensemble de ses dix notes qui
sont stocks dans un tableau.

Laccs la 8me note dun lve dont la variable associe est


note par fich1 serait donc effectu par fich1.notes[7].
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Structure et pointeurs
Tout comme les types int, float ... vus auparavant on
peut manipuler des pointeurs sur des structures.
Accs aux champs dune variable
LIVRE livre1;
livre1.nombre_pages = 64;

Accs aux champs avec un pointeur


LIVRE livre1;
LIVRE * plivre;
plivre = &livre1;
plivre ->nombre_pages = 64;

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Structure comportant des structures
typedef struct
{
char nom[40];
char adresse[80];
} EDITEUR;
typedef struct
{
char titre[80];
char auteur[40];
EDITEUR editeur_livre;
char ISBN[11];
int nombre_pages;
int annee_edition;
double prix;
} LIVRE;

De la mme manire on peut


avoir un des membre qui est
lui-mme une structure.

int main()
{
LIVRE livre1;
...
strcpy(livre1.editeur_livre.nom,
"Mhfoud");
...
}
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Passage en paramtre de fonctions par adresse
void saisir_editeur(EDITEUR * pediteur)
Consquences:
{
printf("Nom de l'editeur:");
gets(pediteur->nom);
printf("Adresse:");
gets(pediteur->adresse);
}

Seule ladresse est


recopie, trs efficace.
La variable passe en
paramtres est modifiable
dans la fonction.

...
saisir_editeur(&livre1.editeur_livre);
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

IV. STRUCTURE DE DONNES


typedef struct
{
double x;
double y;
} Z;
void afficher_nb_complexe(Z c1)
{
printf("Z = %lf +j%lf ", c1.x, c1.y);
}
void saisir_nb_complexe (Z * c1)
{
printf("x:");
scanf("%lf", &c1->x);
printf("y:");
scanf("%lf" &c1->y);
}

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

Exemple dutilisation
les nombres complexes

Z somme_complexe(Z c1, Z c2)


{
Z resultat;
resultat.x = c1.x + c2.x;
resultat.y = c1.y + c2.y;
return resultat;
}

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Exemple dutilisation les nombres complexes
int main()
{
Z c1, c2, c3;
saisir_nb_complexe (&c1);
saisir_nb_complexe (&c2);
// Calculer et afficher la somme
c3 = somme_complexe (c1 c2);
printf("somme: ");
afficher_nb_complexe (c3);
printf("\n");
return 0;
}

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique

IV. STRUCTURE DE DONNES


#include<stdio.h>
/*dclaration des structures */
struct s_date
{
int jour ;
int mois ;
int an ;
}
struct s_fiche
{
char nom[20] ;
int numero ;
struct s_date naissance ;
}
void afficher(struct s_fiche f) ;
struct s_date SaisirDate(void) ;
void SaisirFiche(struct s_fiche *f) ;

23/02/2012

Allocation dynamique

main()
{
struct s_fiche *fiche ;
int nb_fiches ;
int i ;
printf(Combien de fiches ? ) ;
scanf(%d,&nb_fiches) ;
/* allocation */
fiche=(struct s_fiche*)
malloc(nb_fiches*sizeof(s_fiche)) ;
if (fiche==NULL)
{printf( erreur dallocation \n ) ; exit(1) ;
}

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

IV. STRUCTURE DE DONNES


/* saisie et affichage des fiches */
for(i=0 ;i<nb_fiches ;i++)
{
SaisirFiche(&fiche[i]) ;
Afficher(fiche[i]) ;
}
getch();
return 0;
}
/* dfinition des fonctions */
void Afficher(stuct s_fiche f)
{
printf( Nom : %s\n,f.nom) ;
printf( Numero : %d\n,f.numero)
;
printf( Naissance : %d / %d / %d
\n,f.jour,f.mois,f.an) ;
}

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

(suite)
struct s_date SaisirDate(void)
{ struct s_date date ;
printf( Jour ? ) ;
scanf(%d,&date.jour) ;
printf(\n Mois ? ) ;
scanf(%d,&date.mois) ;
printf(\n An ? ) ;
scanf(%d,&date.an) ;
printf(\n) ;
return date ;
}
void SaisirFiche(struct s_fiche *f)
{
printf(Nom ?) ;
gets(f->nom) ;
printf(Numero ?) ;
scanf(%d,&f->numero) ;
f->naissance=SaisirDate() ; }

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Structures et fichiers
#include <stdio.h>

fichier = fopen("article1.dat", "wb");

typedef struct
{
char code;
short taille;
double prix;
} article;

if (fichier != NULL)
{
fwrite(&article1, sizeof(article), 1, fichier);
if (fclose(fichier))
printf("Le fichier n'a pas t correctement crit");
}
else
printf("Erreur lors de l'ouverture du fichier.\n");

int main()
{
FILE * fichier;
article article1 =
{ 'A', 42, 25.50 };

printf("Pressez une touche...");


getch();
}
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


Structures et fichiers

Ecriture exemple typique avec un tableau


#include <stdio.h>
typedef struct
{
char code;
short taille;
double prix;
} article;
int main()
{
FILE * fichier;
article articles[3] =
{ { 'A', 42, 25.50 },
{ 'A', 43, 26.50 },
{ 'B', 40, 32.00 } };

fichier = fopen("articles.dat", "wb");


if (fichier != NULL)
{
fwrite(articles, sizeof(article), 3, fichier);
if (fclose(fichier))
printf("Le fichier n'a pas t correctement crit.\n");
}
else
printf("Erreur lors de l'ouverture du fichier.\n");
printf("Pressez une touche...");
getch();
}
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique

IV. STRUCTURE DE DONNES

23/02/2012

UNION
Dfinition :
Une union rassemble une collection de champs occupant
tous le mme emplacement mmoire. Une union est
comparable une structure sauf qu'elle permet de
dfinir plusieurs variables stockes au mme endroit en
mmoire.

Les unions permettent de stocker dans un espace


mmoire des variables de plusieurs types diffrents.

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique

IV. STRUCTURE DE DONNES


UNION
Dclaration:

23/02/2012

Le principe de dclaration de type union ou de dfinition est le


mme que pour les structures. Le mot rserv struct est remplac
par union

Dclaration du modle formel


de lunion avec le mot cl
union et non la variable.

est appel tiquette de la


lunion. Ltiquette permet
didentifier un modle de
union.

union nom_union
{
type1 nomchamps1;
type2 nomchamps2;
.
.
.
typeN nomchampsN;
};
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique

IV. STRUCTURE DE DONNES


UNION
Exemple
union zone
{
int a;
long b;
float x;

} z1,z2, essai;

23/02/2012

Le programme dfinit deux variables


z1 et z2 construites sur le modle
dune zone qui peut contenir soit un
entier, soit un entier long, soit un
nombre avec point dcimal, soit un
nombre avec point
dcimal long.

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


UNION
Mme syntaxe, mmes oprations, mmes remarques que
pour les structures.

La taille dune union est celle du plus long types de ces membres.

Lorsque lon dfinit une variable correspondant un type


union, le compilateur rserve lespace mmoire ncessaire
pour stocker le plus grand des champs appartenant lunion.

Dans notre exemple, le compilateur rserve lespace mmoire


ncessaire pour stocker un double pour chacune des variables z1
et z2.
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


UNION

Les champs dune union commencent tous la mme adresse.


Loccupation mmoire est donc dtermine par le plus
important des champs. Do : sizeof(union essai) retournera 8
octets.
Une union ne contient cependant quune donne la fois et
laccs un champ de lunion pour obtenir une valeur, doit
tre fait dans le type qui a t utilis pour stocker la valeur.

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


UNION
Exemple
union st_union
{
char a ;
char ch[16] ;
};
int main ()
{
union st_union t;
strcpy( t.ch , "bonjour" ) ;
t.a=B' ;
printf( "%s\n" , t.ch ) ; /* Bonjour */
return 0 ;
}

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


TYPES ENUMERES
Les numrations servent offrir des possibilits de
gestion de constantes numres dans le langage C.
Ces numrations permettent dexprimer des valeurs
constantes de type entier en associant ces valeurs
des noms.

Le type boolen en est un exemple car les seules valeurs


que peuvent prendre les variables de ce type sont vrai
et faux.

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique

IV. STRUCTURE DE DONNES

23/02/2012

TYPES ENUMERES
Dfinition
La dfinition dune numration respecte la syntaxe
donne dans lencart suivant.
enum nom_enum
{
numrateur1,
numrateur2,
numrateur3,
numrateur4,
...
numrateurN
} variables ;

Les diffrents numrateurs sont des


constantes symboliques.
Les valeurs associes aux numrateurs
sont, par dfaut, dfinies de la manire
suivante :
la premire constante est associe la
valeur 0, les constantes suivantes
suivent une progression de 1.

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


TYPES ENUMERES
Exemple
enum couleur
{ noir,
rouge = 1,
vert = 2,
bleu = 4,
jaune = rouge + vert,
cyan = vert + bleu,
magenta = rouge + bleu,
blanc = rouge + vert + bleu
};

/* type numration des couleurs */


/* 0 = absence de couleur */

/* couleurs fondamentales */
/* valeur 3 */
/* valeur 6 */
/* valeur 5 */
/* valeur 7 */

/* fonction d'impression, reoit une couleur et imprime sa valeur */


void imprime (enum couleur coul);

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique

IV. STRUCTURE DE DONNES

23/02/2012

TYPES ENUMERES
Exemple
main ()
{
enum couleur col;
col = noir;
printf ("%d ", col); imprime (col);
col += rouge;
printf ("%d ", col); imprime (col);
col += cyan;
printf ("%d ", col); imprime (col);
col -= bleu;
printf ("%d ", col); imprime (col);
}

Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

IV. STRUCTURE DE DONNES


TYPES ENUMERES
void imprime (enum couleur coul)
{
switch (coul)
{
case noir: puts ("noir");
break;
case rouge: puts ("rouge");
break;
case vert: puts ("vert");
break;
case bleu: puts ("bleu");
break;

case jaune: puts ("jaune");


break;
case cyan: puts ("cyan");
break;
case magenta:puts ("magenta");
break;
case blanc: puts ("blanc");
break;
}
}
Khalid SBAI Cours dinformatique

Universit
Moulay Ismal

Ecole suprieure de Technologie


Dpartement de Gnie Electrique
23/02/2012

FIN

Khalid SBAI Cours dinformatique