Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Avant-propos
Cet ouvrage intitul Algorithmique et structures de donnes
est le rsultat de 8 annes denseignements lISET de Ksar-Hellal et
dans dautres institutions universitaires. De ce fait, il a bnfici des
questions et problmes poss par les tudiants durant les cours et travaux
pratiques de programmation.
Lobjectif de louvrage est dexpliquer en termes simples et
travers de multiples exemples et exercices corrigs comment apprendre
programmer tout en vitant les contraintes spcifiques imposes par les
langages de programmation.
La premire partie du livre traite les notions fondamentales de
lalgorithmique : types de base, instructions simples, structures
conditionnelles et itratives, procdures et fonctions, etc.
La seconde partie est consacre aux structures de donnes
composes : tableaux, enregistrements, fichiers, structures dynamiques :
listes chanes, piles, files et arbres.
Pour tre complet, le livre contient une leon sur la rcursivit.
De mme, plusieurs problmes ont t traits de faon itrative puis
rcursive afin de mettre en vidence les points forts et les points faibles
de chaque approche.
Le livre contient environ une centaine dexercices souvent conus
comme une application du cours des situations de la vie professionnelle
(calcul mathmatique, problmes de gestion, jeux, etc.). La solution
propose chaque exercice nest pas unique et dans plusieurs cas elle
nest optimale car on a toujours privilgi lapport pdagogique et la
simplicit.
Je tiens remercier toutes les personnes qui mont aid
llaboration de cet ouvrage et, en particuler, Messieurs Samir CHEBILI,
Technologue lISET de Sousse et Youssef GAMHA, Assistant
Technologue lISET de Ksar-Hellal pour leur active et aimable
participation.
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
1
Le on 1 : I nt r oduc t i on l a pr ogr ammat i on
O b j e c t i f s
- Connatre le vocabulaire de base en programmation
- Comprendre la dmarche de programmation
I. Notion de programme
Le mot programmation recouvre lensemble des activits qui font passer
dun problme un programme.
Un programme est un texte constitu dun ensemble de directives,
appeles instructions, qui spcifient :
les oprations lmentaires excuter
la faon dont elles senchanent.
Supposons quun enseignant dispose dun ordinateur et dun programme
de calcul de la moyenne des tudiants. Pour sexcuter, ce programme
ncessite quon lui fournisse pour chaque tudiant, les notes de contrle
continu, de T.P et de lexamen final : ce sont les donnes. En retour, le
programme va fournir la moyenne cherche : cest le rsultat.
De la mme manire, un programme de paie ncessite des informations
donnes : noms des employs, grades, numros de scurit sociale,
situations familiales, nombre dheures supplmentaires, etc. Les rsultats
seront imprims sur les diffrents bulletins de paie : identification de
lemploy, salaire brut, retenue scurit sociale, etc.
Pour viter de saisir chaque fois les mmes donnes, certaines
informations doivent tre archives sur une mmoire de masse. Le
programme y accdera alors directement (figure 1).
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
2
Figure 1. Schma dexcution dun programme
II. Interprtation et compilation
Lordinateur ne sait excuter quun nombre limit doprations
lmentaires dictes par des instructions de programme et codes en
binaire (langage machine). Obligatoirement, les premiers programmes
taient crits en binaire. Ctait une tche difficile et expose aux erreurs
car il fallait aligner des squences de bits dont la signification nest pas
vidente.
Par la suite, pour faciliter le travail, les programmes ont t crits en
dsignant les oprations par des codes mnmoniques faciles retenir
(ADD, DIV, SUB, MOVE, etc.). Les adresses des instructions et les
variables pouvaient aussi tre donnes sous forme symbolique. Pour
pouvoir utiliser effectivement tous ces symboles, il fallait trouver le
moyen de les convertir en langage machine ; ce fut ralis par un
programme appel assembleur. Le langage dassemblage est toujours
utilis, car cest le seul langage qui permet dexploiter au maximum les
ressources de la machine.
Lcriture de programmes en langage dassemblage reste une tche
fastidieuse. De plus, ces programmes prsentent un problme de
portabilit tant donn quils restent dpendants de la machine sur
laquelle ils ont t dvelopps. Lapparition des langages volus, tels
que Fortran et Pascal, a apport une solution ces problmes. Les
programmes crits en langage volu doivent galement tre convertis en
langage machine pour tre excuts. Cette conversion peut seffectuer de
deux faons : par compilation ou par interprtation.
La compilation consiste traduire dans un premier temps lensemble du
programme en langage machine. Dans un deuxime temps, le programme
est excut.
Rsul t at s
Donnes
archives
Informations
Utilisateur
Ordinateur
Programme Archives
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
3
Linterprtation consiste traduire chaque instruction du programme en
langage machine avant de lexcuter (figure 2).
Figure 2. Diffrents niveaux de langages de programmation
III. Dmarche de programmation
La dmarche de programmation se droule en deux phases (figure 3) :
1- Dans un premier temps, on identifie les donnes du problme, les
rsultats recherchs et par quel moyen on peut obtenir ces rsultats
partir des donnes. Cest ltape danalyse du problme qui aboutit
un procd de rsolution appel algorithme. Une approche
modulaire consiste dcomposer le problme initial en sous-
problmes plus simples rsoudre appels modules. Par exemple, un
programme de gestion de scolarit comportera un module inscription,
un module examen, un module diplme, etc.
ORDINATEUR
Langage
machine
Programme en
langage dassemblage
Programme en
langage machine
Programme en
langage volu
Compilateur Interprteur
PROGRAMMEUR
Assembleur
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
4
2- Dans un deuxime temps, on traduit dans le langage de
programmation choisi le rsultat de la phase prcdente. Si lanalyse
a t mene convenablement, cette opration se rduit une simple
transcription systmatique de lalgorithme selon la grammaire du
langage.
Figure 3. Dmarche de ralisation dun programme
Lors de lexcution, soit des erreurs syntaxiques sont signales, ce qui
entrane des retours au programme et des corrections en gnral simples
effectuer, soit des erreurs smantiques plus difficiles dceler. Dans ce
dernier cas, le programme produit des rsultats qui ne correspondent pas
ceux escompts : les retours vers lanalyse (lalgorithme) sont alors
invitables.
IV. Notion de variable
Malgr une apparente diversit, la plupart des langages sont bass sur la
mme technique fondamentale savoir la manipulation de valeurs
contenues dans des variables .
En programmation, une variable est un identificateur qui sert reprer
un emplacement donn de la mmoire centrale. Cette notion nous permet
de manipuler des valeurs sans nous proccuper de lemplacement quelles
occupent effectivement en mmoire.
La lisibilit des programmes dpend troitement du choix des noms des
variables qui doivent tre simples et significatifs. Ainsi, Mont_Fac est un
meilleur choix que x pour dsigner le montant dune facture.
Comme tout identificateur, le nom dune variable est form dune ou de
plusieurs lettres ; les chiffres sont galement autoriss, condition de ne
pas les mettre au dbut du nom (figure 4).
Anal yse Tr aduc t i on
Problme
ALGORITHME
Programme
Lettre
Lettre
Chiffre
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
5
Figure 4. Rgle de construction dun identificateur
Ainsi : P, Quantite et f91 sont tous des noms corrects.
Notons enfin que certains langages comme C, C++ et Java font la
diffrence entre lettres minuscules et majuscules alors que dautres
comme Turbo Pascal nen font aucune distinction.
V. Notion de constante
Contrairement aux variables, les constantes sont des donnes dont la
valeur reste fixe durant lexcution du programme.
Exemples : Pi = 3.14 g = 9.80 etc.
VI. Notion de type
A chaque variable utilise dans le programme, il faut associer un type qui
permet de dfinir :
lensemble des valeurs que peut prendre la variable
lensemble des oprations quon peut appliquer sur la variable.
La syntaxe de laction de dclaration est la suivante :
Variable 1, Variable 2, : Type
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
6
Les principaux types utiliss en algorithmique sont :
- le type entier
- le type rel
- le type caractre
- le type chane de caractres
- le type logique ou boolen.
VI.1. le type entier
Une variable est dite entire si elle prend ses valeurs dans Z (ensemble
des entiers relatifs) et quelle peut supporter les oprations suivantes :
Opration Notation
Addition +
Soustraction -
Multiplication *
Division entire div
Modulo (reste de la division) mod
Exemples
13 div 5 = 2
13 mod 5 = 3
Lensemble de valeurs que peut prendre un entier varie selon le langage
de programmation utilis tant donn que le nombre de bits rservs pour
une variable de ce type nest pas le mme. A titre dexemple, en Turbo
Pascal, les entiers varient entre 32768 et +32767.
VI.2. le type rel ou dcimal
Il existe plusieurs types de rels reprsentant chacun un ensemble
particulier de valeurs prises dans (ensemble des nombres rels). Ici
encore, cette distinction se justifie par le mode de stockage des
informations dans le langage de programmation.
Il existe deux formes de reprsentation des rels :
la forme usuelle avec le point comme symbole dcimal.
Exemples : -3.2467 2 12.7 +36.49
la notation scientifique selon le format aEb, o :
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
7
a est la mantisse, qui scrit sous une forme usuelle
b est lexposant reprsentant un entier relatif.
Exemple : 347 = 3.47E2 = 0.347E+3 = 3470E-1 = ...
Les oprations dfinies sur les rels sont :
Opration Notation
Addition +
Soustraction -
Multiplication *
Division (relle) /
VI.3. le type caractre
Un caractre peut appartenir au domaine des chiffres de 0 9, des
lettres (minuscules et majuscules) et des caractres spciaux (*, /,
{, $, #, % ). Un caractre sera toujours not entre des
guillemets. Le caractre espace (blanc) sera not .
Les oprateurs dfinis sur les donnes de type caractre sont :
Opration Notation
gal =
Diffrent #
Infrieur <
Infrieur ou gal <=
Suprieur >
Suprieur ou gal >=
La comparaison entre les caractres se fait selon leur codes ASCII (voir
annexe 2).
Exemple :
< 0 < 1 < A < B < a < b < {
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
8
VI.4. le type logique ou boolen
Une variable logique ne peut prendre que les valeurs Vrai ou Faux.
Elle intervient dans lvaluation dune condition.
Les principales oprations dfinies sur les variables de type logique sont :
la ngation (NON), lintersection (ET) et lunion (OU).
Lapplication de ces oprateurs se fait conformmnet la table de vrit
suivante :
Table de vrit des oprateurs logiques
A B NON (A) A ET B A OU B
Vrai Vrai Faux Vrai Vrai
Vrai Faux Faux Faux Vrai
Faux Vrai Vrai Faux Vrai
Faux Faux Vrai Faux Faux
Remarque
En plus de ces types pr-dfinis, le programmeur a la possibilit de
dfinir lui-mme de nouveaux types en fonction de ses besoins.
Exemple
Types
Saison = (A,H,P,E)
Tnote = 0 .. 20
Variables
s : Saison
note : Tnote
La variable s de type saison ne peut prendre que les valeurs A, H,
P ou E.
VII. Les expressions
Ce sont des combinaisons entre des variables et des constantes laide
doprateurs. Elles expriment un calcul (expressions arithmtiques) ou
une relation (expressions logiques).
VII. 1. Les expressions arithmtiques
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
9
Exemple : x * 53.4 / (2 + pi)
Lordre selon lequel se droule chaque opration de calcul est important.
Afin dviter les ambiguts dans lcriture, on se sert des parenthses et
des relations de priorit entre les oprateurs arithmtiques :
Ordre de priorit des oprateurs arithmtiques
Priorit Oprateurs
1 - signe ngatif (oprrateur unaire)
2 ( ) parenthses
3 ^ puissance
4 * et / multiplication et division
5 + et - addition et soustraction
En cas de conflit entre deux oprateurs de mme priorit, on commence
par celui situ le plus gauche.
VII. 2. Les expressions logiques
Ce sont des combinaisons entre des variables et des constantes laide
doprateurs relationnels (=, <, <=, >, >=, #) et/ou des combinaisons entre
des variables et des constantes logiques laide doprateurs logiques
(NON , ET, OU, ).
Ici encore, on utilise les parenthses et lordre de priorit entre les
diffrents oprateurs pour rsoudre les problmes de conflits.
Oprateurs logiques Oprateurs relationnels
Priorit Oprateur Priorit Oprateur
1 NON 1 >
2 ET 2 >=
3 OU 3 <
4 <=
5 =
6 #
EXERCICES DAPPLICAION
Exercice 1.1
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
10
1- Quel est lordre de priorit des diffrents oprateurs de lexpression
suivante :
((3 * a) x ^ 2) (((c d) / (a / b)) / d)
2- Evaluer lexpression suivante :
5 + 2 * 6 4 + (8 + 2 ^ 3) / (2 4 + 5 * 2)
3- Ecrire la formule suivante sous forme dune expression arithmtique :
z x
ac xy
2
4 ) 3 (
2
Exercice 1.2
Sachant que a = 4, b = 5, c = -1 et d = 0, valuer les expressions logiques
suivantes :
1- (a < b) ET (c >= d)
2- NON (a < b) OU (c # b)
3- NON( (a # b ^ 2) OU (a*c < d))
Leon 1 : I nt r oduct i on l a pr ogr ammat i on
11
SOLUTIONS DES EXERCICES
Ecercice 1.1
1- ((3 * a) x ^ 2) (((c d) / (a / b)) / d)
2- 5 + 2 * 6 4 + (8 + 2 ^ 3) / (2 4 + 5 * 2) = 15
3- ((3 x * y) ^ 2 4 * a * c) / (2 * x z)
Ecercice 1.2
1- Faux
2- Vrai
3- Faux
Le rsultat dune expression logique est toujours Vrai ou Faux.
Leon 2 : Les i nst r uct i ons simpl es
12
Le on 2 : Les i nst r uc t i ons si mpl es
O b j e c t i f s
- Comprendre les actions algorithmiques simples
- Connatre la structure gnrale dun algorithme
I. Linstruction daffectation
Le rle de cette instruction consiste placer une valeur dans une variable.
Sa syntaxe gnrale est de la forme :
Variable Expression
Ainsi, linstruction :
A 6
signifie mettre la valeur 6 dans la case mmoire identifie par A .
Alors que linstruction :
B (A + 4) Mod 3
range dans B la valeur 1 (A toujours gale 6).
Remarque
La valeur ou le rsultat de lexpression droite du signe daffectation doit
tre de mme type ou de type compatible avec celui de la variable
gauche.
Exemple 1
Quelles seront les valeurs des variables A, B et C aprs lexcution des
instructions suivantes :
A 5
B 3
C A + B
A 2
C B A
Leon 2 : Les i nst r uct i ons simpl es
13
Trace dexcution
Instruction
Contenu des variables
A B C
(1) A 5 5 - -
(2) B 3 5 3 -
(3) C A + B 5 3 8
(4) A 2 2 3 8
(5) C B A 2 3 1
Exemple 2
Quelles seront les valeurs des variables A et B aprs lexcution des
instructions suivantes :
A 5
B 7
A A + B
B A - B
A A B
Trace dexcution
Instruction
Contenu des variables
A B
(1) A 5 5 -
(2) B 7 5 7
(3) A A + B 12 7
(4) B A B 12 5
(5) A A B 7 5
Cette squence dinstructions permet de permuter les valeurs de A et B.
Une deuxime faon de permuter A et B consiste utiliser une variable
intermdiaire X :
X A
A B
B X
Exercice
Leon 2 : Les i nst r uct i ons simpl es
14
Soient 3 variables A, B et C. Ecrire une squence dinstructions
permettant de faire une permutation circulaire de sorte que la valeur de A
passe dans B, celle de B dans C et celle de C dans A. On utilisera une
seule variable supplmentaire.
Solution
X C
C B
B A
A X
II. Linstruction dcriture : communication Programme Utilisateur
Pour quun programme prsente un intrt pratique, il devra pouvoir nous
communiquer un certain nombre dinformations (rsultats) par
lintermdiaire dun priphrique de sortie comme lcran ou
limprimante. Cest le rle de linstruction dcriture.
La forme gnrale de cette instruction est :
Ecrire(expression1, expression2, ...)
Exemple
Quobtient t-on lcran aprs lexcution des instructions suivantes :
x 4
Ville Tunis
Ecrire(x)
Ecrire(x*x)
Ecrire(Ville)
Ecrire(Ville = ,Ville)
Leon 2 : Les i nst r uct i ons simpl es
15
Solution
4
16
Ville
Ville = Tunis
III. Linstruction de lecture : communication Utilisateur Programme
Dans certains cas, nous pourrons tre amens transmettre des
informations (donnes) notre programme par lintermdiaire dun
priphrique dentre comme le clavier. Cela sera ralis par linstruction
de lecture.
La forme gnrale de cette instruction est :
Lire(Variable1, Variable2, ...)
Ainsi, linstruction :
Lire(A)
signifie lire une valeur partir du priphrique dentre, qui est le
clavier par dfaut, et la ranger dans la variable identifie par A
IV. Structure gnrale dun algorithme
Algorithme Nom_algorithme
Constantes
C1 = Valeur1
Types
Type1 = dfinition du type
Variables
V1 : Type1
Dbut
Instruction1
Fin.
Leon 2 : Les i nst r uct i ons simpl es
16
Remarques
1. Les nouveaux types doivent tre dclars dans la partie Types.
2. Toute variable utilise dans lalgorithme doit tre pralablement
dclare.
3. Les instructions places entre Dbut et Fin forment le corps
principal de lalgorithme.
4. Seules les parties Entte et Corps de lalgorithme sont
obligatoires.
5. Lindentation qui consiste insrer des tabulations avant les objets
dclars et les instructions offre une meilleure lisibilit de
lalgorithme et le rend, par consquent, plus facile comprendre et
corriger.
EXERCICES DAPPLICATION
Exercice 2.1
Donner toutes les raisons pour lesquelles lalgorithme suivant est
incorrect :
Algoritme Incorrect
x, y : Entier
z : Rel
Dbut
z x + 2
y z
x*2 3 + z
y 5y + 3
Fin.
Exercice 2.2
Ecrire un algorithme qui lit deux entiers au clavier et qui affiche ensuite
leur somme et leur produit.
Exercice 2.3
Leon 2 : Les i nst r uct i ons simpl es
17
Ecrire un algorithme qui lit le rayon dun cercle et qui affiche ensuite son
primtre et sa surface.
Exercice 2.4
Ecrire un algorithme qui calcule et affiche la rsistance dun composant
lectrique en utilisant la loi dOhm :
'
A. en Intensit : I
en Rsistance : R
V en Tension : U
avec I R U
Leon 2 : Les i nst r uct i ons simpl es
18
SOLUTIONS DES EXERCICES
Exercice 2.1
1. Algoritme Incorrect
2. x, y : Entier
3. z : Rel
4. Dbut
5. z x + 2
6. y z
7. x*2 3 + z
8. y 5y + 3
9. Fin.
Cet algorithme est incorrect pour plusieurs raisons :
ligne 1 : Le mot Algorithme scrit avec un h au milieu
ligne 2 : La dclaration des variables commence par le mot
Variables
ligne 5 : La valeur de x est indtermine
Ligne 6 : incompatibilit de type (un rsultat rel affect une
variable de type entier)
Ligne 7 : Le membre gauche dune affectation doit tre une variable
Ligne 8 : Il faut crire 5*y et non 5y.
Exercice 2.2 : calcul de la somme et du produit de deux entiers
Algorithme Som_Prod
Variables
a, b, s, p : Entier
Dbut
Ecrire(Entrer la valeur de a : ) Lire(a)
Ecrire(Entrer la valeur de b : ) Lire(b)
s a + b
p a * b
Ecrire (Somme = , s)
Ecrire (Produit = , p)
Fin.
Exercice 2.3 : calcul du primtre et de la surface dun cercle
Leon 2 : Les i nst r uct i ons simpl es
19
Algorithme Cercle
Constantes
pi = 3.14
Variables
r, p, s : Rel
Dbut
Ecrire(Entrer le rayon du cercle : ) Lire(r)
p 2 * pi * r
s pi * r ^ 2
Ecrire (Primtre = , p)
Ecrire (Surface = , s)
Fin.
Exercice 2.4 : calcul de la rsistance dun composant lectrique
Algorithme Rsistance
Variables
U, I, R : Rel
Dbut
Ecrire(Entrer la tension : ) Lire(U)
Ecrire(Entrer lintensit : ) Lire(I)
R U/I (* on suppose toujours I # 0 *)
Ecrire (Rsitance = , R, Ohms )
Fin.
Leon 3 : Les st r uct ur es condi t i onnel l es
20
Le on 3 : l es st r uc t ur es c ondi t i onnel l es
O b j e c t i f
Construire des algorithmes comportant des traitements conditionnels.
I. Introduction
En programmation, on est souvent confront des situations o on a
besoin de choisir entre deux ou plusieurs traitements selon la ralisation
ou non dune certaine condition ; do la notion de traitement
conditionnel.
On distingue deux structures de traitement conditionnel savoir :
La structure de slection simple dans laquelle on a choisir entre
deux traitements au plus ;
La structure de slection multiple dans laquelle on a la possibilit
de choisir un traitement parmi plusieurs.
II. Structure de slection simple
II.1. Forme simple
Si <Condition> Alors
<Squence dinstructions>
FinSi
Cette primitive a pour effet dexcuter la squence dinstructions si et
seulement si la condition est vrifie.
Lexcution de cette instruction se droule selon lorganigramme
suivant (figure 5) :
Si
Leon 3 : Les st r uct ur es condi t i onnel l es
21
Figure 5. Schma dexcution dune instruction conditionnelle simple
Exemple
Ecrire un algorithme qui calcule le salaire dun employ partir du
nombre dheures travailles, du taux horaire et du nombre dannes de
service. Les employs ayant une anciennet de plus de 10 ans bnficient
dune allocation supplmentaire de 35 D.
Analyse du problme
1- Donnes du problme
nh : nombre dheures travailles
th : taux horaire (en Dinar)
anc : anciennet (en Anne)
2- Rsultat recherch
salaire : salaire net de lemploy (en Dinar)
3- Comment faire ?
Salaire nh * th
Si (anc > 10) Alors
salaire salaire + 35
FinSi
Solution
Algorithme Calc_Salaire
Condition ?
Squence dinstructions
faux
vrai
Suite du programme
Leon 3 : Les st r uct ur es condi t i onnel l es
22
Variables
nh, th, anc, salaire : Rel
Dbut
Ecrire(Nombre dheures travailles : ) Lire(nh)
Ecrire(Taux horaire : ) Lire(th)
Ecrire(Anciennet : ) Lire(anc)
salaire nh * th
Si (anc > 10) Alors
salaire salaire + 35
FinSi
Ecrire (Salaire de lemploy = , salaire)
Fin.
II.2 Forme alternative
Si <Condition> Alors
<Squence dinstructions 1>
Sinon
<Squence dinstructions 2>
FinSi
Cette primitive a pour effet dexcuter la premire squence
dinstructions si la condition est vrifie ou bien la deuxime squence
dinstructions dans le cas contraire.
Lexcution de cette instruction se droule selon lorganigramme
suivant (figure 6) :
Leon 3 : Les st r uct ur es condi t i onnel l es
23
Figure 6. Schma dexcution dune instruction conditionnelle alternative
Exemple 1
Ecrire un algorithme qui calcule et affiche la valeur absolue dun entier
quelconque lu au clavier.
Solution
Algorithme Val_Abs
Variables
x, va : Entier
Dbut
Ecrire(Entrer un entier : ) Lire(x)
Si (x >= 0) Alors
va x
Sinon
va -x
FinSi
Ecrire (|,x, | = ,va)
Fin.
Exemple 2
Condition ?
Squence
dinstructions 1
faux vrai
Squence
dinstructions 2
Si
Suite du programme
Leon 3 : Les st r uct ur es condi t i onnel l es
24
Ecrire un algorithme qui lit un entier et affiche ensuite sil est pair ou
impair.
Solution
Algorithme pair_impair
Variables
x : Entier
Dbut
Ecrire(Entrer un entier : ) Lire(x)
Si (x Mod 2 = 0) Alors
Ecrire(cest un entier pair)
Sinon
Ecrire(cest un entier impair)
FinSi
Fin.
III. Structure de slection multiple
Syntaxe gnrale
Selon <slecteur> Faire
Liste de valeurs 1 : < Squence dinstructions 1>
Liste de valeurs 2 : < Squence dinstructions 2>
n
i
i
s
1
1
; n est
un entier positif lu partir du clavier.
Exemple : Pour n = 3, s = 1 + 1/2 + 1/3 = 1.83.
Leon 4 : Les st r uct ur es i t r at i ves
39
Exercice 4.9 : nombres cubiques
Parmi tous les entiers suprieurs 1, seuls 4 peuvent tre reprsents par
la somme des cubes de leurs chiffres.
Ainsi, par exemple : 153 = 1
3
+ 5
3
+ 3
3
est un nombre cubique
Ecrire un algorithme permettant de dterminer les 3 autres.
Note : les 4 nombres sont compris entre 150 et 410.
Exercice 4.10 : nombres parfaits
Un nombre parfait est un nombre prsentant la particularit dtre gal
la somme de tous ses diviseurs, except lui-mme.
Le premier nombre parfait est 6 = 3 + 2 + 1.
Ecrire un algorithme qui affiche tous les nombres parfaits infrieurs
1000.
Exercice 4.11
Ecrire un algorithme qui simule le jeu suivant :
a- A tour de rle, lordinateur et le joueur choisissent un nombre qui ne
peut prendre que 3 valeurs : 0, 1 ou 2.
Linstruction : N Random(3) ralise le choix de lordinateur
b- Si la diffrence entre les nombres choisis vaut :
2, le joueur qui a propos le plus grand nombre gagne un point
1, le joueur qui a propos le plus petit nombre gagne un point
0, aucun point nest marqu
c- Le jeu se termine quand lun des joueurs totalise 10 points.
Leon 4 : Les st r uct ur es i t r at i ves
40
SOLUTIONS DES EXERCICES
Exercice 4.1
Algorithme Notes
Variables
n, i : Entier
note, min, max, s : Rel
Dbut
Ecrire(Entrer le nombre de notes : )
Lire(n) (* On suppose que n est toujours suprieur zro *)
s 0
max 0
min 20
Pour i de 1 n Faire
Ecrire(Entrer une note : ) Lire(note)
s s + note
Si (note > max) Alors
max note
FinSi
Si (note < min) Alors
min note
FinSi
FinPour
Ecrire(Meilleure note = ,max)
Ecrire(Mauvaise note = ,min)
Ecrire(Moyenne des notes = ,s/n)
Fin.
Exercice 4.2 : calcul de a
b
par multiplications successives
Algorithme Puissance
Variables
a, c : Rel
b, i : Entier
Dbut
Ecrire(Entrer la valeur de a : ) Lire(a)
Ecrire(Entrer la valeur de b : ) Lire(b)
c 1
Pour i de 1 Abs(b) Faire
Leon 4 : Les st r uct ur es i t r at i ves
41
c c * a
FinPour
Si (b < 0) Alors
c 1 / c
FinSi
Ecrire(a, la puissance ,b, = ,c)
Fin.
Exercice 4.3 : vrifier si un entier n est premier ou non
Algorithme Premier
Variables
n, i, nb_div : Entier
Dbut
Ecrire(Entrer un entier positif : ) Lire(n)
nb_div 0
i 1
TantQue (i <= n) Faire
Si (n Mod i = 0) Alors
nb_div nb_div + 1
FinSi
i i + 1
FinTQ
Si (nb_div <= 2) Alors
Ecrire(Cest un nombre premier)
Sinon
Ecrire(Ce nest pas un nombre premier)
FinSi
Fin.
Exercice 4.4 : dterminer les nombres premiers infrieurs un entier n
Algorithme Premiers
Variables
n, i, j, nb_div : Entier
Dbut
Ecrire(Entrer la valeur de n : ) Lire(n)
Pour i de 1 n Faire
nb_div 0
Pour j de 1 i Faire
Leon 4 : Les st r uct ur es i t r at i ves
42
Si (i Mod j = 0) Alors
nb_div nb_div + 1
FinSi
FinPour
Si (nb_div <= 2) Alors
Ecrire(i)
FinSi
FinPour
Fin.
Exercice 4.5 : calcul du PGCD de 2 entiers a et b
Algorithme PGCD
Variables
a, b : Entier
Dbut
Ecrire(Entrer la valeur de a : ) Lire(a)
Ecrire(Entrer la valeur de b : ) Lire(b)
Rpter
Si (a > b) Alors
a a b
FinSi
Si (b > a) Alors
b b - a
FinSi
Jusqu (a = b)
Ecrire(PGCD = , a)
Fin.
Exercice 4.6 : calcul du PPCM de 2 entiers a et b
Algorithme PPCM
Variables
a, b, i, x : Entier
Dbut
Ecrire(Entrer la valeur de a : )
Lire(a)
Ecrire(Entrer la valeur de b : )
Lire(b) (* On suppose que b est toujours suprieur zro *)
Si (a < b) Alors
Leon 4 : Les st r uct ur es i t r at i ves
43
x a
a b
b x
FinSi
i 1
TantQue (((i*a) Mod b) # 0) Faire
i i + 1
FinTQ
Ecrire(PPCM = , i*a)
Fin.
Exercice 4.7 : calcul des n premiers termes de la suite de Fibonacci
Algorithme Fibo
Variables
f0, f1, f, n, i : Entier
Dbut
Ecrire(Nombre de termes calculer : ) Lire(n)
f0 1
Ecrire(f0 = ,f0)
f1 1
Ecrire(f1 = ,f1)
Pour i de 2 (n-1) Faire
f f0 + f1
Ecrire(f,i, = ,f)
f0 f1
f1 f
FinPour
Fin.
Leon 4 : Les st r uct ur es i t r at i ves
44
Exercice 4.8 : calcul de la somme harmonique
n
i
i
s
1
1
Algorithme Somme
Variables
n, i : Entier
s : Rel
Dbut
Ecrire(Entrer la valeur de n : ) Lire(n)
s 0
Pour i de 1 n Faire
s s + 1/i
FinPour
Ecrire(s = ,s)
Fin.
Exercice 4.9 : nombres cubiques
Algorithme cubiques
Variables
i, centaine, dizaine, unite : Entier
Dbut
Pour i de 150 410 Faire
centaine i Div 100
dizaine (i Mod 100) Div 10
unite i Mod 10
Si ((centaine^3 + dizaine^3 + unite^3) = i)
Alors
Ecrire(i, est un nombre cubique)
FinSi
FinPour
Fin.
Remarque : les nombres cubiques sont : 153, 370, 371 et 407
Leon 4 : Les st r uct ur es i t r at i ves
45
Exercice 4.10 : nombres parfaits infrieurs 1000
Algorithme parfaits
Variables
i, n, s, j : Entier
Dbut
Pour i de 1 1000 Faire
s 0
Pour j de 1 (i Div 2) Faire
Si ((i Mod j) = 0) Alors
s s + j
FinSi
FinPour
Si (s = i) Alors
Ecrire(i, est un nombre parfait)
FinSi
FinPour
Fin.
Remarque : les nombres parfaits infrieurs 1000 sont : 6, 28 et 496
Exercice 4.11 : simulation dun jeu
Algorithme jeu
Variables
nb_j, nb_ord, tot_j, tot_ord : Entier
Dbut
tot_j 0
tot_ord 0
TantQue (tot_j < 10) ET (tot_ord < 10) Faire
nb_ord = random(3)
Ecrire(Entrer un entier (0/1/2) : ) Lire(nb_j)
Si (Abs(nb_ord nb_j) = 2) Alors
Si (nb_ord > nb_j) Alors
tot_ord tot_ord + 1
Sinon
tot_j tot_j + 1
FinSi
FinSi
Si (Abs(nb_ord nb_j) = 1) Alors
Leon 4 : Les st r uct ur es i t r at i ves
46
Si (nb_ord < nb_j) Alors
tot_ord tot_ord + 1
Sinon
tot_j tot_j + 1
FinSi
FinSi
FinTQ
Ecrire(Total ordinateur = ,tot_ord)
Ecrire(Total joueur = ,tot_j)
Fin.
Leon 5 : Les cha nes de car act r es
47
Le on 5 : l es c hanes de c ar ac t r es
O b j e c t i f
Construire des algorithmes qui traitent des caractres et des chanes de
caractres.
I. Le type caractre
I.1. Dfinition
Ce type sapplique tous les caractres du code ASCII (American
Standard Code for Information Interchange). La liste comprend :
- Les lettres : A .. Z,a..z
- Les chiffres : 0..9
- Les caractres spciaux : / ; * ; ? ; & ; etc.
- Les caractres de contrle : <Retour Chariot> ; <Echap> ; etc.
Chaque caractre est dfini par son numro dordre unique compris entre
0 et 255 (voir annexe 2).
I.2 Fonctions standards sur les caractres
Fonction Rle Exemple
Asc(c) retourne le code ASCII du caractre c i Asc(A)
i contiendra 65
Car(i) retourne le caractre dont le code ASCII est
gal i.
c Car(65)
c contiendra A
Succ(c) retourne le successeur du caractre c c Succ(a)
c contiendra b
Pred(c) retourne le prdcesseur du caractre c c Pred(b)
c contiendra a
Majus(c) retourne le majuscule du caractre c c Majus(a)
c contiendra A
Leon 5 : Les cha nes de car act r es
48
Exemple
Ecrire un algorithme qui lit un caractre au clavier puis affiche son
prdcesseur, son successeur et le code ASCII de son quivalent en
majuscule.
Solution
Algorithme Caract
Variables
c : Caractre
Dbut
Ecrire(Entrer un caractre: ) Lire(c)
Ecrire(pred(c))
Ecrire(succ(c))
Ecrire(asc(majus(c)))
Fin.
Exercice 1
Que fait lalgorithme suivant :
Algorithme Upcase
Variables
c1, c2 : Caractre
Dbut
Ecrire(Entrer un caractre: ) Lire(c1)
Si (asc(c1) >= 97) et (asc(c1) <= 122) Alors
c2 car(asc(c1) - 32)
Sinon
c2 c1
FinSi
Ecrire(c2)
Fin.
Solution
Cet algorithme lit un caractre puis affiche son quivalent en majuscule.
Leon 5 : Les cha nes de car act r es
49
Exercice 2
Ecrire un algorithme qui affiche une table ASCII des lettres minuscules
sous la forme suivante :
Le code ASCII de a est 97
Le code ASCII de b est 98
T[n] Valeur n
Il est galement possible de lire les lments du tableau partir du
clavier grce une procdure :
Procdure remplir(Var T : tab)
Variables
i : Entier
Dbut
Pour i de 1 n Faire
Ecrire(Entrer un entier : )
Lire(T[i])
FinPour
Fin
Leon 7 : Les t abl eaux
73
II.4. Affichage des lments dun tableau
Laffichage des lments dun tableau se fait galement lment par
lment. Seulement, le tableau constitue ici un paramtre donn et non
pas un rsultat comme dans la procdure de remplissage.
Procdure afficher(T : tab)
Variables
i : Entier
Dbut
Pour i de 1 n Faire
Ecrire(T[i])
FinPour
Fin
Exercice
Soit T un tableau contenant n lments de type entier. Ecrire une fonction
MinTab qui retourne le plus petit lment de ce tableau.
Solution
On suppose initialement que le premier lment du tableau est le
minimum puis on le compare tous les autres lments. Chaque fois
quon trouve un lment qui lui est infrieur, ce dernier devient le
minimum.
Fonction MinTab(T : tab) : Entier
Variables
m,i : Entier
Dbut
m T[1]
Pour i de 2 n Faire
Si (T[i] < m) Alors
m T[i]
FinSi
FinPour
MinTab m
Fin
II.5. Recherche squentielle dun lment dans un tableau
Leon 7 : Les t abl eaux
74
Soit T un tableau contenant n lments de type entier.
On veut crire une procdure dont lentte sera :
Procdure recherche(T : Tab, x : Entier)
Cette procdure affiche :
lindice de la premire occurrence de x dans T si x T
le message lment introuvable si x T
Principe
Comparer x aux diffrents lments du tableau jusqu trouver x ou
atteindre la fin du tableau.
Procdure Recherche(T : Tab ; x : Entier)
Variables
i : Entier
Dbut
i 0
Rpter
i i + 1
Jusqu (T[i] = x) ou (i > n)
Si (T[i] = x) Alors
Ecrire(Indice = ,i)
Sinon
Ecrire(Elment introuvable)
FinSi
Fin
Leon 7 : Les t abl eaux
75
II.6. Algorithmes de tri
Il existe plusieurs mthodes de tri parmi lesquelles on peut citer :
- tri bulle
- tri par slection
- tri par insertion
- tri par comptage
- tri shell
- tri rapide (quick sort).
a- Tri bul l e
Soit T un tableau de n entiers. La mthode de tri bulles ncessite deux
tapes :
Parcourir les lments du tableau de 1 (n1) ; si llment i est
suprieur llment (i+1), alors on les permute.
Le programme sarrte lorsquaucune permutation nest
ralisable aprs un parcours complet du tabeau.
Procdure Tri_Bulle (Var T : Tab)
Variables
i, x : Entier
change : Boolen
Dbut
Rpter
change Faux
Pour i de 1 (n-1) Faire
Si (T[i] > T[i+1]) Alors
x T[i]
T[i] T[i+1]
T[i+1] x
change Vrai
FinSi
FinPour
Jusqu (change = Faux)
Fin
Trace dxcution
Leon 7 : Les t abl eaux
76
Tableau initial 6 4 3 5 2
Aprs la 1
re
itration 4 3 5 2 6
Aprs la 2
me
itration 3 4 2 5 6
Aprs la 3
me
itration 3 2 4 5 6
Aprs la 4
me
itration 2 3 4 5 6
b- Tri par sl ecti on (par mi ni mum)
Cest la mthode de tri la plus simple, elle consiste :
- chercher lindice du plus petit lment du tableau T[1..n] et
permuter llment correspondant avec llment dindice 1
- chercher lindice du plus petit lment du tableau T[2..n] et
permuter llment correspondant avec llment dindice 2
-
- chercher lindice du plus petit lment du tableau T[n-1..n] et
permuter llment correspondant avec llment dindice (n-1).
Procdure Tri_Selection(Var T : Tab)
Variables
i, j, x, indmin : Entier
Dbut
Pour i de 1 (n-1) Faire
indmin i
Pour j de (i+1) n Faire
Si (T[j] < T[indmin]) Alors
indmin j
FinSi
FinPour
x T[i]
T[i] T[indmin]
T[indmin] x
FinPour
Fin
Trace dxcution
Tableau initial 6 4 2 3 5
Leon 7 : Les t abl eaux
77
Aprs la 1
re
itration 2 4 6 3 5
Aprs la 2
me
itration 2 3 6 4 5
Aprs la 3
me
itration 2 3 4 6 5
Aprs la 4
me
itration 2 3 4 5 6
c- Tri par i nserti on
Cette mthode consiste prendre les lments de la liste un par un et
insrer chacun dans sa bonne place de faon que les lments traits
forment une sous-liste trie.
Pour ce faire, on procde de la faon suivante :
- comparer et permuter si ncessaire T[1] et T[2] de faon placer
le plus petit dans la case dindice 1
- comparer et permuter si ncessaire llment T[3] avec ceux qui
le prcdent dans lordre (T[2] puis T[1]) afin de former une
sous-liste trie T[1..3]
-
- comparer et permuter si ncessaire llment T[n] avec ceux qui
le prcdent dans lordre (T[n-1], T[n-2], ) afin dobtenir un
tableau tri.
Procdure Tri_Insertion(Var T : Tab)
Variables
i, j, x, pos : Entier
Dbut
Pour i de 2 n Faire
pos i - 1
TantQue (pos>=1) et (T[pos]>T[i]) Faire
pos pos 1
FinTQ
pos pos + 1
x T[i]
Pour j de (i-1) pos [pas = -1] Faire
T[j+1] T[j]
Leon 7 : Les t abl eaux
78
FinPour
T[pos] x
FinPour
Fin
[Pas = -1] signifie que le parcours se fait dans le sens dcroissant.
Trace dxcution
Tableau initial 6 4 3 5 2
Aprs la 1
re
itration 4 6 3 5 2
Aprs la 2
me
itration 3 4 6 5 2
Aprs la 3
me
itration 3 4 5 6 2
Aprs la 4
me
itration 2 3 4 5 6
II.7. Recherche dichotomique
Soit T un tableau contenant n lments tris dans le sens croissant :
T 1 3 5 5 8
1 2 3 4 5
i [1 , n-1], T[i] <= T[i+1]
On veut crire une procdure dont lentte est de la forme :
Procdure Rechdicho(T : tab ; x : Entier)
et qui affiche lindice de la premire apparition de x dans le tableau sil
existe. Sinon, elle affiche le message lment introuvable.
Principe
Le but de la recherche dichotomique est de diviser lintervalle de
recherche par 2 chaque itration. Pour cela, on procde de la faon
suivante :
Leon 7 : Les t abl eaux
79
Soient premier et dernier les extrmits gauche et droite de lintervalle
dans lequel on cherche la valeur x, on calcule M, lindice de llment
mdian :
M = (premier + dernier) div 2
Il y a 3 cas possibles :
x = T[M] : llment de valeur x est trouv, la recherche est
termine
x < T[M] : llment x, sil existe, se trouve dans lintervalle
[premier..M-1]
x > T[M] : llment x, sil existe, se trouve dans lintervalle
[M+1..dernier]
La recherche dichotomique consiste itrer ce processus jusqu ce que
lon trouve x ou que lintervalle de recherche soit vide.
Procdure Rechdicho(T : Tab , x : entier)
Variables
premier, milieu, dernier : Entier
trouve : Boolen
Dbut
premier 1
dernier n
trouve Faux
Rpter
milieu (premier + dernier) div 2
Si (x < T[milieu]) Alors
dernier milieu 1
Sinon
Si (x > T[milieu]) Alors
premier milieu + 1
Sinon
trouve Vrai
FinSi
FinSi
Jusqu (trouve = Vrai) ou (premier > dernier)
Si (trouve = Vrai) Alors
Leon 7 : Les t abl eaux
80
Ecrire(Indice = ,milieu)
Sinon
Ecrire(Elment introuvable)
FinSi
Fin.
Evaluation de lalgorithme
Dans le cas le plus dfavorable, lalgorithme se termine lorsque le
nombre dlments p prsents dans lintervalle [premier .. dernier]
devient nul. A chaque itration, p est au moins divis par 2. On est donc
certain dobtenir le rsultat en au plus i itrations tel que n = 2
i
. Do
i=log
2
n (fonction inverse).
titre dexemple, si le tableau tri contient 1024 lments, il faudra au
plus 1025 itrations avec lalgorithme squentiel et au plus 10 avec
lalgorithme dichotomique.
III. Tableaux multidimensionnels
Les tableaux multidimensionnels sont des tableaux qui contiennent des
tableaux. Par exemple, le tableau bidimensionnel (3 lignes et 4 colonnes)
suivant est en fait un tableau comportant 3 lments, chacun dentre eux
tant un tableau de 4 lments :
1 2 3 4
1
2
3
Leon 7 : Les t abl eaux
81
Cette matrice peut tre dfinie de la faon suivante :
Types
Mat : Tableau[1..3,1..4] de Rel
Variables
Matrice : Mat
Chaque lment de la matrice est repr par deux indices :
- le premier indique le numro de la ligne
- le second indique le numro de la colonne.
Ainsi, Matrice[2,4] dsigne llment situ la 2
me
ligne et la 4
me
colonne.
Remarque
Cette reprsentation est arbitraire, on a pu considrer que le premier
indice dsigne la colonne et le second dsigne la ligne. Dans ce cas,
llment Matrice[2,4] nexiste plus.
III.1. Remplissage dun tableau deux dimensions
Le remplissage dun tableau bidimensionnel n lignes et m colonnes se
fait peu prs de la mme faon quun tableau unidimensionnel.
Seulement, il est ncessaire dutiliser deux boucles imbriques
correspondant chacune lindice dune dimension :
Procdure remplir(Var matrice : Mat)
Variables
i, j : Entier
Dbut
Pour i de 1 n Faire
Pour j de 1 m Faire
Ecrire(Entrer un entier :)
Lire(Matrice[i,j])
FinPour
FinPour
Fin
Leon 7 : Les t abl eaux
82
III.2. Transposition dune matrice carre
Une matrice carre est une matrice n lignes et n colonnes.
Lopration de transposition consiste inverser les lignes et les colonnes
en effectuant une symtrie par rapport la diagonale principale de la
matrice.
Exemple
1 2 3 1 4 7
M 4 5 6 Devient 2 5 8
7 8 9 3 6 9
Procdure Transpose(Var M : Mat)
Variables
i, j, x : Entier
Dbut
Pour i de 1 n Faire
Pour j de (i+1) n Faire
x M[i,j]
M[i,j] M[j,i]
M[j,i] x
FinPour
FinPour
Fin
III.3. Somme de deux matrices
Soient M1 et M2 deux matrices n lignes et m colonnes.
On veut crire une procdure qui calcule les lments de la matrice
M3=M1+M2
Exemple
M1
1 2 3
M2
2 5 3
donnent M3 =
3 7 6
4 5 6 3 0 1 7 5 7
Procdure SomMat(M1, M2 : Mat ; Var M3 : Mat)
Leon 7 : Les t abl eaux
83
Variables
i, j : Entier
Dbut
Pour i de 1 n Faire
Pour j de 1 m Faire
M3[i,j] M1[i,j]+ M2[i,j]
FinPour
FinPour
Fin
III.4. Produit de deux matrices
Soient M1 une matrice ayant n lignes et m colonnes
M2 une matrice ayant m lignes et p colonnes
On veut crire une procdure qui calcule les lments de la matrice
M3=M1M2.
Notons dabord que le nombre de colonnes de M1 doit tre gal au
nombre de lignes de M2.
Le produit M3 = M1 M2 est dfini comme une matrice ayant n lignes et
p colonnes et dont les lments sont calculs par la formule :
j m, m i, j 2, i,2 j 1, i,1 j i,
M2 M1 ... M2 M1 M2 M1 M3 + + +
soit
m
1 k
j K, k i, j i,
M2 M1 M3
o M1
i,k
, M2
k,j
et M3
i,j
sont respectivement les lments des matrices M1,
M2 et M3.
Exemple
M1
1 2 3
M2
2 1
donnent M3 =
11 13
4 0 5 3 0 13 24
1 4
Procdure ProdMat(M1 : Mat1; M2 : Mat2; Var M3 : Mat3)
Leon 7 : Les t abl eaux
84
Variables
i, j, k : Entier
Dbut
Pour i de 1 n Faire
Pour j de 1 p Faire
M3[i,j] 0
Pour k de 1 mFaire
M3[i,j]M3[i,j]+M1[i,k]*M2[k,j]
FinPour
FinPour
FinPour
Fin
EXERCICES DAPPLICATION
Exercice 7.1
Soit T un tableau contenant n lments de type entier et x un entier
quelconque.
Ecrire une fonction Frquence(T : Tab ; x : Entier) : Entier qui
retourne le nombre dapparitions de x dans le tableau T.
Exercice 7.2
Ecrire une procdure permettant dclater un tableau T dentiers en deux
tableaux :
- TP qui contiendra les lments positifs de T
- TN qui contiendra les lments ngatifs de T.
Exercice 7.3
Un instituteur cherche vrifier si ses lves ont appris rciter
lalphabet lettre par lettre dans lordre. Pour ceci, Il vous demande de lui
dvelopper lalgorithme dun programme permettant dvaluer chaque
lve de la faon suivante :
Leon 7 : Les t abl eaux
85
1- Le programme demande chaque lve de remplir un tableau nomm
rponse par les lettres de lalphabet dans lordre
2- Ensuite, le programme examine ce tableau lment par lment :
- Si la lettre est dans sa place, il laccepte
- Sinon, il la remplace par la lettre adquate et incrmente le
nombre de fautes
3- Enfin, le programme affiche le nombre total de fautes.
Exercice 7.4 : produit scalaire de 2 vecteurs
Ecrire une fonction ProdScal qui calcule le produit scalaire de deux
vecteurs U et V reprsents par deux tableaux.
Le produit scalaire de deux vecteurs :
U = (x
1
, x
2
,, x
n
) et V = (y
1
, y
2
,, y
n
)
est dfini par :
U.V = x
1
y
1
+ x
2
y
2
+ + x
n
y
n
=
n
1 i
i i
y x
Exercice 7.5 : norme dun vecteur
Ecrire une fonction NormVect qui calcule la norme dun vecteur et qui
utilise la fonction ProdScal de lexercice prcdent.
La norme dun vecteur U = (x
1
, x
2
,, x
n
)
est dfini par :
2
n
2
2
2
1
x ... x x U + + +
Exercice 7.6
Ecrire une procdure qui permet de remplir un tableau Fib par les 10
premiers termes de la suite de Fibonacci.
La suite de Fibonacci est dfinie par :
F
0
= 1
F
1
= 1
Leon 7 : Les t abl eaux
86
F
n
= F
n-2
+ F
n-1
pour n >1
Exercice 7.7
Ecrire un algorithme permettant de trouver tous les nombres premiers
infrieurs 400 et qui utilise la mthode suivante :
Crer un tableau T pouvant contenir 400 entiers
Initialiser chaque lment du tableau son indice cest--dire
T[1]=1 ; T[2]=2 ; T[400]=400
Remplacer tous les multiples de 2 par 0 sauf 2
Chercher le prochain lment diffrent de 0 dans le tableau cest
dire T[3] et remplacer tous les multiples de 3 par 0 sauf 3
Continuer ce processus jusqu avoir T[i] 20 (20 tant la racine
carre de 400)
Afficher tous les lments non nuls de T.
Exercice 7.8 : compression dun vecteur
Soit un vecteur U1 de composantes x
1
, x
2
, , x
n
non nulles et un vecteur
L de mme longueur dont les composantes sont 0 ou 1.
Ecrire une procdure qui fait la compression de U1 par L. Le rsultat est
un vecteur U2 dont les composantes sont, dans lordre, celles de U1 pour
lesquelles la composante de L vaut 1.
Exemple
U1 1 2 3 4 5 6 7
L 0 1 1 0 1 0 1
U2 2 3 5 7 0 0 0
Leon 7 : Les t abl eaux
87
Exercice 7.9 : recherche de la plus grande monotonie dans un tableau
Soit un tableau T de n lments, dterminer la longueur de la premire
plus longue squence de nombres rangs par ordre croissant et le rang de
son premier lment.
Exercice 7.10 : fusion de deux tableaux tris
Ecrire une procdure qui permet de fusionner deux tableaux tris A et B
contenant respectivement n et m lments. Le rsultat est un tableau tri
C (n+m) lments.
Exemple :
A 1 20 41 B 19 23 27 54 91
C 1 19 20 23 27 41 54 91
Exercice 7.11
Etant donn un tableau A de n nombres tris par ordre croissant. Ecrire
un algorithme qui permet de lire un rel R et linsrer dans sa bonne
position. Le rsultat sera un deuxime tableau B de longueur (n+1) et qui
est galement tri par ordre croissant.
Exemple :
A 1 2 5 8 10 25 R = 6
B 1 2 5 6 8 10 25
Exercice 7.12 : triangle de Pascal
Crer un tableau deux dimensions qui contiendra les n premires lignes
du triangle de Pascal.
Chaque lment du triangle de pascal est obtenu par la formule :
T[L,C] = T[L-1,C-1] + T[L-1,C]
Leon 7 : Les t abl eaux
88
A titre dexemple, pour n = 6, le triangle de pascal est :
1 0 0 0 0 0
1 1 0 0 0 0
1 2 1 0 0 0
1 3 3 1 0 0
1 4 6 4 1 0
1 5 10 10 5 1
Exercice 7.13 : la tour sur un chiquier
Sur un chiquier, cest--dire un tableau de 8 lignes et 8 colonnes, partir
dune case quelconque, marquer toutes les cases susceptibles dtre
atteintes en un coup par une tour. Au terme de lexcution, les cases
atteintes contiendront la valeur 1, les autres la valeur 0.
La tour peut se dplacer sur la ligne et sur la colonne correspondantes la
case o elle est situe.
Exemple
Si la tour se trouve la case (L=2 , C=3), le tableau final aura lallure
suivante :
0 0 1 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
Leon 7 : Les t abl eaux
89
Exercice 7.14 : le fou sur un chiquier
Sur un chiquier, cest--dire un tableau de 8 lignes et 8 colonnes, partir
dune case quelconque, marquer toutes les cases susceptibles dtre
atteintes en un coup par un fou. Au terme de lexcution, les cases
atteintes contiendront la valeur 1, les autres la valeur 0.
Le fou peut se dplacer sur les diagonales issues de la case o il est situ.
Exemple
Si le fou se trouve la case (L=4 , C=3), le tableau final aura lallure
suivante :
0 0 0 0 0 1 0 0
1 0 0 0 1 0 0 0
0 1 0 1 0 0 0 0
0 0 1 0 0 0 0 0
0 1 0 1 0 0 0 0
1 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
Remarque
Pour toutes les cases qui peuvent tre atteintes par le fou, lune des 2
relations suivantes est vrifie :
L C = 4 - 3 = 1
L + C = 4 + 3 = 7
Exercice 7.15 : le carr magique
Dans un tableau carr N lignes et N colonnes (N impair) ranger les
nombres entiers de 1 N
2
de manire ce que la somme des lments de
chaque ligne soit gale la somme des lments de chaque colonne et
la somme des lments de chaque diagonale.
Leon 7 : Les t abl eaux
90
Exemple
Le principe expos ci-aprs est lune des mthodes de cration dun carr
magique :
Pour commencer, 1 est plac dans la case centrale de la premire
ligne ;
Ensuite, les entiers de 2 N
2
sont placs les uns aprs les autres dans
les cases dune diagonale oriente nord-ouest.
Plusieurs cas particuliers peuvent se prsenter :
- Si on tombe hors du carr en haut, le nombre est plac dans la
dernire ligne sans changer de colonne ;
- Si on tombe hors du carr gauche, le nombre est plac dans la
colonne de droite sans changer de ligne ;
- Si on tombe sur une case dj occupe, le nombre est plac sous la
case prcdemment remplie. A chaque fois quun multiple de N est
plac dans une case, la case destine au nombre suivant est
normalement occupe.
6 1 8
T 7 5 3 est un carr magique dont somme S est 15
2 9 4
Leon 7 : Les t abl eaux
91
SOLUTIONS DES EXERCICES
Exercice 7.1 : frquence dapparition de x dans le tableau T
Fonction Frquence(T : Tab ; x : Entier) : Entier
Variables
i, cpt : Entier
Dbut
cpt 0
Pour i de 1 n Faire
Si (T[i] = x) Alors
cpt cpt + 1
FinSi
FinPour
Frquence cpt
Fin
Exercice 7.2 : clatement dun tableau
Procdure Eclater(T : Tab ; Var TP, TN : Tab)
Variables
i, j, k : Entier
Dbut
i 1 j 1 k 1
Pour i de 1 n Faire
Si (T[i] > 0) Alors
TP[j] T[i]
j j + 1
FinSi
Si (T[i] < 0) Alors
TN[k] T[i]
k k + 1
FinSi
Si (T[i] = 0) Alors
TP[j] T[i]
j j + 1
TN[k] T[i]
Leon 7 : Les t abl eaux
92
k k + 1
FinSi
FinPour
Fin
Exercice 7.3
Algorithme Alphabet
Constantes
n = 26
Types
Tab = Tableau[1..n] de Caractre
Variables
rponse : Tab
i, nb_fautes : Entier
Procdure Remplir(Var T : Tab)
Dbut
Pour i de 1 n Faire
Ecrire(Entrer un caractre :) Lire(T[i])
FinPour
Fin
Procdure Corriger(Var T : Tab ; Var nb : Entier)
Dbut
nb 0
Pour i de 1 n Faire
Si (Majus(T[i]) # Car(i+64)) Alors
T[i] Car(i+64)
nb nb + 1
FinSi
FinPour
Fin
Dbut
remplir(rponse)
corriger(rponse, nb_fautes)
Ecrire(Nombre de fautes : ,nb_fautes)
Fin.
Exercice 7.4 : calcul du produit scalaire de deux vecteurs
Leon 7 : Les t abl eaux
93
Fonction ProdScal(U : Tab ; V : Tab) : Rel
Variables
i : Entier
ps : Rel
Dbut
ps 0
Pour i de 1 n Faire
ps ps + U[i] * V[i]
FinPour
ProdScal ps
Fin
Exercice 7.5 : calcul de la norme dun vecteur
Fonction NormVect(U : Tab) : Rel
Dbut
NormVect Racine(ProdScal(U,U))
Fin
Exercice 7.6 : les 10 premiers termes de la suite de Fibonacci (de 0 9)
Procdure Fibonacci(Var fib : Tab)
Variables
i : Entier
Dbut
fib[0] 1
fib[1] 1
Pour i de 2 9 Faire
fib[i] fib[i-2] + fib[i-1]
FinPour
Fin
Leon 7 : Les t abl eaux
94
Exercice 7.7 : nombres premiers infrieurs 400
Algorithme Premiers
Constantes
n = 400
Types
Tab = Tableau[1..n] de Entier
Variables
Prem : Tab
i, j : Entier
Procdure initialiser(Var T : Tab)
Dbut
Pour i de 1 n Faire
T[i] i
FinPour
Fin
Procdure mise_a_zero(Var T : Tab)
Dbut
Pour i de 1 20 Faire
Si (T[i] # 0) Alors
Pour j de i+1 n Faire
Si (T[j] Mod T[i] = 0) Alors
T[j] 0
FinSi
FinPour
FinSi
FinPour
Fin
Procdure afficher(T : Tab)
Dbut
Pour i de 1 n Faire
Si (T[i] # 0) Alors
Ecrire(T[i])
FinSi
FinPour
Fin
Dbut
initialiser(Prem)
mise_a_zero(Prem)
afficher(Perm)
Fin.
Exercice 7.8 : compression dun vecteur
Leon 7 : Les t abl eaux
95
Procdure Compression(U1, L : Tab ; Var U2 : Tab)
Variables
i, j : Entier
Dbut
j 1
Pour i de 1 n Faire
Si (L[i] # 0) Alors
U2[j] U1[i]
j j+1
FinSi
FinPour
Pour i de (j+1) n Faire
U2[i] 0
FinPour
Fin.
Exercice 7.9 : recherche de la plus grande monotonie dans un tableau
Procdure Monotonie(T : Tab ; Var iplm, Lplm : Entier)
Variables
i, j, L : Entier
Dbut
i 1
Lplm 1
iplm 1
TantQue (i <= n) Faire
j i + 1
TantQue (T[j] >= T[j-1]) Faire
j j + 1
FinTQ
L j i + 1
Si (L > Lplm) Alors
iplm i
Lplm L
FinSi
i j
FinTQ
Fin
Exercice 7.10 : fusion de 2 tableaux tris
Procdure Fusion(A : Tab1 ; B : Tab2 ; Var C : Tab3)
Leon 7 : Les t abl eaux
96
Variables
i, j, k : Entier
Dbut
i 1 j 1 k 1
TantQue (i <= n) et (j <= m) Faire
Si (A[i] <= B[j]) Alors
C[k] A[i]
i i + 1
k k + 1
FinSi
Si (B[j] <= A[i]) Alors
C[k] B[j]
j j + 1
k k + 1
FinSi
FinTQ
TantQue (i <= n) Faire
C[k] A[i]
i i + 1
k k + 1
FinTQ
TantQue (j <= m) Faire
C[k] B[j]
j j + 1
k k + 1
FinTQ
Fin
Leon 7 : Les t abl eaux
97
Exercice 7.11 : insertion dun lment dans un tableau tri
Procdure Insertion(A : Tab1; R : Entier; Var B : Tab2)
Variables
i, j : Entier
Dbut
i 1
TantQue (A[i] <= R) et (i <= n) Faire
B[i] A[i]
i i + 1
FinTQ
B[i] R
i i + 1
TantQue (i <= n) Faire
B[i] A[i]
i i + 1
FinTQ
Fin
Exercice 7.12 : triangle de Pascal
Procdure Pasc(n:Entier; Var T:Tableau[1..n,1..n] de Entier)
Variables
i, j : Entier
Dbut
(* Initialisation du tableau zro *)
Pour i de 1 n Faire
Pour j de 1 n Faire
T[i,j] 0
FinPour
FinPour
(* Remplissage du tableau *)
Pour i de 1 n Faire
T[i,1] 1
Pour j de 2 i Faire
T[i,j] T[i-1,j-1] + T[i-1,j]
FinPour
FinPour
Fin
Leon 7 : Les t abl eaux
98
Exercice 7.13 : la tour sur un chiquier
Procdure tour(L,C : Entier ; Var T : Tableau[1..8,1..8] de Entier)
Variables
i, j : Entier
Dbut
Pour i de 1 8 Faire
Pour j de 1 8 Faire
Si (i = L) OU (j = C) Alors
T[i,j] 1
Sinon
T[i,j] 0
FinSi
FinPour
FinPour
Fin
Exercice 7.14 : le fou sur un chiquier
Procdure fou(L,C : Entier ; Var T : Tableau[1..8,1..8] de Entier)
Variables
i, j : Entier
Dbut
Pour i de 1 8 Faire
Pour j de 1 8 Faire
Si (i-j = L-C) OU (i+j = L+C) Alors
T[i,j] 1
Sinon
T[i,j] 0
FinSi
FinPour
FinPour
Fin
Leon 7 : Les t abl eaux
99
Exercice 7.15 : le carr magique
Procdure carr(n : Entier; Var T: Tableau[1..n,1..n] de Entier)
Variables
i, j, L, C : Entier
Dbut
(* mettre 1 dans la case centrale de la 1re ligne *)
C (n + 1) Div 2
T[1,C] 1
(* remplissage du reste du tableau *)
i 1
L 1
TantQue (i <= n^2) Faire
Si (i Mod n = 0) Alors (* case occupe *)
L L + 1
Sinon
Si (L = 1) Alors (* dbordement de ligne *)
L n
Sinon
L L 1
FinSi
Si (C = 1) Alors (* dbordement de colonne *)
C n
Sinon
C C 1
FinSi
FinSi
i i + 1
T[L,C] i
FinTQ
Fin
Leon 8 : Les enr egi st r ement s
100
Le on 8 : Les enr egi st r ement s
O b j e c t i f
Manipuler correctement des variables de type enregistrement.
I. Notion denregistrement
Les variables que nous avons jusqu prsent utilises ne se constituent
que dun seul type de donnes (Entier, Rel, Caractre, etc.).
Les tableaux constituent une extension puisque nous y dclarons une
variable compose de plusieurs lments de mme type.
Un enregistrement (ou article) permet de rassembler un ensemble
dlments de types diffrents sous un nom unique. On dfinit ainsi un
type compos.
A titre dexemple, une date, une adresse ou nombre complexe peuvent
tre considrs comme des enregistrements.
II. Dclaration des variables de type enregistrement
Un enregistrement peut tre dfini par une dclaration de type contenant
une liste de champs prcde par le mot Struct et termine par FinStruct.
Exemples
Dfinition dune adresse :
Types
Adresse = Struct
Rue : Chane
Ville : Chane
CP : Entier
FinStruct
Variables
Adr : Adresse
Dfinition dun produit :
Leon 8 : Les enr egi st r ement s
101
Types
Produit = Struct
Codp : Entier
Libell : Chane
Prix_Unit : Rel
Stock : Rel
FinStruct
Variables
P1, P2 : Produit
Exercice
Dfinir le type nombre complexe.
Solution
Types
Complexe = Struct
Reel : Rel
Imag : Rel
FinStruct
Variables
C : Complexe
III. Manipulation des variables de type enregistrement
Les enregistrements ne peuvent tre rfrencs globalement dans une
instruction car ils sont composs dlments de types diffrents. Par
contre, il est possible de faire rfrence chaque lment dun
enregistrement.
Pour cela, il est ncessaire de prciser le nom (identificateur) de
lenregistrement, suivi dun suffixe indiquant lidentificateur du champ
concern. Les deux identificateurs sont spars par un point.
Leon 8 : Les enr egi st r ement s
102
Exemple
Adr.Rue Ibn Rochd
Adr.Ville Monastir
Adr.CP 5000
Remarque
Il est possible dutiliser loprateur daffectation entre deux
enregistrements de mme type comme dans lexemple suivant :
P1 P2
{
P1.Codp P2.Codp
P1.Libell P2.Libell
P1.Prix_Unit P2.Prix_Unit
P1.Stock P2.Stock
De mme, on peut effectuer une comparaison galitaire ou ingalitaire
entre deux enregistrements de mme type comme dans les 2 exemples
suivants :
Si (P1 = P2) Alors
TantQue (P1 # P2) Faire
EXERCICES DAPPLICATION
Exercice 8.1
Ecrire un algorithme qui lit deux nombres complexes C1 et C2 et qui
affiche ensuite leur somme et leur produit.
On utilisera les formules de calcul suivantes :
(a + bi) + (c + di) = (a + c) + (b + d)i
(a + bi) (c + di) = (ac - bd) + (ad + bc)i
Leon 8 : Les enr egi st r ement s
103
Exercice 8.2
Crer un tableau TabEmp qui contiendra les informations sur les 50
employs dune entreprise (Matricule, Nom, Salaire, Etat_Civil), le
remplir puis afficher le nombre demploys dont le salaire est compris
entre 500 et 700 D.
Leon 8 : Les enr egi st r ement s
104
SOLUTIONS DES EXERCICES
Exercice 8.1 : somme et produit de deux nombres complexes
Algorithme CalculComplexe
Types
Complexe = Struct
Reel : Rel
Imag : Rel
FinStruct
Variables
C1, C2, S, P : Complexe
Dbut
Ecrire(Partie relle du 1er nombre : )
Lire(C1.Reel)
Ecrire(Partie imaginaire du 1er nombre : )
Lire(C1.Imag)
Ecrire(Partie relle du 2me nombre : )
Lire(C2.Reel)
Ecrire(Partie imaginaire du 2me nombre : )
Lire(C2.Imag)
S.Reel C1.Reel + C2.Reel
S.Imag C1.Imag + C2.Imag
Ecrire(Somme = ,S.Reel, +,S.Imag, i)
P.Reel (C1.Reel*C2.Reel) (C1.Imag*C2.Imag)
P.Imag (C1.Reel*C2.Imag) + (C1.Imag*C2.reel)
Ecrire(Produit = ,P.Reel, +,P.Imag, i)
Fin.
Exercice 8.2 : tableau des employs
Algorithme Personnel
Constantes
n = 50
Types
Employ = Struct
Matricule : Entier
Nom : Chane
Sal : Rel
Etat_Civil : Caractre
FinStruct
Tab = Tableau[1..n] de Employ
Variables
TabEmp : Tab
Leon 8 : Les enr egi st r ement s
105
i, nb : Entier
Procdure remplir(Var T : Tab)
Dbut
Pour i de 1 n Faire
Ecrire(Matricule de lemploy : )
Lire(T[i].Matricule)
Ecrire(Nom de lemploy : )
Lire(T[i].Nom)
Ecrire(Salaire de lemploy : )
Lire(T[i].Sal)
Ecrire(Etat civil de lemploy : )
Lire(T[i].Etat_Civil)
FinPour
Fin
Fonction compter(T : Tab) : Entier
Dbut
Compter 0
Pour i de 1 n Faire
Si (T[i].Sal >= 500) ET (T[i].sal <= 700) Alors
Compter Compter + 1
FinSi
FinPour
Fin
Dbut
Remplir(TabEmp)
nb Compter(TabEmp)
Ecrire(nb, employs touchent entre 500 et 700 D)
Fin.
Leon 9 : Les fi chi er s squent i el s
106
Le on 9 : Les f i c hi er s squent i el s
O b j e c t i f s
- Comprendre les concepts de base relatifs aux fichiers
- Manipuler des fichiers organisation squentielle.
I. Notion de fichier
Dans tous les programmes que nous avons jusqu prsent dvelopps le
stockage des donnes se fait en mmoire vive qui est volatile et de
capacit limite. Or, la plupart des applications ncessitent une
sauvegarde permanente des donnes.
Pour viter la perte de ces informations au dbranchement de
lordinateur, on utilise des fichiers.
I.1 . Dfinition
Un fichier est une structure de donnes forme de cellules contigus
permettant limplantation dune suite de donnes en mmoire secondaire
(disque, disquette, CD-ROM, bande magntique, etc.)
Chaque lment de la suite est appel article et correspond gnralement
un enregistrement.
Exemples :
liste des tudiants dune institution
tat des produits stocks dans un magasin
liste des employs dune entreprise.
Leon 9 : Les fi chi er s squent i el s
107
I.2. Elments attachs un fichier
On appelle nom interne dun ficher le nom sous lequel un fichier est
identifi dans un programme.
On appelle nom externe dun fichier le nom sous lequel le fichier est
identifi en mmoire secondaire. Ce nom est compos de trois
parties:
- lidentifiant du support
- le nom du fichier proprement dit
- une extension (ou suffixe) qui prcise le genre du fichier
(donne, texte, programme, etc.)
Ainsi, A:nombres.DAT dsigne un fichier de donnes stock sur la
disquette et qui sappelle nombres.
On appelle tampon ou buffer dun fichier, une zone de la mmoire
principale pouvant contenir un enregistrement du fichier. Cest une
fentre travers laquelle on voit le fichier.
Un fichier possde toujours un enregistrement supplmentaire la fin
appel marque de fin de fichier (FDF) permettant de le borner (fig.
12) :
Ficher FDF
Figure 12. Structure dun fichier
Chaque fichier est caractris par :
- un mode dorganisation : squentielle, squentielle indexe,
relative ou slective.
- un mode daccs : squentiel ou direct
Tampon ou Fentre
Leon 9 : Les fi chi er s squent i el s
108
Un fichier organisation squentielle (F.O.S) ne permet que laccs
squentiel : pour atteindre larticle de rang n, il est ncessaire de parcourir
les (n-1) articles prcdents.
Laccs direct se fait soit en utilisant le rang de lenregistrement (cas de
lorganisation relative) comme dans les tableaux, soit en utilisant une cl
permettant didentifier de faon unique chaque enregistrement (cas de
lorganisation squentielle indexe et slective).
Remarque
Les caractristiques dun fichier sont troitement lies aux langages de
programmation qui offrent chacun diffrents types de fichiers.
II. Dclaration dun fichier organisation squentielle
Pour dclarer une variable de type fichier, il faut spcifier :
- le nom du fichier
- le type des lments du fichier
Exemple
Types
Etudiant = Struct
Numro : Entier
Nom : Chane[30]
Prnom : Chane[30]
Classe : Chane[5]
FinStruct
Fetud = Fichier de Etudiant
Variables
Fe : Fetud
et : Etudiant (* variable tampon *)
Leon 9 : Les fi chi er s squent i el s
109
III. Manipulation des fichiers organisation squentielle
Toute manipulation dun fichier ncessite 3 phases :
1- Ouverture du fichier :
Ouvrir(NomFichier, mode)
Un fichier peut tre ouvert en mode lecture (L) ou en mode criture (E).
Aprs louverture, le pointeur pointe sur le premier enregistrement du
fichier.
2- Traitement du fichier :
Lire(NomFichier, fentre)
Cette primitive a pour effet de copier lenregistrement actuel dans la
fentre du fichier. Aprs chaque opration de lecture, le pointeur passe
lenregistrement suivant. Si on veut lire une information en amont du
pointeur, il faut rouvrir le fichier et le lire jusqu linformation dsire.
Ecrire(NomFichier, fentre)
Cette primitive a pour effet de copier le contenu de la fentre sur le
fichier en mmoire secondaire. Dans un fichier organisation
squentielle, lajout dun nouveau article se fait toujours en fin de fichier.
3- Fermeture du fichier :
Fermer(NomFichier)
Leon 9 : Les fi chi er s squent i el s
110
Remarque
La fonction boolenne FDF(NomFichier) permet de tester si la fin du
fichier est atteinte. Sa valeur est dtermine par le dernier ordre de lecture
excut.
III.1. Cration dun Fichier organisation squentielle
Ecrire une procdure permettant de crer et remplir le fichier des
tudiants.
Procdure Cration(Var fe : Fetud)
Variables
et : Etudiant
Dbut
Ouvrir(fe,E)
Ecrire(Numro de ltudiant : )
Lire(et.Numro)
TantQue (et.Numro # 0) Faire
Ecrire(Nom de ltudiant : )
Lire(et.Nom)
Ecrire(Prnom de ltudiant : )
Lire(et.Prnom)
Ecrire(Classe de ltudiant : )
Lire(et.Classe)
Ecrire(fe,et)
Ecrire(Numro de ltudiant : )
Lire(et.Numro)
FinTQ
Fermer(fe)
Fin
Dans cette procdure, lutilisateur doit entrer la valeur 0 pour le champ
numro pour indiquer la fin de la saisie tant donn que le nombre
dtudiants nest pas connu lavance.
Leon 9 : Les fi chi er s squent i el s
111
III.2. Parcours dun fichier organsation squentielle
Ecrire une procdure permettant dafficher la liste des tudiants partir
du fichier fe .
Procdure Consultation(fe : Fetud)
Variables
et : Etudiant
Dbut
Ouvrir(fe,L)
Lire(fe,et)
TantQue NON(FDF(fe)) Faire
Ecrire(et.Numro,et.Nom,et.Prnom,et.classe)
Lire(fe,et)
FinTQ
Fermer(fe)
Fin
IV. Les fichiers de type texte
Les fichiers de texte sont des fichiers squentiels qui contiennent des
caractres organiss en lignes. La prsentation sous forme de ligne est
obtenue grce la prsence des caractres de contrle :
- retour chariot (not souvent CR), de code ASCII 13
- saut de ligne (not souvent LF) de code ASCII 10.
Un fichier texte peut tre dclar de 2 faons diffrentes :
Variables
ftext : Fichier de Caractre
ou
Variables
ftext : Fichier Texte
Remarques
1- Un fichier de type texte peut tre trait ligne par ligne ou
caractre par caractre
Leon 9 : Les fi chi er s squent i el s
112
2- Dans un fichier de type texte, la primitive
Lire_Lig(NomFichier,Fentre) permet de lire une ligne du
fichier et la transfrer dans la fentre.
3- De mme, la fonction boolenne FDL(NomFichier) permet de
vrifier si le pointeur a atteint la fin dune ligne.
Exercice
Ecrire lalgorithme dune procdure qui lit et affiche le contenu dun
fichier de type texte.
Solution
Procdure ParcoursFichText(ftext : Fichier texte)
Variables
ligne : Chane
Dbut
Ouvrir(ftext,L)
Lire(ftext,ligne)
TantQue Non(FDF(ftext)) Faire
Ecrire(ligne)
Lire(ftext,ligne)
FinTQ
Fermer(ftext)
Fin
Leon 9 : Les fi chi er s squent i el s
113
EXERCICES DAPPLICATION
Exercice 9.1
Ecrire un algorithme permettant de :
- Crer et remplir un fichier Fp qui contient des informations sur le
personnel dune entreprise (matricule, nom, prnom, grade, salaire).
- Afficher la liste des employs de cette entreprise dont le salaire est
compris entre 500 et 700 D.
Exercice 9.2
Ecrire une procdure permettant de rechercher un employ dans le fichier
Fp partir de son matricule.
- Si lemploy est trouv, lalgorithme affiche son nom, son prnom et
son grade
- Sinon, il affiche le message ce matricule ne figure pas dans le
fichier
Exercice 9.3
Ecrire un algorithme permettant de :
- Crer et remplir un fichier fnotes qui contient les notes de 30
tudiants
- Copier les notes dans un tableau Tnote
- Trier le tableau Tnote dans lordre croissant
- Copier les notes tries du tableau vers le fichier fnotes.
Leon 9 : Les fi chi er s squent i el s
114
SOLUTIONS DES EXERCICES
Exercice 9.1 : fichier personnel
Algorithme Personnel
Types
Employ = Struct
Matricule : Entier
Nom : Chane
Prnom : Chane
Grade : Caractre
Sal : Rel
FinStruct
Fpers = Fichier de Employ
Variables
Fp : Fpers
emp : Employ
Procdure Cration(Var f : Fpers)
Dbut
Ouvrir(f,E)
Ecrire(Matricule : ) Lire(emp.Matricule)
TantQue (emp.Matricule # 0) Faire
Ecrire(Nom : ) Lire(emp.Nom)
Ecrire(Prnom : ) Lire(emp.Prnom)
Ecrire(Grade : ) Lire(emp.Grade)
Ecrire(Salaire : ) Lire(emp.Sal)
Ecrire(f,emp)
Ecrire(Matricule : ) Lire(emp.Matricule)
FinTQ
Fermer(f)
Fin
Procdure Consultation(f : Fpers)
Dbut
Ouvrir(f,L)
Lire(f,emp)
TantQue NON(FDF(f)) Faire
Si (emp.Sal>=500) ET (emp.Sal<=700) Alors
Ecrire(emp.Matricule, emp.Nom, emp.Sal)
Leon 9 : Les fi chi er s squent i el s
115
FinSi
Lire(f,emp)
FinTQ
Fermer(f)
Fin
Dbut
Cration(Fp)
Consultation(Fp)
Fin.
Exercice 9.2 : recherche dun employ dans le fichier personnel
Procdure Recherche(Fp : Fpers ; x : Entier)
Variables
emp : Employ
Dbut
Ouvrir(Fp,L)
Lire(Fp,emp)
Trouve (emp.Matricule = x)
TantQue (trouve = Faux) ET NON(FDF(Fp)) Faire
Lire(Fp,emp)
Trouve (emp.Matricule = x)
FinTQ
Si FDF(Fp) Alors
Ecrire(Ce matricule ne figure pas dans le
fichier)
Sinon
Ecrire(emp.Nom, emp.Prnom, emp.Grade)
FinSi
Fermer(Fp)
Fin
Leon 9 : Les fi chi er s squent i el s
116
Exercice 9.3 : tri du fichier fnotes
Algorithme Notes
Variables
fnotes : Fichier de Rel
Tnote : Tableau[1..30] de Rel
x, note : Rel
change : Boolen
i : Entier
Dbut
(* Cration du fichier fnotes *)
Ouvrir(fnotes,E)
Pour i de 1 30 Faire
Ecrire(Entrer une note : ) Lire(note)
Ecrire(fnotes,note)
FinPour
Fermer(fnotes)
(* Copie du fichier fnotes dans le tableau Tnote *)
Ouvrir(fnotes,L)
Pour i de 1 30 Faire
Lire(fnotes,note)
Tnote[i] note
FinPour
Fermer(fnotes)
(* Tri du tableau Tnote *)
Rpter
change Faux
Pour i de 1 29 Faire
Si (Tnote[i] > Tnote[i+1]) Alors
x Tnote[i]
Tnote[i] Tnote[i+1]
Tnote[i+1] x
change Vrai
FinSi
FinPour
Jusqu (change = Faux)
(* Copie du tableau Tnote dans le fichier fnotes *)
Leon 9 : Les fi chi er s squent i el s
117
Ouvrir(fnotes,E)
Pour i de 1 30 Faire
Ecrire(fnotes,Tnote[i])
FinPour
Fermer(fnotes)
Fin.
Leon 10 : La r cur si vi t
118
Le on 10 : La r c ur si vi t
O b j e c t i f s
- Rsoudre des problmes rcursifs
- Comparer les approches de programmation itrative et rcursive.
I. Notion de rcursivit
La rcursivit est une technique de programmation alternative
litration qui permet de trouver, lorsquelle est bien utilise, des
solutions trs lgantes un certain nombre de problmes.
Une procdure ou fonction est dite rcursive si son corps contient un ou
plusieurs appels elle-mme :
Procdure Precur(paramtres)
Dbut
Precur(valeurs)
Fin
Utiliser la rcursivit revient dfinir :
- une solution pour un ensemble de cas de base (sans utiliser dappels
rcursifs)
- une solution dans le cas gnral travers une relation de rcurrence
avec des cas plus simples. Cette relation doit permettre darriver un
cas de base en un nombre fini dtapes.
Leon 10 : La r cur si vi t
119
II. Etude dun exemple : la fonction factorielle
Solution itrative
Fonction Facto( n : Entier) : Entier
Variables
n, i, f : Entier
Dbut
f 1
Pour i de 2 n Faire
f f * i
FinPour
Facto f
Fin
Solution rcursive
La relation de rcurrence est dfinie par :
0 ! = 1
n ! = n * (n-1)!
Cette relation donne la fonction rcursive suivante :
Fonction Facto( n : Entier) : Entier
Dbut
Si (n = 0) Alors
Facto 1
Sinon
Facto n * Facto(n-1)
FinSi
Fin
Leon 10 : La r cur si vi t
120
III. Mcanisme de fonctionnement de la rcursivit
Considrons le calcul de 4! par la fonction rcursive dfinie ci-dessus :
Facto(4) renvoie 4 * Facto(3)
Facto(3) renvoie 3 * Facto(2)
Facto(2) renvoie 2 * Facto(1)
Facto(1) renvoie 1 * Facto(0)
Facto(0) renvoie 1 (arrt de la rcursivit)
Facto(1) renvoie 1 * 1 = 1
Facto(2) renvoie 2 * 1 = 2
Facto(3) renvoie 3 * 2 = 6
Facto(4) renvoie 4 * 6 = 24
IV. Performances de la rcursivit
Les problmes de mmoire et de rapidit sont les critres qui permettent
de faire le choix entre la solution itrative et la solution rcursive.
Pour le calcul de la fonction factorielle, les diffrences entre les deux
solutions ne se voient pas trop. Pour lutilisation de la mmoire, il y aura
dpassement dans les calculs avant la saturation de la mmoire.
Le calcul de la suite de fibonacci est le parfait contre-exemple de la
solution rcursive.
La relation de rcurrence est dfinie par :
f
0
= 1
f
1
= 1
f
n
= f
n-2
+ f
n-1
pour n > 1
La solution rcursive vient immdiatement de cette relation :
Fonction Fibo( n : Entier) : Entier
Dbut
Si (n = 0) ou (n = 1) Alors
Fibo 1
Sinon
Fibo Fibo(n - 2) + Fibo(n 1)
FinSi
Fin
Leon 10 : La r cur si vi t
121
On remarque que la fonction effectue deux appels, donc pour les valeurs
importantes de n on aura des temps dexcution importants (attente du
rsultat).
A titre dexemple, voici le schma de calcul de Fibo(4) (figure 13) :
Figure 13. Appels rcursifs pour le calcul de Fibo(4)
Fibo(4) = Fibo(3) + Fibo(2)
= (Fibo(2) + Fibo(1)) + Fibo(2)
= ((Fibo(1) + Fibo(0)) + Fibo(1)) + Fibo(2)
= ((1 + Fibo(0)) + Fibo(1)) + Ffibo(2)
= ((1 + 1) + Fibo(1)) + Fibo(2)
= (2 + Fibo(1)) + Fibo(2)
= (2 + 1) + Fibo(2)
= 3 + Fibo(2)
= 3 + (Fibo(1) + Fibo(0))
= 3 + (1 + Fibo(0))
= 3 + (1 + 1)
= 3 + 2
= 5
Le nombre d'appels rcursifs est donc trs lev (9 pour Fibo(4), 15 pour
Fibo(5), 25 pour Fibo(6) et 21891 pour Fibo(20)), d'autant plus qu'il
existe une mthode itrative simple qui calcule simultanment Fibo(n) et
Fibo(n-1) :
Fibo(4)
Fibo(3) Fibo(2)
Fibo(1)
Fibo(0)
Fibo(1) Fibo(2)
Fibo(1) Fibo(0)
Leon 10 : La r cur si vi t
122
Fonction Fibo(n : Entier) : Entier
Variables
i, fn, fn_1, fn_2 : Entier
Dbut
fn_1 1
fn_2 1
Pour i de 2 n Faire
fn fn_1 + fn_2
fn_2 fn_1
Fn_1 fn
FinPour
Fibo fn
Fin
V. Rcursivit indirecte ou croise
On dit quon a une rcursivit indirecte ou une rcursivit croise
lorsquune procdure A, sans appel rcursif, appelle une procdure B qui
appelle A.
Exemple
Procdure A(paramtres)
Dbut
B(valeurs)
Fin
Procdure B(paramtres)
Dbut
A(valeurs)
Fin
VI. Choix entre itration et rcursivit
Le choix de la solution itrative peut tre impos par le langage de
programmation. En effet, certains langages tels que Cobol et T. Basic ne
sont pas rcursifs.
Dautre part, seuls les problmes dont la solution se base sur une relation
de rcurrence avec une condition de sortie peuvent tre rsolus de faon
rcursive.
Outre ces deux contraintes, le choix doit tre fait uniquement en fonction
des critres defficacit (contraintes de temps et despace). Si la solution
rcursive satisfait ces critres, il ny a pas lieu de chercher
systmatiquement une solution itrative.
Leon 10 : La r cur si vi t
123
Exercice : tours de Hanoi
Le problme des tours de Hanoi est un grand classique de la rcursivit
car la solution itrative est relativement complexe. On dispose de 3 tours
appeles A, B et C. La tour A contient n disques empils par ordre de
taille dcroissante quon veut dplacer sur la tour B dans le mme ordre
en respectant les contraintes suivantes :
On ne peut dplacer quun disque la fois
On ne peut empiler un disque que sur un disque plus grand ou sur
une tour vide.
Ainsi, le paramtrage de la procdure dplacer sera le suivant :
Procdure dplacer(n : Entier ; A, B, C : Caractre)
Lorsque la tour A ne contient quun seul disque, la solution est vidente :
il sagit de raliser un transfert de la tour A vers B. Ce cas constitue donc
la condition de sortie (point dappui).
Ainsi, pour dplacer n disques de A vers B en utilisant ventuellement C,
il faut :
1- dplacer (n-1) disques de A vers C en utilisant ventuellement B
2- raliser un transfert du disque de A sur B
3- dplacer (n-1) disques de C vers B en utilisant ventuellement A.
Procdure dplacer (n : Entier; A,B,C : Caractre);
Dbut
Si (n=1) Alors
Ecrire(A,' -> ',B)
Sinon
dplacer(n-1, A, C, B);
Ecrire(A,' -> ',B);
dplacer(n-1, C, B, A);
FinSi
Fin
Voici le rsultat de lexcution de cette procdure avec 3 disques placs
initialement sur A (figure 14) :
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
Leon 10 : La r cur si vi t
124
A B C
Figure 14. Trace dexcution de la procdure
dplacer(3,A,B,C)
Leon 10 : La r cur si vi t
125
EXERCICES DAPPLICATION
Exercice 10.1 : calcul du PGCD par la mthode dEuclide
Ecrire une fonction rcursive PGCD_Euc qui retourne le PGCD de 2
entiers A et B en utilisant lalgorithme dEuclide qui sappuie sur les
proprits suivantes :
PGCD(A,B) = B Si B est un diviseur de A
PGCD(A,B) = PGCD(B,A mod B) Sinon
Exemple : PGCD(36,20) = PGCD(20,16) = PGCD(16,4) = 4.
Exercice 10.2 : nombre de combinaisons de p lments parmi n.
Ecrire une fonction rcursive CNP qui calcule le nombre de
combinaisons de p lments pris parmi n lments diffrents par la
formule suivante :
n C
n
1
1
n
n
C
1
1 1
+
p
n
p
n
p
n
C C C
Exercice 10.3 : palindrome
Ecrire une fonction rcursive Palind qui vrifie si une chane de
caractres est un palindrome ou non.
Formellement, une chane S de n caractres est un palindrome si et
seulement si :
[ [ 1 , 2 1 , + i n S i S div n i i
Une condition ncessaire est que les caractres extrmes soient identiques
et que la sous chane prive des caractres extrmes soit galement un
palindrome.
Leon 10 : La r cur si vi t
126
Exercice 10.4 : fonction dAckermann
Ecrire une fonction rcursive Ack qui calcule Ack(n,m) selon la formule
suivante :
Ack(0,m) = m + 1
Ack(n,0) = Ack(n-1,1)
Ack(n,m) = Ack(n-1,Ack(n,m-1))
Vrifier que : Ack(1,n) = n + 2, Ack(2,n) 2 * n, Ack(3,n) 2
n
.
Exercice 10.5 : fonction 91 de MacCarthy
1- Ecrire une fonction rcursive f qui calcule f(n) selon la formule
suivante :
f(n) = n - 10 Si n > 100
f(n) = f(f(n+11)) Sinon
2- Calculer f(96).
Exercice 10.6 : fonction de Morris
Soit la fonction rcursive suivante :
Fonction g(m, n : Entier) : Entier
Dbut
Si (m = 0) Alors
g 1
Sinon
g g(m 1,g(m,n))
FinSi
Fin
Calculer g(1,0).
Leon 10 : La r cur si vi t
127
SOLUTIONS DES EXERCICES
Exercice 10.1 : calcul du PGCD(a,b) par la mthode dEuclide
On suppose que a et b sont strictement positifs.
Fonction PGCD_Euc(a,b : Entier) : Entier
Dbut
Si (a Mod b = 0) alors
PGCD_Euc b
Sinon
PGCD_Euc PGCD_Euc(b,a mod b)
FinSi
Fin
Exercice 10.2 : nombre de combinaisons de p lments parmi n
Fonction CNP(n,p : Entier) : Entier
Dbut
Si (p = 1) alors
CNP n
Sinon
Si (p = n) Alors
CNP 1
Sinon
CNP CNP(n-1,p) + CNP(n-1,p-1)
FinSi
FinSi
Fin
Exercice 10.3 : palindrome (version rcursive)
Fonction Palind(s : Chane) : Boolen
Dbut
Si (Longueur(s) < 2) Alors
Palind Vrai
Sinon
Palind (s[1]=s[longueur(s)]) ET
(Palind(copie(s,2,longueur(s)-2)))
FinSi
Fin
Exercice 10.4 : fonction dAckerman
Leon 10 : La r cur si vi t
128
Fonction Ack(a,b : Entier) : Entier
Dbut
Si (a = 0) Alors
Ack b + 1
Sinon
Si (b = 0) Alors
Ack Ack(a-1,1)
Sinon
Ack Ack(a-1,Ack(a,b-1))
FinSi
FinSi
Fin
Exercice 10.5 : fonction 91 de MacCarthy
Fonction F91(x : Entier) : Entier
Dbut
Si (x > 100) Alors
F91 x - 10
Sinon
F91 F91(F91(x + 11))
FinSi
Fin
F91(96) = F91(F91(107)) = F91(97) = F91(F91(108)) = F91(98) =
F91(F91(109)) = F91(99) = F91(F91(110)) = F91(100) = F91(F91(111))
= F91(101) = 91.
Exercice 10.6 : fonction de Morris
g(1,0) = g(0,g(1,0))
= g(0,g(0,g(1,0)))
= g(0,g(0,g(0,g(1,0))))
=
Impossible de calculer g(1,0) ; la rcursivit ne sarrte plus.
Leon 11 : St r uct ur es de donnes dynami ques
129
Le on 11 : St r uc t ur es de donnes dynami ques
O b j e c t i f
Manipuler correctement des structures de donnes dynamiques.
I. Introduction
Le but de cette leon est de grer un ensemble fini dlments dont le
nombre varie au cours de lexcution du programme. Les lments de cet
ensemble peuvent tre de diffrentes sortes : nombres entiers ou rels,
chanes de caractres ou des objets informatiques plus complexes comme
les identificateurs de processus ou les expressions arithmtiques.
On ne sintressera pas aux lments de lensemble en question mais aux
oprations que lon effectue sur cet ensemble. Plus prcisment, les
oprations que lon sautorise sur un ensemble E sont le suivantes :
tester si lensemble E est vide
ajouter llment x lensemble E
vrifier si llment x appartient lensemble E
supprimer llment x de lensemble E
Cette gestion des ensembles doit, pour tre efficace, rpondre deux
critres parfois contradictoires : un minimum despace mmoire utilis et
un minimum dinstructions lmentaires pour raliser une opration.
II. Les variables dynamiques
Jusquici, nous avons utilis des variables dites statiques .
Une variable statique est caractrise par les proprits suivantes :
- elle est dclare en tte du bloc o elle est utilise
- elle occupe un espace mmoire dont la taille est fixe ds le
dbut pour quon y place ses valeurs
- laccs la valeur se fait par le nom de la variable.
Leon 11 : St r uct ur es de donnes dynami ques
130
Au contraire, une variable dynamique est caractrise par les proprits
suivantes :
- elle peut tre cre et dtruite au cours de lexcution du bloc
dans lequel elle est dclare
- lespace mmoire rendu libre peut tre rcupr
- laccs la valeur se fait par un pointeur.
II.1 Variable pointeur et variable pointe
Un pointeur P est une variable statique dont les valeurs sont des
adresses. Une variable dynamique pointe par P sera note P^.
Le type de la variable pointe est appel type de base.
Exemple
P P^
La variable pointeur P a pour valeur 43. Elle pointe sur lespace mmoire
P^ dadresse 43 et dont le contenu est la chane Tunis.
Lalgorithe suivant permet de crer et initialiser un pointeur P :
Algorithme Pteur
Types
Pointeur = ^Chane
Variables
P : Pointeur
Dbut
Allouer(P) (* cration du pointeur P *)
P^ Tunis
Fin.
43
Tunis
Leon 11 : St r uct ur es de donnes dynami ques
131
II.2 Oprations sur les pointeurs
Il ne faut pas confondre les oprations sur les pointeurs avec les
oprations sur les variables pointes (figure 15).
a b c
Figure 15. oprations sur les pointeurs
Supposons quon soit dans la situation initiale illustre par la figure 15a :
Si linstruction :
P Q
est excute, nous passerons la nouvelle situation illustre par la figure
15b. Dans ce cas, on a :
P^ = Q^ = Sousse
et si lon modifie la valeur de Q^, P^ sera galement modifi et restera
gal Q^.
Par contre, si linstruction :
P^ Q^
est excute, nous passerons la nouvelle situation illustre par la figure
15c. Dans ce cas, on a galement :
P^ = Q^ = Sousse
mais si lon modifie la valeur de Q^, P^ ne sera pas modifi.
Tunis
P P^
Sousse
Q Q^
Tunis
P P^
Sousse
Sousse
P P^
Sousse
Q Q^
Q Q^
Leon 11 : St r uct ur es de donnes dynami ques
132
III. Les listes chanes
La structure de liste est utilise pour reprsenter un ensemble dlments
contenus chacun dans une cellule. Celle-ci contient en plus de llment,
ladresse de llment suivant appele pointeur. La rfrence vers la
premire cellule est contenue dans un pointeur nomm tte de liste. Une
liste chane est accessible uniquement par sa tte (figure 16).
Figure 16. Structure dune liste chane
Nil est une constante prdfinie qui indique la fin de la liste.
En supposant que les lments de la liste sont des entiers, celle-ci se
dclare de la faon suivante :
Types
Liste = ^Cellule
Cellule = Struct
Elem : entier
Suiv : Liste
FinStruct
Variables
L : Liste
III.1. Cration dune liste chane
La procdure suivante permet de crer une liste chane de n lments de
type entier.
Procdure CratListe(n : Entier, Var L : Liste)
Variables
Tte, P : Liste
i : Entier
Dbut
Allouer(Tte)
Ecrire(Entrer llment de tte : ) Lire(Tte^.Elem)
e1 e2 e3
Tte de liste
Fin de
liste (Nil)
Leon 11 : St r uct ur es de donnes dynami ques
133
Tte^.Suiv Nil
L Tte
Pour i de 2 n Faire
Allouer(P)
Ecrire(Entrer un entier : ) Lire(P^.Elem)
P^.Suiv Nil
L^.Suiv P
L P
FinPour
L Tte
Fin
III.2 Parcours dune liste chane
La procdure itrative suivante permet de parcourir et afficher les
lments dune liste chane.
Procdure AffichListe_itr(L : Liste)
Variables
P : Liste
Dbut
P L
TantQue (P # Nil) Faire
Ecrire(P^.Elem)
P P^.Suiv
FinTQ
Fin
Le parcours peut se faire galement de faon rcursive :
Procdure AffichListe_rcur(L : Liste)
Dbut
Si (L # Nil) Alors
Ecrire(L^.Elem)
AffichListe_rcur(L^.Suiv)
FinSi
Fin
III.3 Insertion dun lment en tte de liste (figure 17)
e1 e2 e3
Tte
Nil
Leon 11 : St r uct ur es de donnes dynami ques
134
a- tat initial
b- tat final
Figure 17. Principe dinsertion dun lment en tte de liste
On suppose que la liste initiale contient au moins une cellule.
Procdure InsertTte(Var L : Liste)
Variables
P : Liste
Dbut
Allouer(P)
Ecrire(Entrer un entier : ) Lire(P^.Elem)
P^.Suiv L
L P
Fin
III.4 Recherche dun lment dans une liste chane
On veut crire une fonction recherche(x : Entier ; L : Liste) : Boolen
qui vrifie si llment x figure dans la liste L.
a- versi on i trati ve
Fonction recherche(x : Entier ; L : Liste) : Boolen
Variables
P : Liste
trouve : Boolen
Dbut
trouve Faux
P L
TantQue (P # Nil) ET (trouve = Faux) Faire
Trouve (P^.Elem = x)
e1 e2 e3
Tte
Nil
e0
Leon 11 : St r uct ur es de donnes dynami ques
135
P P^.Suiv
FinTQ
recherche trouve
Fin
b- versi on rcursi ve
Fonction recherche(x : Entier ; L : Liste) : Boolen
Dbut
Si (L = Nil) Alors
recherche Faux
Sinon
Si (L^.Elem = x) Alors
recherche Vrai
Sinon
recherche recherche(x,L^.Suiv)
FinSi
FinSi
Fin
III.5 Suppression dun lment dune liste chane
En supposant que la valeur x existe une seule fois dans la liste, supprimer
x revient mettre jour les liens de faon que le successeur du
prdcesseur de x devient le successeur de x (figure 18). Un traitement
particulier doit tre fait si llment supprimer est le premier lment de
la liste.
Leon 11 : St r uct ur es de donnes dynami ques
136
a- tat initial
b- tat final
Figure 18. Principe de suppression dun lment de la liste
a- versi on i trati ve
Procdure supprimer(x : Entier ; Var L : Liste)
Variables
P, Q : Liste
Dbut
Si (L # Nil) Alors
P L
Si (L^.Elem = x) Alors
L L^.Suiv
Librer(P)
Sinon
Q L^.Suiv
TantQue (Q # Nil) ET (Q^.Elem # x) Faire
P Q
Q Q^.Suiv
FinTQ
Si (Q # Nil) Alors
P^.suiv Q^.Suiv
Librer(Q)
FinSi
FinSi
FinSi
Fin
Linstruction Librer(P) permet de rendre disponible lespace occup par
P.
b- versi on rcursi ve
e1 e2 e3
Tte
Nil
e1 e2 e3
Tte
Nil
,
_
0 6 0 0 0
0 0 0 0 0
0 0 3 0 1
0 0 0 2 0
Par souci dconomie, une matrice creuse peut tre reprsente par une
liste chane contenant uniquement les lments non nuls avec leurs
indices. Ainsi, la matrice M peut tre reprsente par la liste suivante :
M = [(2,(1,2)) ; (1,(2,1)) ; (3,(2,3)) ; (6,(4,4)) ; (0,(4,5))]
Les lments sont rangs par indice croissant (ligne puis colonne). Pour
connatre la dimension de la matrice, llment dindice maximal est
prcis dans la liste, mme si celui-ci est nul.
1- Dfinir le type Matrice_Creuse
2- Ecrire une fonction qui fait la somme de deux matrices creuses.
Leon 11 : St r uct ur es de donnes dynami ques
147
SOLUTIONS DES EXERCICES
Exercice 11.1 : inversion dune liste chane
Procdure InvertListe(Ls : Liste ; Var Ls_Inv : Liste)
Variables
P,Q : Liste
Dbut
Si (Ls = Nil) Alors
Ls_Inv Nil
Sinon
Allouer(Q)
Q^.Elem Ls^.Elem
Q^.Suiv Nil
Ls Ls^.Suiv
Si (Ls = Nil) Alors
Ls_Inv Q
Sinon
TantQue (Ls # Nil) Faire
Allouer(P)
P^.Elem Ls^.Elem
P^.Suiv Q
Q P
Ls Ls^.Suiv
FinTQ
Ls_Inv Q
FinSi
FinSi
Fin
Exercice 11.2 : tri par bulles dune liste chane
Procdure TriBul(Var Ls : Liste)
Variables
P,Q : Liste
x : Entier
change : Boolen
Dbut
Rpter
change Faux
Leon 11 : St r uct ur es de donnes dynami ques
148
P Ls
Q Ls^.Suiv
TantQue (Q # Nil) Faire
Si (P^.Elem > Q^.Elem) Alors
x P^.Elem
P^.Elem Q^.Elem
Q^.Elem x
change Vrai
FinSi
P Q
Q Q^.Suiv
FinTQ
Jusqu (change = Faux)
Fin
Exercice 11.3 : nombres premiers
Algorithme Premiers
Types
Liste = ^Cellue
Cellule = Struct
Elem : Entier
Suiv : Liste
FinStruct
Variables
Ls : Liste
P, Q, R : Liste
sup,i : Entier
Procdure CreatListe(n : Entier ; Var L : Liste)
Variables
Tte : Liste
Dbut
Allouer(Tte)
Tte^.Elem 2
Tte^.Suiv Nil
L Tte
Pour i de 3 n Faire
Allouer(P)
P^.Elem i
P^.Suiv Nil
Leon 11 : St r uct ur es de donnes dynami ques
149
L^.Suiv P
L P
FinPour
L Tte
Fin
Procdure Prem(n : Entier ; Var L : Liste)
Dbut
P L
TantQue (P^.Elem <= Racine(n)) Faire
Q P
TantQue (Q # Nil) ET (Q^.Suiv # Nil) Faire
R Q^.Suiv
Si (R^.Elem Mod P^.Elem = 0) Alors
Q^.Suiv R^.Suiv
Librer(R)
FinSi
Q Q^.Suiv
FinTQ
P P^.Suiv
FinTQ
Fin
Procdure AffichListe(L : Liste)
Dbut
P L
TantQue (P # Nil) Faire
Ecrire(P^.Elem)
P P^.Suiv
FinTQ
Fin
Dbut
Ecrire(Entrer la borne sup : ) Lire(sup)
CreatListe(sup,Ls)
Prem(sup,Ls)
AffichListe(Ls)
Fin.
Leon 12 : Les ar br es
150
Le on 12 : Les ar br es
O b j e c t i f
Connatre les concepts de base relatifs aux arbres binaires.
I. Introduction
La structure d'arbre est l'une des plus importantes et des plus spcifiques
de l'informatique. Elle est utilise par exemple pour lorganisation des
fichiers dans les systmes d'exploitation, la reprsentation d'une table des
matires, d'un arbre gnalogique, etc.
Dans cette leon, laccent sera mise sur les arbres binaires qui sont un
cas particulier des arbres gnraux.
Une proprit intrinsque de la structure darbre est la rcursivit.
II. Dfinitions
Un arbre binaire B est un ensemble de nuds qui est soit vide, soit
compos dune racine et de deux arbres binaires disjoints appels sous-
arbre droit et sous-arbre gauche (figure 23).
Figure 23. Structure dun arbre binaire
Le pre du sommet x est le sommet p tel qu'il existe un arc entre p et
x (seule la racine de larbre na pas de pre).
Le frre de x est un sommet qui a le mme pre.
Leon 12 : Les ar br es
151
Le sous-arbre droit (resp. gauche) d'un arbre binaire B est le sous-
arbre qui a pour racine le fils droit (resp. gauche) de B.
Un ud interne est un sommet qui a au moins un fils (gauche ou
droit ou les deux).
Une feuille est un sommet qui n'a pas de fils.
La hauteur d'un sommet x est la longueur (en nombre d'arcs) du
plus long chemin de x une feuille.
La hauteur d'un arbre est gale la hauteur de la racine.
III. Cration dun arbre binaire
Un arbre binaire peut tre cr en dfinissant un type correspondant un
ud de larbre. Soit par exemple :
Types
Arbre = ^Nud
ud = Struct
Valeur : Entier
Gauche : Arbre
Droite : Arbre
FinStruct
Une telle structure peut tre utilise pour ordonner des lments, en
considrant que le sous-arbre gauche dun nud de valeur n contient les
lments infrieurs n, tandis que le sous-arbre droit contient les
lments suprieurs n (figure 24).
Leon 12 : Les ar br es
152
Figure 24. Un arbre binaire ordonn
Une telle structure est pratique pour effectuer des tris rapides.
Lalgorithme suivant permet de construire un arbre dentiers partir
dune suite de nombres entrs par lutilisateur.
Algorithme ArbreBinaire
Types
Arbre = ^Nud
ud = Struct
Valeur : Entier
Gauche : Arbre
Droite : Arbre
FinStruct
Variables
racine : Arbre
x : Entier
Procdure Construire(Elt : Entier ; Var B : Arbre)
Dbut
Si (B = Nil) Alors
Allouer(B)
B^.valeur Elt
B^.gauche Nil
B^.droite Nil
Sinon
Si (Elt < B^.valeur) Alors
Construire(Elt,B^.gauche)
Sinon
Si (Elt > B^.valeur) Alors
12
15
20
6
1
4
23
18
Leon 12 : Les ar br es
153
Construire(Elt,B^.droite)
FinSi
FinSi
FinSi
Fin
Dbut
racine = Nil
Ecrire(Entrer un entier : ) Lire(x)
TantQue (x # 0) Faire
Construire(x,racine)
Ecrire(Entrer un entier :) Lire(x)
FinTQ
Fin.
IV. Parcours dun arbre binaire
On cherche parcourir un arbre binaire selon une stratgie dite en
profondeur dabord ou dans lordre prfixe illustr sur le diagramme ci-
dessous :
Figure 25. Parcours dun arbre binaire dans lordre prfixe
Les lments doivent tre affichs dans lordre suivant : 0 1 2 3 4 5
6.
Procdure ParcoursPrfixe(B : Arbre)
Dbut
Si (B # Nil) Alors
Afficher(B^.valeur)
ParcoursPrfixe(B^.gauche)
ParcoursPrfixe(B^.droite)
FinSi
Fin
0
4
6
3
2
1
5
Leon 12 : Les ar br es
154
Exercice
1- Ecrire une nouvelle version de la procdure prcdente qui fait le
parcours de larbre dans lordre infixe ou symtrique. Le rsultat doit tre
dans lordre suivant : 6 4 5 0 3 1 2.
2- Ecrire une autre version qui fait le parcours de larbre dans lordre
postfixe. Le rsultat doit tre dans lordre suivant : 6 5 4 3 2 1 0)
Solution
Procdure ParcoursInfixe(B : Arbre)
Dbut
Si (B # Nil) Alors
ParcoursInfixe(B^.droite)
Ecrire(B^.valeur)
ParcoursInfixe(B^.gauche)
FinSi
Fin
Procdure ParcoursPostfixe(B : Arbre)
Dbut
Si (B # Nil) Alors
ParcoursPostfixe (B^.droite)
ParcoursPostfixe (B^.gauche)
Ecrire(B^.valeur)
FinSi
Fin
Leon 12 : Les ar br es
155
V. Recherche dans un arbre binaire ordonn
Fonction Recherche(x : Entier ; B : Arbre) : Boolen
Dbut
Si (B = Nil) Alors
Recherche Faux
Sinon
Si (x = B^.valeur) Alors
Recherche Vrai
Sinon
Si (x < B^.valeur) Alors
Recherche(x, B^.gauche)
Sinon
Recherche(x, B^.droite)
FinSi
FinSi
FinSi
Fin
VI. Arbres binaires particuliers
On appelle arbre binaire complet un arbre binaire tel que chaque
sommet possde 0 ou 2 fils.
Un arbre binaire complet possde 2P+1 nuds (nombre impair) dont P
sommets internes et P+1 feuilles.
On appelle arbre binaire parfait un arbre binaire (complet) tel que
chaque sommet est le pre de deux sous-arbres de mme hauteur.
Un arbre binaire parfait possde 2
h+1
-1 sommets, o h est la hauteur de
l'arbre.
On appelle arbre binaire quasi-parfait un arbre binaire parfait
ventuellement grignot d'un tage en bas droite.
Leon 12 : Les ar br es
156
Exercice
1- Ecrire une procdure permettant dajouter un lment un arbre
binaire (on suppose que cet lment nexiste pas dans larbre).
2- Ecrire une procdure permettant de supprimer un lment dun arbre
binaire.
La suppression commence par la recherche de l'lment. Puis :
si c'est une feuille, on la vire sans problmes
si c'est un sommet qui n'a qu'un fils, on le remplace par ce fils
si c'est un sommet qui a deux fils, on a deux solutions :
- le remplacer par le sommet de plus grande valeur dans le sous-
arbre gauche
- le remplacer par le sommet de plus petite valeur dans le sous-
arbre droit.
157
Annexe 1 : Pr over bes de pr ogr ammat i on
Proverbe 1
Dfinissez le problme compltement.
Proverbe 2
Rflchissez dabord vous programmerez plus tard.
Proverbe 3
Utilisez lanalyse descendante.
Proverbe 4
Structurez vos programmes en units logiques.
Proverbe 5
Soignez la syntaxe tout de suite.
Proverbe 6
Employez les commentaires.
Proverbe 7
Choisissez bien vos identificateurs.
Proverbe 8
Utilisez proprement les variables intermdiaires.
Proverbe 9
Ne touchez pas aux paramtres dune boucle.
Proverbe 10
Evitez les astuces.
Proverbe 11
Ne supposez jamais que lordinateur suppose quelque chose.
Proverbe 12
Testez le programme la main avant de lexcuter.
158
Proverbe 13
Ne vous occupez pas dune belle prsentation des rsultats avant que le
programme soit correct.
Proverbe 14
Soignez la prsentation.
Proverbe 15
Nayez pas peur de tout recommencer.
159
Bi bl i ogr aphi e
C. et P. RICHARD
Initiation lalgorithmique
Editions Belin, 1981.
C. DELANNOY
Initiation la programmation
Eyrolles, 2000.
J. COURTIN et I. KOWARSKI
Initiation lalgorithmique et aux structures de donnes
Dunod informatique, 1987.
G. CHATY et J. VICARD
Programmation : cours et exercices
Ellipses, 1992.
C. DELANNOY
Programmer en Turbo Pascal 7
Eyrolles, 2000.
B. S. GOTTFRIED
Programmation Pascal : thorie et applications
McGraw-Hill, 1992.
M. SAHNOUN & F. BEN AMOR
Informatique de base
C.L.E, 1999.
Micro Application
Grand livre Visual C++ 5
dition 1998.
J. MAILLEFERT
Cours et T.P de langage C
IUT de Cachan, 1995.
M. GAFSI, A. ABIDI, M. JARRAYA, M. HASSEN et M.TOUAITI
Informatique, 7
me
anne de lenseignement secondaire
Orbis impression, 1996.
P. BRETON, G. DUFOURD et E. HEILMAN
Loption informatique au lyce
Editions Hachette.
M. MOLLARET
C/C++ et programmation objet
Armand Colin, 1989.
160
Tabl e des mat i r es
Pages
Avant-Propos
Leon 1 : Introduction la programmation
I. Notion de programme
1
II. Interprtation et compilation
2
III. Dmarche de programmation
3
IV. Notion de variable
4
V. Notion de constante
..
5
VI. Notion de type
..
5
VI.1. Le type entier
.
6
VI.2. Le type rel ou dcimal ... 6
VI.3. Le type caractre
7
VI.4. Le type logique ou boolen . 8
VII. Les expressions
8
VII.1. Les expressions arithmtiques .. 9
VII.2. Les expressions logiques 9
Exercices dapplication
..
10
Solutions des exercices
..
11
Leon 2 : Les instructions simples
I. Linstruction daffectation
.
12
II. Linstruction dcriture
...
14
III. Linstruction de lecture
..
15
161
IV. Structure gnrale dun algorithme . 15
Exercices dapplication
..
16
Solutions des exercices
..
18
Leon 3 : Les structures conditionnelles
I. Introduction
..
20
II. Structure de slection simple
..
20
II.1. Forme simple
20
II.2. Forme
alternative.
22
III. Structure de slection multiple . 24
Exercices dapplication
..
26
Solutions des exercices
..
27
Leon 4 : Les structures itratives
I. Introduction
29
II. La structure Pour Faire . 29
III. La structure Rpter Jusqu .. 32
IV. La structure Tant Que Faire ... 34
V. Synthse
..
36
V.1. Passage dune structure itrative
une autre 36
V.2. Choix de la structure itrative . 37
Exercices dapplication
..
37
Solutions des exercices
..
40
Leon 5 : Les chanes de caractres
I. Le type caractre
.
47
162
I.1. Dfinition
47
I.2. Fonctions standards sur les
caratres .. 47
II. Le type chane de caractres
50
II.1. Dclaration dune chane
50
II.2. Oprations sur les chanes de
caractres
.
50
III. Procdures et fonctions standards sur les
chanes
51
III.1. Procdures standards
.
51
III.2. Fonctions standards
52
Exercices dapplication
..
53
Solutions des exercices
..
55
Leon 6 : Procdures et fonctions
I. Introduction
..
58
II. Procdure simple
..
59
III. Procdure paramtre
.
60
IV. Modes de passage de paramres 61
V. Les fonctions
..
65
V.1. Dfinition
..
65
V.2. Structure dune fonction 65
V.3. Appel dune fonction . 66
Exercices dapplication
..
66
Solutions des exercices 68
163
..
Leon 7 : Les tableaux
I. Introduction
..
70
II. Les tableaux unidimentionnels
71
II.1. Dclaration dun tableau 71
II.2. Identification dun lement du
tableau
72
II.3. Remplissage dun tableau .. 72
II.4. Affichage des lments dun
tableau
73
II.5. Recherche squentielle dun
lment dans un tableau 74
II.6. Algorithmes de tri
75
II.7. Recherche dichotomique 78
III. Tableaux multidimentionnels
.
80
III.1. Remplissage dun tableau deux
dimensions .. 81
III.2. Transposition dune matrice
carre
82
III.3. Somme de deux matrices . 82
III.4. Produit de deux matrices . 83
Exercices dapplication
..
84
Solutions des exercices
..
91
Leon 8 : Les enregistrements
I. Notion denregistrement
100
II. Dclaration des variables de type
enregistrement
100
164
III. Manipulation des variables de type
enregistrement .. 101
Exercices dapplication
..
102
Solutions des exercices
..
104
Leon 9 : Les fichiers squentiels
I. Notion de fichier
106
I.1. Dfinition
...
106
I.2. Elments attachs un fichier 107
II. Dclaration dun fichier organisation
squentielle
.
108
III. Manipulation des fichiers organisation
squentielle
109
III.1. Cration dun fichier
organisation squentielle . 110
III.2. Parcours dun fichier
organisation squentielle . 111
IV. Les fichiers de type texte
111
Exercices dapplication
..
113
Solutions des exercices
..
114
Leon 10 : La rcursivit
I. Notion de rcursivit
..
118
II. Etude dun exemple : la fonction factorielle 119
III. Mcanisme de fonctionnement de la
rcursivit
.
120
IV. Performances de la rcursivit . 120
V. Rcursivit indirecte ou croise . 122
VI. Choix entre itration et rcursivit .. 122
165
Exercices dapplication
..
125
Solutions des exercices
..
127
Leon 11 : Structures de donnes dynamiques
I. Introduction
..
129
II. Les variables dynamiques
129
II.1. Variable pointeur et variable
pointe
..
130
II.2. Oprations sur les pointeurs . 131
III. Les listes chanes
132
III.1. Cration dune liste chane 132
III.2. Parcours dune liste chane 133
III.3. Insertion dun lmemt en tte de
liste .. 134
III.4. Recherche dun lment dans une
liste chane ... 134
III.5. Suppression dun lement dune
liste chane 135
IV. Les listes chanage double
..
138
IV.1. Cration dune liste chanage
double
..
139
IV.2. Parcours inverse dune liste
chanage double
.
139
V. Les piles
..
140
V.1. Prsentation
..
140
V.2. Manipulation dune pile 141
VI. Les files
.
142
VI.1. Prsentation 142
166
.
VI.2. Manipulation dune file 143
Exercices dapplication
..
145
Solutions des exercices
..
147
Leon 12 : Les arbres
I. Introduction
..
150
II. Dfinitions
150
III. Cration dun arbre binaire
151
IV. Parcours dun arbre binaire .. 153
V. Recherche dans un arbre binaire ordonn 155
VI. Arbres binaires particuliers
155
Annexe 1 : Proverbes de programmation
Annexe 2 : Tables des caractres ASCII 157
Bibliographie 159
Table des matires 160
167
Algorithmique et structures de donnes
Lobjectif de ce livre est dexpliquer en termes simples et travers
de nombreux exemples et exercices corrigs les lments
ncessaires lcriture dalgorithmes corrects et efficaces pour
traiter diverses structures de donnes (tableaux, enregistrements,
fichiers, listes chanes, etc.).
Ouvrage de base pour les tudiants du premier cycle universitaire
(ISET, coles dingnieurs, ISG, IHEC, ), ce livre constitue
galement une rfrence aux programmeurs dbutants et
expriments qui veulent rafrachir et complter leurs
connaissances dans le domaine.
N en 1968 Djrissa, Baghdadi ZITOUNI est un professeur
agrg en informatique. Il ocuupe le poste de technologue lISET
de Ksar-Hellal depuis 1997. Il a galement dispens des cours en
informatique et en GPAO lISET de Sousse et lcole
dingnieurs de Monastir. Outre lenseignement de linformatique,
et notamment la programmation, il a particip plusieurs projets
de dveloppement de logiciels qui ont abouti des produits utiliss
au niveau industriel. Il est galement lauteur de plusieurs articles
scientifiques publis dans des journaux spcialiss.