3. OBJECTIFS DU COURS
Comprendre les notions d’algorithme, de structures de données
et de complexité :
Élaborer des algorithmes performants et efficaces
Acquérir la connaissance des structures de données séquentielles
(LLC, Files et Piles), hiérarchiques (arbres) et des algorithmes de
base sur les tris.
Maîtriser la récursivité (simple, multiple, mutuelle, imbriquée)
Comprendre la notion de complexité d’un algorithme
Savoir estimer la complexité d’un algorithme itératif ou récursif
3
4. CONTENU DU COURS
I. Rappels
II. Structures Séquentielles (Listes, Files, Piles)
III. Complexité des Algorithmes
IV. Récursivité
V. Structures Hiérarchiques (Arbres, ABR, AVL,
Tas)
VI. Algorithmes de Tri
VII. Ensembles
4
5. CHAPITRE I:
RAPPELS
Université Saad Dahlab – Blida 1
Faculté des Sciences
Département d’Informatique
Licence d’Informatique
Semestre 3 (2ème année)
Algorithmique & Structures de Données
Mme AROUSSI
2017-2018
Disponible sur https://sites.google.com/a/esi.dz/s-aroussi/
6. PLAN DU CHAPITRE I
Généralités sur l’Algorithmique
Algorithmique et Programmation
Qualités d’un Bon Algorithme
Langage Algorithmique utilisé
Tableaux
Langage C
Pointeurs 6
7. 7
Définition: Un algorithme est suite finie d’opérations
élémentaires constituant un schéma de calcul ou de résolution d’un
problème.
Historique : L’algorithmique est un terme d’origine arabe,
hommage à Al Khawarizmi (780-850) auteur d’un ouvrage décrivant
des méthodes de calculs algébriques.
GÉNÉRALITÉ SUR L’ALGORITHMIQUE
8. 8
GÉNÉRALITÉ SUR L’ALGORITHMIQUE
ÉTAPES DE CONCEPTION D’UN ALGORITHME
Analyse
Conception
Programmation
Test
Définition du problème en terme
de séquences d’opérations de
calcul, de stockage de données
Définition précise des données,
des traitements et de leur
séquencement
Traduction et réalisation de
l’algorithme dans un langage
précis
Vérification du bon
fonctionnement de l’algorithme
9. 9
Définition : Un programme est la traduction d’un algorithme
dans un langage de programmation.
ALGORITHMIQUE & PROGRAMMATION
Langage
de bas
niveau
Langage
de haut
niveau
Évolution
Binaire,
Assembleur
Procédural
(Pascal, C),
Logique (Prolog),
....
Orienté Objet
(C++, C#, Java),
....
10. 10
ALGORITHMIQUE & PROGRAMMATION
DÉMARCHE DE PROGRAMMATION
Énoncé du
problème
Analyse du
problème
Algorithme
Choisir un
langage de
programmation
Programmation
(traduction
l’algorithme en
programme)
Programme
(code source)
Compilation
(traduction du
code source en
code objet)
Traduction du code
objet en code
machine exécutable,
compréhensible par
l'ordinateur
Programme
binaire
exécutable
Exécution du
programme
Résultats
11. 11
QUALITÉ D’UN BON ALGORITHME
Correct: Il faut que le programme exécute correctement ses
tâches pour lesquelles il a été conçu.
Complet: Il faut que le programme considère tous les cas
possibles et donne un résultat dans chaque cas.
Efficace: Il faut que le programme exécute sa tâche avec
efficacité de telle sorte qu’il se déroule en un temps minimal et
qu’il consomme un minimum de ressources.
13. 13
SI expression logique ALORS
DSI
Bloc
FSI
SI expression logique ALORS
DSI
Bloc1
FSI
SINON
DSINON
Bloc2
FSINON
_
LANGAGE ALGORITHMIQUE UTILISÉ
LA CONDITIONNELLE ET L’ALTERNATIVE
14. 14
POUR var ALLANT DE vinit A vfinale PAS i FAIRE
DPOUR
Bloc
FPOUR
TANT QUE condition FAIRE
DTQ
Bloc
FTQ
REPETER
Bloc
JUSQU'A condition
LANGAGE ALGORITHMIQUE UTILISÉ
LES BOUCLES
15. Tout algorithme utilise des objets qui seront déclarés
dans son environnement.
A chaque objet, il faudra faire correspondre :
Un NOM qui permettra de le désigner et de le distinguer des autres
éléments,
Un TYPE qui indique la nature de l'ensemble dans lequel l'objet
prend ses valeurs,
Une VALEUR affectée à cet objet à un moment donné.
LANGAGE ALGORITHMIQUE UTILISÉ
LES OBJETS
15
16. ALGORITHME nom_algorithme
Déclarations des étiquettes
Déclarations des constantes
Déclarations des types
Déclarations des variables
Déclarations des sous-programmes (modules)
DEBUT
corps de l'algorithme
FIN 16
17. 17
Un type définit l'ensemble des valeurs que peut prendre un objet
qui y est défini ainsi que les opérations autorisées sur cet objet
LANGAGE ALGORITHMIQUE UTILISÉ
DÉCLARATION DE TYPES
Scalaire ( Entier, Booléen et
caractère)
Standard
Enuméré
Intervalle
Simple
TYPE
Structuré
Non Scalaire (Réel)
Non
Standard
Tableau
Enregistrement (structure)
Chaine de caractère
Ensemble
18. 18
Afin de gagner du temps et d’écrire des algorithmes plus courts
et plus structurés,
on regroupe un ou plusieurs blocs, qui réalisent un travail bien précis,
dans un MODULE, auquel on donne un nom
et que l’on peut ensuite « appeler »
chaque fois qu’on le désire, en faisant seulement référence à
son nom et sans avoir, bien entendu, à le reconstruire.
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ
Nom du Module
Type du module
(0 à n) entrées (0 à m) sorties
(résultats)
Rôle du module
19. 19
Un module est une entité qui va effectuer un traitement, à partir
de 0 à n objets en entrée, pour fournir 0 à n sorties (ou résultats). Il est
identifié par un nom, qui va nous permettre de le distinguer, de le
déclarer et de l’appeler. Il a aussi un type qui va dépendre du nombre
de sorties du module. S’il n’a qu’une seule sortie qui ne fait pas objet
des paramètres d’entrée, il est de type FONCTION sinon il est de
type PROCEDURE. Et finalement, un rôle qui doit résumer avec
précision ce que fait ce module.
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ
Nom
FONCTION
(0 à n)
entrées
une sortie
Rôle
Nom
PROCEDURE
(0 à n)
entrées
(0 à n)
sorties
Rôle
20. 20
Sur le plan syntaxique un module a le même schéma qu’un
algorithme avec une interface bien définie et un mécanisme qui assure
la communication entre les différents modules.
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ
FONCTION Nom_fonction (paramètres formel d’entrée) : type du résultat
DEBUT
manipulation des objets et modules déclarés
Retourner (résultat_de_la_fonction)
FIN
Déclarations des objets et Modules utilisés dans l’algorithme
21. 21
Sur le plan syntaxique un module a le même schéma qu’un
algorithme avec une interface bien définie et un mécanisme qui assure
la communication entre les différents modules.
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ
PROCEDURE Nom_procédure (paramètres formels d’entrée/sortie)(paramètres formels d’entrée/sortie)(paramètres formels d’entrée/sortie)(paramètres formels d’entrée/sortie)
DEBUT
manipulation des objets et modules déclarés
FIN
Déclarations des objets et Modules utilisés dans l’algorithme
22. 22
Le mécanisme de communication est synthétisé dans le schéma
suivant et il est totalement transparent pour l’utilisateur, car il lui
suffit de faire correctement ses déclarations.
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ
Quand l’appel à un module
est rencontré, l’exécution du
module appelant est suspendue
jusqu’à ce que le module appelé
soit totalement exécuté, puis
l’exécution du module appelant
repart immédiatement après
l’appel.
23. 23
Il existe deux façons pour passer les paramètres à un module:
1. Lorsqu’un paramètre est fourni à un module et que l’on
souhaite que le module nous restitue la même valeur que le
paramètre avait à l’entrée, on effectuera un passage par
valeur des paramètres.
Il est recommandé d'utiliser systématiquement un passage par
valeur pour les fonctions.
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ
24. 24
Il existe deux façons pour passer les paramètres à un module:
2. Mais lorsqu’un paramètre d’entrée est modifié lors de
l’exécution du module et c’est le contenu modifié du paramètre
que l’on souhaite avoir, on effectuera un passage par
variable (ou par référence). Dans ce cas le paramètre formel
doit être précédé du mot VAR.
Par contre, il faut utiliser un passage par variable pour tous les
paramètres de sortie d’un module. Et cela est évident car un
paramètre de sortie est évalué dans le module et c’est bien
entendu ce résultat que l’on souhaite avoir en sortie.
LANGAGE ALGORITHMIQUE UTILISÉ
MODULARITÉ
25. 25
Exercice : Soit P un polynôme de degré 2 qui s’écrit de la
forme suivante P(X) = a X2 +b X + c. Ecrire un programme
qui permet de
Lire les coefficients du polynôme
Evaluer le polynôme en un point x qui sera lu
Résoudre l’équation P(x) = 0 et afficher les résultats,
LANGAGE ALGORITHMIQUE UTILISÉ
EXERCICE
26. PLAN DU CHAPITRE I
Généralités sur l’Algorithmique
Algorithmique et Programmation
Qualités d’un Bon Algorithme
Langage Algorithmique utilisé
Tableaux
Langage C
Pointeurs 26
27. C’est un objet décomposé en plusieurs éléments de même
type et dont chacun de ces éléments est repéré par un
indice (ou index).
Le nombre d'éléments du tableau constitue sa taille.
Le nombre d’indices qui permet de désigner un élément particulier
est appelée dimension du tableau.
Le type de l’indice est souvent intervalle [0 .. Taille-1].
TABLEAUX
NOTIONS DE BASE
27
7 5 6 3 2 1 1 4
éléments
0 1 2 3 4 5 6 7 Indices
28. La déclaration d’un tableau se fait en précisant le mot
TABLEAU, suivi de sa taille entre crochets et du type des
éléments.
Type Type_tableau = TABLEAU [taille] DE type_des_éléments, et
Nom_du_tableau : Type_Tableau, ou
Nom_du_tableau : TABLEAU [taille] DE type_des_éléments
L’accès à un élément du tableau s’effectue en précisant le nom du
tableau suivi de la valeur de l’indice entre crochets, e.g: Tab[1].
L'accès à un élément du Tableau peut être direct ou séquentiel.
TABLEAUX
NOTIONS DE BASE
28
29. On distingue généralement deux classes d’algorithmes:
Les algorithmes de parcours en vu de réaliser un traitement
donné
Les algorithmes de parcours en vu de rechercher une valeur
donnée.
Parmi les algorithmes traitant les tableaux à une
dimension:
Rechercher une valeur dans un tableau
si tableau ordonné alors recherche dichotomique
si tableau non ordonné alors recherche séquentielle
TABLEAUX
ALGORITHMES
29
30. Parmi les algorithmes traitant les tableaux à une
dimension:
La recherche d’une valeur
L’insertion d’une valeur
La suppression (logique ou physique) d’une valeur
Le remplacement d’une valeur par une autre (la modification)
L’interclassement de deux tableaux ordonnés.
L’union et l’intersection de deux tableaux.
Le tri d’un tableau: tri par sélection, tri par Bulles, tri par
insertion, tri par fusion, tri rapide, …..
TABLEAUX
ALGORITHMES
30
31. Un tableau multidimensionnel est considéré comme étant un
tableau dont les éléments sont eux mêmes des tableaux.
Il se définit de la manière suivante :
Type Type_tableau = TABLEAU [N1, N2, ....., Nd] DE
type_des_éléments, et Nom_du_tableau : Type_Tableau,
ou
Nom_du_tableau: TABLEAU [N1, N2, ....., Nd] DE
type_des_éléments
d est la dimension du tableau et Ni désigne le nombre d’éléments
dans chaque dimension.
Le nombre de dimensions n'est pas limité .
TABLEAUX MULTIDIMENSIONNELS
31
32. L'accès à un élément du tableau se fera par l'expression
Nom_du_tableau[i1][i2] …[id] ou
Nom_du_tableau[i1, i2, …, id] .
Exemple: un tableau d'entiers positifs à deux dimensions
(3 lignes, 4 colonnes) se définira avec la syntaxe suivante :
Tab : tableau[0..2, 0..3] d’entier
Le rangement en mémoire centrale du tableau se fait ligne par ligne.
TABLEAUX MULTIDIMENSIONNELS
32
Représentation du tableau
Tab[0,0] Tab[0,1] Tab[0,2] Tab[0,3]
Tab[1,0] Tab[1,1] Tab[1,2] Tab[1,3]
Tab[2,0] Tab[2,1] Tab[2,2] Tab[2,3]
33. PLAN DU CHAPITRE I
Généralités sur l’Algorithmique
Algorithmique et Programmation
Qualités d’un Bon Algorithme
Langage Algorithmique utilisé
Tableaux
Langage C
Pointeurs 33
34. Le langage C est né au début des années 1970 dans les
laboratoires AT&T aux Etats-Unis dans le but d’améliorer le
langage existant « B ».
C’est un langage de bas niveau dans le sens où il permet
l’accès aux données (bits, octets, adresses) que manipulent les
machines et qui ne sont pas souvent disponibles à partir de
langages évolués tels que Fortran, Pascal ou ADA
Il a été conçu pour l’écriture de systèmes d’exploitation et du
logiciel de base; Plus de 90% du noyau du système UNIX est
écrit en langage C.
LANGAGE C
PRÉSENTATION
34
35. Sa popularité : Il possède une communauté très importante
et de nombreux tutoriels et documentations. De plus, il existe
beaucoup de programmes et de bibliothèques développés en C.
Sa rapidité : ce qui en fait un langage de choix pour tout
programme où le temps de réponse (exécution) est crucial.
Sa légèreté : ce qui le rend utile pour les programmes
embarqués où la mémoire disponible est faible.
Sa portabilité : un programme développé en C marche
théoriquement sur n’importe quelle plateforme (Windows,
Linus, Unix, Mac, …)
LANGAGE C
POURQUOI L’APPRENDRE?
35
36. C est un langage qui possède des règles. Ces règles ont été
définies par des informaticiens professionnels et sont toutes
regroupées dans ce que l’on appelle la norme du langage.
Cette norme sert de référence à tous les programmeurs.
Il existe plusieurs normes : l’ANSI en 1989 (C89 ), l’ISO en
1990 (C90), le C99 et le C11.
Dans ce cours, nous allons nous servir de la norme utilisé C89
(http://flash-gordon.me.uk/ansi.c.txt).
En effet, même si c’est la plus ancienne et qu’elle semble restrictive à
certains, elle permet néanmoins de développer avec n’importe quel
compilateur sans problème, contrairement aux normes C99 et C11.
De plus, il est très facile ensuite de passer aux normes plus récentes.
LANGAGE C
NORME
36
37. Le strict minimum pour programmer en C se résume en
trois points:
Un éditeur de texte: pour écrire le code source.
Un compilateur: pour transformer le code en un fichier
exécutable compréhensible par le processeur.
Un débogueur: fondamentalement, il n’est pas indispensable,
mais il est très utile pour chasser les bugs et vérifier le
comportement de son programme.
LANGAGE C
OUTILS
37
38. Il existe deux moyens de récupérer tous ces logiciels :
On les prend séparément, et dans ce cas il faut compiler par
soi-même via l’invite de commande,
On utilise un environnement ou logiciel qui intègre les trois
logiciels: un Environnement de Développement Intégré (EDI)
ou Integrated Development Environment (IDE).
De nombreux IDE sont disponibles pour Windows:
Code::Blocks, Dev-C++, Visual C++,.....
Dans les TPs, nous allons nous servir du Code::Blocks
(http://www.codeblocks.org/downloads/binaries)
LANGAGE C
OUTILS
38
39. 39
LANGAGE C (STRUCTURE)
Langage algorithmique Langage CProgrammeprincipale
Algorithme Principal
Déclarations
Début
…actions…
Fin
// directives
// déclaration des variables globales
// prototype des fonctions
int main ()
{
// déclarations des variables locales
// instructions
return 0 ;
}
Fonction
Fonction id (décl. param.) : type
Déclarations
Début
…actions…
retourner expr
Fin
type id (décl.param.)
{
// déclarations
// instructions
return expr ;
}
Procédure
Procédure id (décl. param.)
Déclarations
Début
…actions…
Fin
void id (décl. param.)
{
// déclarations
// instructions
}
40. 40
LANGAGE C
TYPE DE DONNÉES
Type de données Signification Nbr
Octets
Plage de valeurs acceptées
char Caractère 1 - 128 à 127
unsigned char Caractère non signé 1 0 à 255
short int Entier court 2 -32 768 à 32 767
unsigned short int Entier court non signé 2 0 à 65 535
int Entier 2
4
-32 768 à 32 767
-2 147 483 648 à 2 147 483 647
unsigned int Entier non signé 2
4
0 à 65 535
0 à 4 294 967 295
long int Entier long 4 -2 147 483 648 à 2 147 483 647
unsigned long int Entier long non signé 4 0 à 4 294 967 295
float Flottant ou réel 4 3,4 x 10−38 à 3,4 x 1038 env.
double Flottant double 8 1,7 x10 −308 à 1,7 x10 308 env.
long double Flottant double long 10 3, 4 x10−4932 à 3, 4 x104932 env.
41. 41
LANGAGE C (DÉCLARATION)
Déclaration Langage Algorithmique Langage C
Variable var id : type type id ;
Constante Const ID : type ←expr #define ID (expr)
const type ID = expr;
Tableau statique T: tableau [N] de type type T [N] ;
Chaine de caractères Ch: chaine [M] Char ch[M];
Pointeur Ptr: *type type* ptr;
Enregistrement structure id
déclaration des champs
finStructure
struct id {
déclaration des champs
} ;
43. 43
LANGAGE C
STRUCTURES DE CONTRÔLE CONDITIONNELLES
Langage algorithmique Langage C
Si condition alors
Dsi … Fsi
if (condition)
{ … ; }
Si condition alors
Dsi … Fsi
Sinon
Dsinon … Fsinon
if (condition)
{ … ; }
else
{ … ; }
Selon expr
cas val1 : …
.
.
cas valN : …
cas sinon : …
finSelon
switch (expr)
{
case val1 : … ; break ;
.
.
case valN : … ; break ;
default : …;
}
44. 44
LANGAGE C
STRUCTURES DE CONTRÔLE ITÉRATIVES
Langage algorithmique Langage C
Pour i ← x a y pas de n faire
DPour
…actions..
Fpour
for(v=x ;v<=y ;v=v+n)
{
…actions…..;
}
Tantque condition
DTQ
…actions…
FTQ
while (condition)
{
…instructions… ;
}
repeter
…actions…
Jusqu’à condition
do
{
…instructions… ;
} while (non condition);
45. 45
LANGAGE C
L’OPÉRATEUR SIZEOF
L’opérateur sizeof permet de calculer la taille
correspondant à un type.
sizeof (descripteur-de-type) représente la taille
(exprimée en octet) qu’occuperait en mémoire un objet
possédant le type indiqué
sizeof exp représente la taille qu’occuperait en
mémoire un objet possédant le même type que exp.
sizeof t ou sizeof t[0] où t est un tableau de taille n.
Cette formule exprime le nombre d’octets (n * sizeof(t)
) qu’occuperait le tableau.
46. 46
LANGAGE C
FONCTIONS D’ENTRÉES-SORTIES
L’entête <stdio.h> (abréviation de standard in-out) fournit
trois flux que l’on peut utiliser directement :
stdin, l’entrée standard qui envoie au programme les données
issues du clavier, e.g:
scanf (format, &var1, &var2,..., &varn)
stdout, la sortie standard qui envoie les données que le
programme génère à l’écran, e.g.
printf (format, exp1, exp2, ... expn)
stderr, la sortie standard des erreurs qui seront affichées sur
l’écran.
47. LANGAGE C
FONCTIONS D’ENTRÉES-SORTIES
47
Déclaration lecture écriture format externe
int i; scanf("%d",&i); printf("%d",i); décimal
int i; scanf("%o",&i); printf("%o",i); octal
int i; scanf("%x",&i); printf("%x",i); hexadécimal
unsigned int i; scanf("%u",&i); printf("%u",i); décimal
short j; scanf("%hd",&j); printf("%d",j); décimal
short j; scanf("%ho",&j); printf("%o",j); octal
short j; scanf("%hx",&j); printf("%x",j); hexadécimal
unsigned short j; scanf("%hu",&j); printf("%u",j); décimal
long k; scanf("%ld",&k); printf("%d",k); décimal
long k; scanf("%lo",&k); printf("%o",k); octal
long k; scanf("%lx",&k); printf("%x",k); hexadécimal
unsigned long k; scanf("%lu",&k); printf("%u",k); décimal
48. LANGAGE C
FONCTIONS D’ENTRÉES-SORTIES
48
Déclaration lecture écriture format externe
float l; scanf("%f",&l); printf("%f",l); point décimal
float l; scanf("%e",&l); printf("%e",l); exponentielle
float l; printf("%g",l); la plus courte des deux
double m; scanf("%lf",&m); printf("%f",m); point décimal
double m; scanf("%le"&m); printf("%e",m); exponentielle
double m; printf("%g",m); la plus courte
long double n; scanf("%Lf"&n); printf("%Lf",n); point décimal
long double n; scanf("%Le"&n); printf("%Le",n); exponentielle
long double n; printf("%Lg",n); la plus courte
char o; scanf("%c",&o); printf("%c",o); caractère
char p[10];
scanf("%s",p); printf("%s",p);
chaîne de caractères
scanf("%s",&p[0]);
49. PLAN DU CHAPITRE I
Généralités sur l’Algorithmique
Algorithmique et Programmation
Qualités d’un Bon Algorithme
Langage Algorithmique utilisé
Tableaux
Langage C
Pointeurs 49
50. Une variable est destinée à contenir une valeur du type
avec lequel elle est déclarée. Physiquement, cette valeur se
situe en mémoire.
Exemple:
x: entier;
x ←10;
POINTEURS
VERSUS VARIABLES
50
51. Un pointeur est une variable destinée à contenir une adresse
mémoire, c.-à-d. une valeur identifiant un emplacement en mémoire.
Pour différencier un pointeur d'une variable ordinaire, on fait
précéder son nom de l’opérateur unaire d’indirection « * » lors de sa
déclaration.
Tout pointeur est associé à un type d’objet. Ce type est celui des
objets qui sont manipulables grâce au pointeur.
Les opérations les plus simples sur un pointeur sont les suivantes :
affectation d’une adresse au pointeur ;
utilisation du pointeur pour accéder à l’objet dont il contient
l’adresse.
POINTEURS
DÉFINITIONS ET OPÉRATIONS
51
52. Exemple:
x: entier; x ←10; px: * entier;
px ← &x; // affectation d’une adresse au pointeur ;
*px ← 20
POINTEURS
DÉFINITIONS ET OPÉRATIONS
52
20
53. La déclaration de variables réserve de l'espace en
mémoire pour ces variables pour toute la durée de vie du
programme c’est ce qu’on appelle l’allocation statique.
Elle impose par ailleurs de connaître avant le début de
l'exécution l'espace nécessaire au stockage de ces
variables, en particulier la dimension des tableaux.
Or dans de nombreuses applications, le nombre
d'éléments d'un tableau peut varier d'une exécution du
programme à l'autre d’où l’allocation dynamique.
POINTEURS
ALLOCATION DYNAMIQUE DU MÉMOIRE
53
54. Pour ce faire, on utilise des pointeurs.
Quand on fait une allocation dynamique de mémoire, on
obtient en retour un pointeur sur la zone mémoire allouée.
POINTEURS
ALLOCATION DYNAMIQUE DU MÉMOIRE
54
Algorithmique Langage C Rôle
ptr: *type
TAB Nil
type * ptr = NULL; Déclare un pointeur
ptr←(*type)
allouer()
ptr =(type *)
malloc(sizeof(type));
Retourner un pointeur pointant
vers un objet de type type.
liberer(ptr) free(ptr); Libérer l’espace mémoire alloué
à un pointeur « ptr ».
Les fonctions de langage C sont disponibles dans la bibliothèque <stdlib.h>
55. Par défaut, le tableau est de grandeur statique, i.e. qu’il
est impossible de les changer de taille après la
compilation.
Il est cependant possible de changer la taille après la
compilation. C’est ce qu’on appelle les tableaux
dynamiques.
Pour faire des tableaux dynamiques, il faut réserver un
espace mémoire d’une taille donnée puis d’assigner un
pointeur à cet espace mémoire.
POINTEURS
& LES TABLEAUX
55
56. POINTEURS
& LES TABLEAUX
56
Algorithmique Langage C Rôle
TAB: *type
TAB Nil
type * TAB =
NULL;
Déclarer un tableau
TAB←(*type)
allouerTab(N)
TAB =(type *)
malloc(N*
sizeof(type))
Allouer une plage mémoire à un
tableau de N éléments de type «
type»,
TAB = (type *)
calloc(N,
sizeof(type));
Allouer une plage mémoire à un
tableau de N éléments de type «
type » dont les valeurs sont
initialisées à zéro
liberer(TAB) free(TAB); Libérer l’espace mémoire alloué
à un pointeur « ptr ».
Ces fonctions sont disponibles dans la bibliothèque <stdlib.h>
57. Une autre utilité des pointeurs dans le langage C est de
permettre le passage par variable des paramètres dans
les procédures
Exemple:
POINTEURS
& LE PASSAGE PAR VARIABLE
57
Algorithmique Langage C
Procedure permuter (Var x, y: entier)
Var
Tmp; entier;
Debut
Tmp ← x;
x ← y;
y ← tmp;
Fin
void permuter(int *ptrx, *ptry)
{
int Tmp;
Tmp = *ptrx;
*ptrx = *ptry;
*ptry = tmp;
}
Appel:
x 5; y 80; permuter (x, y)
Appel: x=5; y=80; permuter (&x, &y)
58. On a souvent de modèles de structure dont un des
membres est un pointeur vers une structure de même
modèle. On parle de l’autoréférence
Cette représentation permet de construire des listes
chaînées et des arbres.
POINTEURS
& AUTORÉFÉRENCE
58
Algorithmique Langage C
Listes
chainées
maillon: structure {
val: entier;
suiv: * maillon;
};
struct maillon {
char nom[30];
struct maillon *suiv;
};
59. SOURCES DE CE COURS
59
N. EL-ALLIA , Cours d’Algorithmique et Structures de données
dynamiques, Ecole nationale Supérieure d’Informatique (ESI), 2010.
Djamel Eddine ZEGOUR, Cours de Structures de Données, Ecole nationale
Supérieure d’Informatique (ESI), Disponible sur
http://zegour.esi.dz/Cours/Cours_sdd.htm
M. Le Gonidec, Introduction à la Programmation – Pratique du Langage C
–, Université du Sud, disponible sur http://legonidec.univ-tln.fr/0-Cours.pdf
Maude Manouvrier, Initiation à la Programmation Procédurale, à
L'algorithmique Et aux structures de Données par le Langage C,
Université Paris Dauphine, 2015, disponible sur
http://www.lamsade.dauphine.fr/~manouvri/C/Polys_C_MM.pdf
Christian Bac, Support de Cours de Langage C; 2013; Disponible sur
http://picolibre.int-evry.fr/projects/svn/coursc/Index.pdf