Académique Documents
Professionnel Documents
Culture Documents
STRUCTURE DE DONNÉES
(SMA 4/ SMI 4)
19/04/2021 2
Chapitre 1
I. Introduction
II. Définitions et Terminologies
III. Classification des structures de données
IV. Les types complexes hétérogène en C
19/04/2021 3
I. Introduction
19/04/2021 4
I.1 Rappel: Notion de donnée
Question: Qu’est ce qu’une donnée?
En programmation une donnée possède (1) un nom,(2)
une valeur, et (3) un type.
Le nom permet d’identifier de manière unique la donnée
.
La valeur peut être modifiable (variable) ou constante.
Le type de données détermine la nature des données
qu'elle peut contenir et la manière dont elles sont
enregistrées et traitées par le programme. En
particulier le type permet d’identifier:
l’espace mémoire à allouer à la donnée, et
19/04/2021 5
I.1 Rappel: Notion de donnée
Exemple:
Dans un programme qui manipule des entiers, on
s’intéresse, non pas à la représentation des entiers en
mémoire, mais aux opérations définies sur les entiers :
Addition: +
Soustraction: -
Multiplication: * ,
Division: /
Modulo: %
19/04/2021 6
I.1 Rappel: Notion de type de données
Toute donnée manipulée par le langage C possède forcément un
type. On dit que le langage C est fortement typé.
Question: Quels sont les types de données du langage C que
vous avez étudié jusqu’à présent?
1. Caractère : un caractère n'est pas numériques par nature mais
bien sûr elles sont représentées de façon numérique dans la
mémoire.
En langage C, la correspondance entre caractère et valeur
numérique se fait à l’aide d’une table d’encodage ASCII qui
associe à chaque caractère une valeur entière.
19/04/2021 7
I.1 Rappel: Notion de type de données
La table ci-après contient tous les caractères imprimables
de la norme ASCII de base :
19/04/2021 8
I.1 Rappel: Notion de type de données
Demo 1: showAsciiCode()
19/04/2021 9
I.1 Rappel: Notion de type de données
2. Nombres entiers:
Le langage C définit 4 types entiers, différenciés par la
quantité d’espace mémoire utilisée pour représenter la
valeur numérique considérée :
short : 2 octets
19/04/2021 10
I.1 Rappel: Notion de type de données
De plus, 2 modificateurs peuvent être appliqués à ces quatre
types entiers:
unsigned : entiers naturels
Les modificateurs affectent l’intervalle des valeurs que l’on peut représenter
avec un type donné.
19/04/2021 11
I.1 Rappel: Notion de type de données
3. Nombres réels: des données pouvant avoir des chiffres après
la virgule.
Le langage C définit 3 variante du type réel: float, double, long double
Type Octets intervalle de définition
19/04/2021 12
I.1 Rappel: Notion de type de données
Demo 2:showDataSize()
19/04/2021 13
I.1 Rappel: Notion de type de données
4. Tableaux: Les tableaux sont une suite contigüe de
variables de même type, situées dans un espace contigu
en mémoire.
L’intérêt des tableaux est de permettre de désigner un
ensemble de valeurs à l’aide d’un seul identificateur.
un tableau est un type lui-même basé sur un autre type.
Si ce type est un tableau, on a un tableau de tableaux et
on parle de tableau multidimensionnel, sinon, on parle de
tableau unidimensionnel.
Exemple:
short tab [10]
3. La taille du tableau
1. Type des éléments 2. L’identificateur du
du tableau tableau
19/04/2021 14
I.1 Rappel: Notion de type de données
Attention de ne pas confondre la taille du tableau (nombre
d’éléments) avec l’espace qu’il occupe en mémoire.
Si le premier élément du tableau est stocké à partir de
l’adresse 𝑎, alors le deuxième sera stocké à partir de
l’adresse 𝑎 + 𝑠, le troisième à partir de l’adresse 𝑎 + 2𝑠, etc.
Pour un type de données occupant 𝑠 octets en mémoire, un
tableau de taille 𝑛 occupera 𝑛 × 𝑠 octets en mémoire.
Exemple: short tab [10]
Question: Quelle est la taille de l’espace occupé par le
tableau « tab »?
19/04/2021 15
I.2 Familles de types de données
On distingue deux grandes catégories de types de données:
Types de données
(1) (2)
Types Types
complexes homogène complexes hétérogène
19/04/2021 16
I.2 Familles de Types de données
Les types de données étudiés jusqu’à présent (Info 1 Info3)
sont des types de données de base, on les appels aussi types
primitifs ou bien types simples ( à l’exception des tableaux).
Définition: un type primitif est un type de données qui peut
contenir une et une seul information.
Exemple: int a;
Questions:
Comment peut-on représenter une donnée de type Matrice?
Comment peut-on représenter des données d’un objet
complexe tel qu’une voiture ou bien un étudiant?
19/04/2021 17
I.2 Familles de Types de données
Définition: Un type de donnée complexe appelé aussi
type composé correspond à une collection de plusieurs
éléments de type primitif ou complexe, et qui possèdent une
structure spécifique autorisant des traitements dédiés à leur
type. Un type complexe peut être soit homogène ou
hétérogène.
Définition: Un type complexe homogène est un type de
données décrivant une information composite, constituée de
plusieurs valeurs qui sont toutes elles-mêmes du même
type (qui peut être lui même simple ou complexe).
Exemples: les tableaux en langage C, C++, Java, …
int tab_entier[29];
float tab_reel[10];
19/04/2021 18
I.2 Familles de Types de données
Définition: Un type complexe hétérogène
est un type de données décrivant une
information composite, constituée de plusieurs
valeurs qui peuvent être elles-mêmes de types
différents (qui peuvent être eux-mêmes
simples ou complexes).
Exemples:
Les structures en langage C
Les classes en Java ( Langage Orienté Objet)
19/04/2021 19
II. Définitions et Terminologies
19/04/2021 20
II.1 Notion de structures de données
Définition: Une Structure de Données (SD), en anglais
Data Structure (DS), est une manière particulière de
stocker et d’organiser des données dans un ordinateur
(en mémoire) de façon à pouvoir être utilisées efficacement
(faciliter l’accès et la modification).
Une SD regroupe un ensemble:
de données à gérer,
d’opérations pouvant être appliquées à ces
données
19/04/2021 21
II.1 Notion de structures de données
Dans la plupart des cas, il existe:
plusieurs manières de représenter les données et
différents algorithmes de manipulation.
Question: Est-ce que la représentation des données
affecte le résultat final du programme?
Réponse: Une des tâches principales d’un
développeur informatique est de bien choisir les
structures de données efficaces et adaptées au
problème ciblé.
19/04/2021 22
II.2 Notion d’opérations
Définition: les opérations représentent les différentes
utilisations possibles de la SD.
On peut divisé les opérations en trois catégories:
1. les constructeurs (Constructor): ils permettent de
créer une nouvelle SD.
2. les modificateurs (setters) : ils permettent de modifier
les SD et leur contenu.
3. les accesseurs (getters): ils donnent des informations
sur l'état de la SD (valeurs, affichages, …)
19/04/2021 23
II.2 Notion d’opérations
A bien retenir:
On ne manipule une SD qu'avec les opérations qui lui
sont associées.
Exemple:
Dans un algorithme qui manipule des entiers:
on s’intéresse, non pas à la
représentation en mémoire des entiers,
mais aux opérations définies sur les
entiers : + ,- , * , /
19/04/2021 24
II.3 Spécification d’une SD
Définition: Une spécification ou norme technique
est un ensemble explicite d'exigences à satisfaire.
Une SD est spécifiée selon deux niveaux:
1. Une spécification abstraite ou un Type de
Données Abstrait (TDA) .
2. Une spécification opérationnelle.
19/04/2021 25
II.3.1 Spécification abstraite
Définition: Un Type de Données Abstraits (TDA)
ou spécification abstraite, Abstract
Data Type (ADT) en anglais, représente la
description des propriétés générales et des
opérations qui décrivent la SD.
Un TDA spécifie précisément :
1) la nature et les propriétés des données
2) les modalités d’utilisation des opérations
pouvant être effectuées
19/04/2021 26
II.3.1 Spécification abstraite
Un TDA évite d'imposer des contraintes
d'implantation.
Nous pouvons distinguer deux sortes de TDA:
1) TDA simples: qui correspondent aux types de base
avec disponibles dans la plupart des langages de
programmation (entier, réel, caractère…).
2) TDA complexes: TDA construits aux moyens de TDA
simples ou bien d’autres TDA complexes prédéfinis.
19/04/2021 27
II.3.1 Spécification abstraite
A la définition d'un TAD, il faut faire attention à:
la complétude : A-t-on donné un nombre suffisant
d'opérations pour décrire toutes les propriétés du TDA?
la consistance (non contradictoire) : N'y a-t-il pas des
compositions contradictoires ?
Comment bien définir les opérations d'un TAD ?
Choisir des identifiants significatifs
Bien préciser les conditions de bon fonctionnement (pré-
conditions) des opérations
19/04/2021 28
II.3.2 Spécification opérationnelle
Définition: La spécification opérationnelle correspond
à l’implémentation d’un TAD.
Dans cette phase opérationnelle ,
les TAD complexes sont implémentés par:
des structures appelée aussi des
enregistrements dans le cas des langages de
programmation procédurale (langage C, Ada, …)
classes dans le cas de Programmation Orientée
Objets (POO) tel ques Java et C++.
19/04/2021 29
II.3.2 Spécification opérationnelle
les opérations de TDA complexes par :
des fonctions dans le cas des langages de
programmation procédurale (langage C, Ada, …)
des méthodes si on utilise des langages de
Programmation Orienté Objet (POO).
19/04/2021 30
III. Classification des structures de
données
19/04/2021 31
III.1 Classification des SD
On peut classer les SD en deux grandes classes:
Les SD linéaires, qui permettent de relier des données
en séquence (on peut numéroter les éléments):
Exemples: Tableaux, listes, piles, …
19/04/2021 32
III.2 Quelle structure de données?
Toutes les structures de données ne permettent pas
les mêmes (1) opérations, et surtout elles n'ont pas
toujours le même (2) coût (complexité).
Principalement, le choix d'une telle structure doit tenir
compte de:
la place mémoire consommée par la structure.
la facilité et le coût (complexité) qu'elle offre pour
accéder a une certaine donnée.
19/04/2021 33
IV. Les types
complexes hétérogène en C
19/04/2021 34
IV.1 Introduction
En langage C, pour représenter un type de données
complexes hétérogène on utilise les enregistrements
ou on parle aussi de structures en C.
Définition: Une structure ou enregistrement en C est
un type de données décrivant une information
composite, constituée de plusieurs valeurs qui
peuvent être elles-mêmes de types différents (qui
peuvent être eux-mêmes simples ou complexes).
Contrairement aux variables stockées dans un tableau
(type complexe homogène), les variables d’une
structure peuvent être de types différents.
19/04/2021 35
IV.1 Introduction
Exemples:
Exemple1: un étudiant peut être décrit par:
Code APOGE
Nom,
Prénom
Adresse
L’adresse peut être aussi décrit par une structure.
Exemple 2: un point est une paire de coordonnées, un
rectangle est une paire de points, ...etc.
19/04/2021 36
IV.2 Définition des structures en C
Afin de définir un nouveau type de données de type
structure en C, le programmeur doit préciser deux choses:
1) le nom donné au structure (identificateur de la
structure);
2) les éléments de la structure, c'est a dire le nom et
types de données qu'il contient.
La syntaxe en C de définition d'une structure est le suivant:
struct identifie le début de la structure
Les accolades {} renferment la liste des
variables membres de la structure struct nom_structure{
type1 var1;
type2 var2;
...
};
19/04/2021 37
IV.2 Définition des structures en C
Il n’est pas obligatoire de donner un nom à la
structure : on parle alors de structure anonyme.
Définition: Une structure anonyme est une
structure à laquelle on n’a pas associé
d’identificateur.
struct {
int x;
int y;
};
19/04/2021 38
IV.2.1 Champs d’une structure
Les données nommées (donn1, donn2, …) sont appelées
membres ou champs de la structure.
Comme une donnée, un champ possède un (1) type, un (2)
identificateur, une (3) valeur et une (4) adresse.
Cependant, à la différence d’une donnée , un champ n’est
pas indépendant, car il appartient à un groupe de champs
qui forme sa structure.
struct nom_structure{
type1 donn1;
type2 donn2;
... Champs ou membres de la structure
};
19/04/2021 39
IV.2.2 Exemple
Un point d'un plan 2-D est caractérisé par ses coordonnées
x et y. Supposant que les coordonnées sont des entiers, la
structure décrivant un point est définie en C par:
struct point{
int x;
int y;
};
A bien retenir:
Le mot-clé « struct » peut être suivi d'un nom qu'on
souhaite attribuer à la structure. Dans ce cas, point.
le mot-clé struct fait partie intégrante du nom du type.
19/04/2021 40
IV.2.2 Exemple
A bien retenir (suite)
« struct point » constitue le nouveau type de données.
Ce nom sera utilisé par la suite pour se référer à la
structure (déclaration des variables de ce type).
Question: Quels sont les types autorisés dans un
champ donnée d’une structure en C?
19/04/2021 41
IV.2.2 Exemple
Réponse: On peut mettre n'importe quel type pour lequel
la taille est connue par le compilateur.
On ne peut pas mettre la structure elle-même
struct liste{
Erreur de compilation:
int valeur; le champ ``suivant'' a un
struct liste suivant; type incomplet
};
On peut mettre comme membre un pointeur sur la
structure elle-même puisque la taille d'un pointeur est
connue.
struct liste{
int valeur;
struct liste * suivant;
};
19/04/2021 42
IV.3 Déclaration des structures en C
Le langage C nous offre deux façons de déclarer les
variables de types structures:
1) La première consiste à faire suivre la définition
d’une liste de noms d’une seul ou de plusieurs
variables.
2) La seconde méthode consiste à déclarer les
variables de la structure dans une autre partie du
code du programme
struct point{
int x; /* une variable p de type « struct point »*/
int y; struct point p;
} p1, p2, p3 ;
19/04/2021 43
IV.3 Déclaration des structures en C
Exemple:
19/04/2021 44
IV.4 Initialisation des champs
Les champs peuvent être initialisées au moment de
la déclaration de la variable de type structure.
Les valeurs d'initialisation sont fournies entre
accolades { }
Exemple: struct point pt1 = {20,30};
x reçoit 20 et y reçoit 30.
A bien retenir:
L'affectation des initialisations suit l'ordre d'apparition des
champs dans la structure.
La Nième valeur est affectée au champ introduit a la
Nième position dans définition de la structure.
19/04/2021 45
IV.4 Initialisation des champs
En C, il est possible de réaliser les
trois opérations ( définition, struct point{
int x;
déclaration, et initiation) d’une int y;
structure en utilisant une seule } p1={3,7};
instruction:
1) Définition du nouveau type
« struct point »
2) Déclaration d’un variable p1
de type « struct point »
3) Initiation du champs « x » à
« 3 » et du champ « y » à 7
19/04/2021 46
IV.5 Accès aux champs
Pour faire référence à un membre particulier, on sépare le
nom de la structure concernée de celui du membre visé,
avec l ’opérateur (.)
Nom_de_variable_structure.champ
Le point (.) permet de connecter le champ (variable membre) à la
structure dont il fait partie.
Exemple: Modifier les valeurs des champs de pt1:
pt1.x = -2;
pt1.y = 0;
pt2.x = pt1.y;
pt2.y = 2*pt1.x;
19/04/2021 47
IV.5 Accès aux champs
Exemple:
#include <stdio.h>
#include <stdlib.h>
struct point{
int x;
int y;
};
int main(int argc, char *argv[]) {
19/04/2021 48
IV.5 Accès aux champs
Le principal avantage des structures sur les variables est la
possibilité de copier des informations entre structures de
même type par une seule instruction simple.
Dans le cas de notre exemple précédent, si on déclare deux
variables pt1 et pt2 de type « struct point », l’instruction :
pt2=pt1;
est équivalente aux deux instructions suivantes :
pt2.x = pt1.x;
pt2.y = pt1.y;
19/04/2021 49
IV.5 Accès aux champs
Question: Quelle est l'adresse du variable de type structure
« pt1 » ?
struct point pt1;
printf(" Adresse du champ x est: %x \n",&(pt1.x));
printf(" Adresse du champ y est: %x \n",&(pt1.y));
printf(" Adresse de la structure pt1 x est: %x \n",&(pt1));
19/04/2021 51