Вы находитесь на странице: 1из 17

Algorithmique

et de
programmation
Vincent Granet
est matre
de confrences
Polytech
Nice Sophia-Antipolis.
Public :
DUT
L1/L2
cole
dingnieurs
M
i
n
i

M
a
n
u
e
l

d

A
l
g
o
r
i
t
h
m
i
q
u
e

e
t

d
e

p
r
o
g
r
a
m
m
a
t
i
o
n
V
.

G
R
A
N
E
T
MINI MANUEL
Comment aller lessentiel, tudier et com-
prendre lalgorithmique et la programmation ?
Conus pour faciliter aussi bien lapprentissage
que la rvision, les Mini manuels proposent un
cours concis et progressif pour vous accom-
pagner jusqu lexamen. Des exemples, des
savoir-faire et des mthodes pour viter les
piges ainsi que des exercices tous corrigs et
programms en langage C compltent le cours.
Ce Mi ni manuel prsente l ensembl e des
connaissances relatives lalgorithmique et
la programmation quun tudiant doit acqurir
et matriser au cours de la licence dinformatique.
Contenu :
Types Expressions noncs conditionnels/
itratifs Fonctions/procdures Tableaux
Fichiers Complexit Rcursivit Structures
dynamiques Listes Arbres
Mini Manuel
dAlgorithmique
et de programmation
Vincent GRANET
Vincent Granet
C
o
u
r
s
+

e
x
o
s
c
o
r
r
i
g

s
Le code source des l i sti ngs est
disponible sur le site de Dunod sur la
page ddie cet ouvrage.
6953129
ISBN 978-2-10-057350-9
Avant-propos 1
Conseils de lecture 2
Introduction 3
Algorithme 3
Langages de programmation 4
Construction des programmes 6
1 Actions lmentaires 9
1.1 Un modle de programme 9
1.2 Lecture dune donne 10
1.3 Excution dune fonction prdfinie 11
1.4 Affectation 11
1.5 criture dun rsultat 12
1.6 Lalgorithme complet 12
1.7 Le programme en C 13
Exercices 15
Solutions 15
2 Types lmentaires 17
2.1 Notion de type 17
2.2 Le type entier 18
2.3 Le type rel 20
2.4 Le type boolen 21
2.5 Le type caractre 22
2.6 Dclaration de constante 24
Table des matires
9782100573509-Granet-tdm.qxd 20/01/12 11:15 Page VII
2.7 Le type numr 24
2.8 Le type intervalle 25
Exercices 26
Solutions 27
3 Expressions 31
3.1 Notations 31
3.2 valuation 32
3.3 Comptabilit et conversion de type 32
Exercices 35
Solutions 36
4 nonc conditionnel 39
4.1 Excution conditionnelle 39
4.2 Lnonc si-alors-sinon 40
4.3 Lnonc choix 41
Exercices 42
Solutions 43
5 noncs itratifs 47
5.1 Excution itrative 47
5.2 Lnonc tantque 49
5.3 Lnonc rpter 50
5.4 Lnonc pour 51
Exercices 53
Solutions 53
6 Tableaux 57
6.1 Dclaration 57
6.2 Accs et modification 58
6.3 Oprations 59
6.4 Les tableaux de tableaux 59
6.5 Les tableaux en C 60
Exercices 63
Solutions 64
VIII Mini Manuel dAlgorithmique et de programmation
9782100573509-Granet-tdm.qxd 20/01/12 11:15 Page VIII
7 Routines 67
7.1 Intrt 67
7.2 Dclaration dune routine 68
7.3 Appel de routine 70
7.4 Transmission des paramtres 70
7.5 Les routines en C 72
Exercices 75
Solutions 76
8 Fichiers 81
8.1 Intrt 81
8.2 Dfinition 82
8.3 Manipulation des fichiers 83
8.4 Les fichiers de texte 86
8.5 Les fichiers en C 86
Exercices 90
Solutions 91
9 Composition dobjets 97
9.1 Dclaration de type 97
9.2 Accs aux champs 99
9.3 Polymorphisme 100
9.4 Composition en C 101
Exercices 102
Solutions 103
10 Complexit 105
10.1 Dfinition 105
10.2 tudes de cas 106
Exercices 112
Solutions 114
11 Rcursivit 117
11.1 Dfinition 117
11.2 Rcursivit des actions 118
Table des matires IX
9782100573509-Granet-tdm.qxd 20/01/12 11:15 Page IX
11.3 Rcursivit des objets 122
Exercices 123
Solutions 124
12 Structures linaires 129
12.1 Structures de donnes 129
12.2 Les listes 130
12.3 Pile 137
12.4 File 139
Exercices 142
Solutions 143
13 Arbres binaires 149
13.1 Terminologie 149
13.2 Arbre binaires 151
13.3 Arbre binaires ordonns 156
Exercices 162
Solutions 163
Annexe 167
I Rgles de priorits des oprateurs du langage C 167
II Mots-cls de la norme ANSI (C89) du langage C 168
III Liste par catgorie des fonctions de la bibliothque C standard
(LIBC) et de la bibliothque mathmatique 168
Bibliographie 171
Index 173
X Mini Manuel dAlgorithmique et de programmation
9782100573509-Granet-tdm.qxd 20/01/12 11:15 Page X
5.1 EXCUTION ITRATIVE
Les noncs itratifs sont des noncs qui permettent lexcution rpti-
tive dun ou plusieurs autres noncs.
Les noncs itratifs sont bien souvent galement appels boucles
cause de la reprsentation circulaire que lon peut en donner, comme le
montre la figure 5.1. Dans cette figure, les noncs de E
1
E
n
sont ex-
cuter rptitivement. Chaque nonc est prcd et suivi dune affirma-
tion P (de P
0
P
n
).
On entre dans la boucle avec la pr-condition P
a
et on en sort lorsque la
condition darrt boolenne B est vrifie avec la post-condition P
c
= B
et P
i
.
Il est important de comprendre que les affirmations qui prcdent ou sui-
vent les noncs dans boucles, sont vrais quel que soit le nombre dit-
rations effectues. Ces affirmations sont appeles des invariants.
5
C
H
A
P
I
T
R
E
noncs
itratifs
5.1 Excution itrative
5.2 nonc tantque
5.3 nonc rpter
5.4 nonc pour
P
L
A
N
Comprendre et utiliser les diffrentes formes dnoncs itratifs.
Comprendre et dfinir un invariant de boucle.
Comprendre et garantir la finitude dune boucle.
O
B
J
E
C
T
I
F
S
9782100573509-Granet-C05.qxd 25/01/12 15:21 Page 47
Laffirmation P
i
qui prcde la condition darrt B joue un rle parti-
culier. Elle est reprsentative de la smantique de lnonc itratif, et
elle est appele linvariant de boucle.
Pour sortir de la boucle, il faut que la condition darrt soit vrifie. On
parle alors de la finitude de lnonc itratif qui doit tre effectivement
assure sous peine davoir un programme qui boucle.
Gnralement, les langages de programmation proposent deux noncs
itratifs, tantque et rpter, selon que les noncs de E
1
E
i
, et E
i+1

E
n
sont respectivement vides ou pas.
Un troisime nonc itratif, lnonc pour, est aussi prsent dans cer-
tains langages, la particularit de fixer le nombre ditrations lavan-
ce. Avec cet nonc, il ny a plus de condition darrt, et la finitude de la
boucle nest plus vrifier, puisquelle est garantie par lnonc lui-
mme.
48 Chapitre 5 noncs itratifs
Figure 5.1 Schma dune boucle gnrale.
9782100573509-Granet-C05.qxd 25/01/12 15:21 Page 48
5.2 LNONC TANTQUE
Avec lnonc tanque, les noncs E
1
E
i
sont vides (ils nexistent pas),
et lexcution de la boucle commence par vrifier la condition darrt.
Si la condition darrt est immdiatement vrifie les noncs de la boucle de
sont pas excuts. La boucle est excute au minimum zro fois.
Lcriture algorithmique de lnonc tantque est la suivante :
{P} tantque B faire E fintantque {P et non B}
B est une condition boolenne qui tant quelle est vraie permet
lexcution de lnonc E. Laffirmation P, qui doit tre vrifie avant
lexcution de lnonc tantque, doit ltre galement aprs son excu-
tion. Cette affirmation P est linvariant de boucle.
Dans lexemple suivant, on souhaite calculer la factorielle dun entier
naturel n, note n!. On procde par le calcul itratif dune suite crois-
sante de produits de 1 n. la i
me
itration, on aura calcul i!, ce qui
sera notre invariant de boucle. Lalgorithme, avec les affirmations qui
montrent sa validit, scrit comme suit :
{ n>=0 }
variable i, fact: naturel
i 0
fact 1
{ Invariant = fact = i! }
tantque i<n faire
{fact*(i+1) = i! * (i+1) = (i+1)! et i<n}
i i+1
{ fact*i= i! }
fact fact*i
{ fact= i! }
fintantque
{ i=n et fact=i!=n! }
Il est important de noter que linvariant de boucle, ici fact = i!, est bien
vrifi lentre de la boucle et la sortie.
Dautre part, la fonction dcroissante f(i) = n i garantit la finitude la
boucle. Lorsque i = n, le prdicat dachvement est vrifi.
Lnonc tantque en C
La syntaxe en C de cet nonc est :
while (B) E
5.2 Lnonc tantque 49
9782100573509-Granet-C05.qxd 25/01/12 15:21 Page 49
sa smantique (i.e. la faon dont il fonctionne) est identique la version
algorithmique.
5.3 LNONC RPTER
Avec lnonc rpter, les noncs E
i+1
E
n
sont vides. La condition dar-
rt de la boucle est faite aprs la premire excution des noncs E
i+1
E
n
.
Avec lnonc rpter, il y a au moins une itration qui est faite.
chaque fois que vous tes certain dexcuter au moins une fois
lnonc E, vous utiliserez lnonc rpter, plutt que lnonc
tantque.
Lcriture algorithmique de lnonc rpter est la suivante :
{P} rpter E jusqu B {Q et B}
Lnonc E est excut jusqu ce que lvaluation de lexpression B
boolenne donne la valeur vrai. La boucle sachve lorsque B est faux.
Laffirmation P, qui doit tre vrifie avant lexcution de lnonc rp-
ter, et la premire excution de E doit conduire une affirmation Q qui
est linvariant de boucle.
Dans lexemple suivant, on souhaite rechercher le minimum et le maxi-
mum dune suite de n entiers, x
1
, x
2
, ..., x
n
lue sur lentre standard (n est
suprieur 0). Un entier de la suite est lu chaque itration. la i
me
itration, on peut affirmer que k [1,i ], min x
k
et max x
k
. Ce sera
notre invariant de boucle.
{ n>0 }
variables i : naturel
x : entier
i 1
min +
max -
{ }
rpter
i i+1
lire(x)
si x < min alors min x finsi
{ k [1,i], min x
k
}
si x > max alors max x finsi
{ Invariant : k [1,i], min x
k
et max x
k
}
jusqu i = min
{ Invariant : k [1,i], min x
k
et max x
k
et i=n}
50 Chapitre 5 noncs itratifs
9782100573509-Granet-C05.qxd 25/01/12 15:21 Page 50
Comme pour factorielle, la fonction dcroissante f(i) = n i garantit la
finitude la boucle. Lorsque i = n, le prdicat dachvement est vrifi.
Lnonc rpter en C
La syntaxe en C de cet nonc est :
do E while (B) ;
Dans cette forme, lnonc E est excut tant que la condition B est gale
vrai. La boucle sachve lorsque la condition prend la valeur faux.
Notez quen C la condition darrt de lnonc do-while est linverse de celle
de lnonc algorithmique rpter.
5.4 LNONC POUR
Il arrive que lon ait besoin de faire le mme traitement sur toutes les
valeurs dun type donn. Par exemple, on dsire afficher valeurs du type
prdfini caractre. Beaucoup de langages de programmation proposent
une construction adapte ce besoin spcifique, appele nonc itratif
pour. Une forme gnrale de cette construction est un nonc qui pos-
sde la syntaxe suivante :
{P} pourtout x de T faire E finpourtout {Q}
o x est une variable de boucle qui prendra successivement toutes les
valeurs du type T. Pour chacune dentre elles, lnonc E sera excut.
Notez, dune part, que lordre de parcours des lments du type T na pas
ncessairement dimportance, et dautre part, que la variable de boucle
nest dfinie et nexiste, quau moment de lexcution de lnonc itra-
tif. Cet nonc fait passer dune pr-condition P une post-condition Q
qui dpend de la dernire valeur prise par x la dernire itration.
Lnonc suivant crit sur la sortie standard tous les caractres du type
caractre.
pourtout c de caractre faire
crire(c)
finpourtout
Il est important de comprendre que le nombre ditrations ne dpend pas
dun prdicat dachvement, contrairement aux noncs tantque ou
rpter prcdents. Il est gal au cardinal du type T. On a la garantie que
la boucle sachve et la finitude de la boucle nest donc plus dmon-
5.4 Lnonc pour 51
9782100573509-Granet-C05.qxd 25/01/12 15:21 Page 51
trer ! Dans un algorithme, chaque fois que vous aurez effectuer des it-
rations dont le nombre peut tre connu lavance de faon statique, vous
utiliserez lnonc pourtout.
Lnonc pour en C
Lnonc pour propos par le langage C na malheureusement pas la
smantique de notre nonc pourtout prcdent. La syntaxe en C de cet
nonc est la suivante :
for (e1 ; e2 ; e3) E
o e1 est une expression dinitialisation de la variable de boucle, e2 est
le prdicat dachvement, et e3 est lexpression dincrmentation de la
variable de boucle. Cet nonc est strictement quivalent lnonc
tantque suivant :
exp1;
while (exp2) {
E;
exp3;
}
Cette forme dnonc ne dispensera donc pas le programmeur de dmontrer
la finitude de la boucle. Quoi quil en soit, chaque fois que le nombre ditra-
tions pourra tre dtermin lavance, on utilisera lnonc pour de C.
POINTS CLS
Un nonc itratif permet dexcuter plusieurs fois dautres noncs.
Linvariant de boucle dfinit la smantique de lnonc itratif.
La finitude des noncs itratifs tantque et rpter nest pas garan-
tie, il faut la prouver formellement.
Le nombre ditrations dun vrai nonc pour est dfini statiquement.
Lnonc for de C ne garantit pas la finitude de la boucle.
52 Chapitre 5 noncs itratifs
9782100573509-Granet-C05.qxd 25/01/12 15:21 Page 52
EXERCICES
5.1 Division entire
crivez un programme C qui calcule le quotient et le reste de la division
entire de deux entiers naturels a et b, avec b 0. Vous procderez par
soustractions successives. On rappelle la dfinition de la division entire :
a 0, b > 0, a = quotient * b + reste, 0 r < b
Les entiers a et b sont lus sur lentre standard.
5.2 Somme des chiffres dun entier naturel
crivez un programme C qui calcule la somme des chiffres dun entier
naturel. Par exemple, la somme des chiffres de 12057 est 15. Vous
obtiendrez les chiffres de lentier par divisions successives de la base, i.e.
10.
5.3 Produit deux entiers naturels
Le produit de deux entiers x et y consiste sommer y fois la valeur x.
x * y = x + x + ... + x (y sommes de x)
Toutefois, on peut amliorer cet algorithme rudimentaire en multipliant
le produit calcul par deux et en divisant y par deux chaque fois que y est
pair. Les oprations de multiplication et de division par deux sont des
oprations trs efficaces puisquelles consistent dcaler de un bit vers
la gauche ou vers la droite. crivez la fonction produit base sur cet algo-
rithme et construite autour dune boucle while.
5.4 Somme de nombres impairs
laide de lnonc pour, crivez un programme C qui calcule et affi-
che la somme des n premiers nombres impairs. Le nombre n, qui doit
tre suprieur 0, est lu sur lentre standard.
SOLUTIONS
5.1 Division entire
Linvariant de la boucle, celle des divisions successives, est vident, cest
la dfinition de la division entire. chaque itration, lquation est
vrifie.
Solutions 53
9782100573509-Granet-C05.qxd 25/01/12 15:21 Page 53
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int a, b, quotient, reste;
scanf("%d %d", &a, &b);
if (a<0) {
fprintf(stderr, "a doit tre >= 0\n");
return EXIT_FAILURE;
}
if (b<=0) {
fprintf(stderr, "b doit tre > 0\n");
return EXIT_FAILURE;
}
/* a>=0 et b>0*/
quotient=0; reste=a;
/* Invariant : a = quotient*b+reste */
while (reste>=b) {
/* a = quotient*b+reste = (quotient+1)*b+reste-b
* et reste>=b
*/
quotient = quotient+1;
/* a = quotient*b+reste-b */
reste = reste-b;
/* a = quotient*b+reste */
}
/* a = quotient*b+reste et 0<=reste<b */
printf("%d = %d*%d + %d\n", a, quotient, b, reste);
return EXIT_SUCCESS;
}
La finitude de la boucle est garantie par la fonction f(reste) = reste b.
5.2 Somme des chiffres dun entier naturel
Tout entier naturel possde au moins un chiffre, nous utiliserons donc un
nonc rpter, ou do-while en C, puisquil y aura au moins une itra-
tion. chaque itration, on obtient un nouveau chiffre par le calcul du
reste de la division entire par 10. Notez que les chiffres sont obtenus en
partant des units.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int x, somme = 0;
scanf("%d", &x);
54 Chapitre 5 noncs itratifs
9782100573509-Granet-C05.qxd 25/01/12 15:21 Page 54
if (x<0) {
fprintf(stderr,"Erreur: entier positif attendu\n");
return EXIT_FAILURE;
}
/* x>=0 */
do {
/* prendre le prochain chiffre de x et lajouter
somme */
somme += x%10;
/* enlever le chiffre de x */
x/=10;
} while (x!=0);
/* afficher la somme */
printf("somme des chiffres = %d\n", somme);
return EXIT_SUCCESS;
}
5.3 Produit deux entiers naturels
/* pr-condition : x et y >=0 */
/* rle : retourne x * y */
int produit(int x, int y) {
/* on pose x = a, et y = b */
int p = 0;
/* a * b = p + x * y */
while (y>0) {
/* a * b = p + x * y et y>0 */
while ((y & 1) == 0) { /* y est pair */
/* a * b = p + x * y et y = (y / 2) * 2 > 0
a * b = p + 2x * (y/2) et y = (y / 2)*2 > 0*/
y >>= 1;
/* a * b = p + 2x * y */
x <<= 1;
/* a * b = p + x * y */
}
/* a * b = p + (x-1) * y + y et y>0 et y impair */
p += x;
/* a * b = p + x * y-1 et y impair */
y;
/* a * b = p + x * y */
}
/* y = 0 et a * b = p + x * y = p */
return p;
}
Ce programme utilise, dune part, les oprateurs C << et >> pour faire un
dcalage dun bit sur la droite (division par 2) et dun bit sur la gauche
(multiplication par 2), et dautre part loprateur & gauche qui faut un et
Solutions 55
9782100573509-Granet-C05.qxd 25/01/12 15:21 Page 55
logique entre ses oprandes. Dans lopration x&1, loprande droit est
une suite de 0 termine par un bit 1. Un nombre impair se termine par
un bit 1 et un nombre pair par un bit 0. Ainsi, un et logique avec un
1 donnera comme rsultat la valeur 1 ou 0 selon que le nombre est,
respectivement, impair ou pair.
5.4 Somme de nombres impairs
/* Ce programme calcule la somme des n premiers nombres
impairs */
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i, n, somme;
scanf("%d", &n);
if (n<=0) {
fprintf(stderr, "entier positif attendu\n");
return EXIT_FAILURE;
}
/* n>0 */
somme = 0;
for (i=0; i<n ; i++) {
somme+=2*i+1;
/* Invariant : somme =
i

k=0
2k +1 */
}
/* somme =
n

k=0
2k +1 = n
2
*/
printf("somme = %d\n", somme);
return EXIT_SUCCESS;
}
56 Chapitre 5 noncs itratifs
9782100573509-Granet-C05.qxd 25/01/12 15:21 Page 56
Algorithmique
et de
programmation
Vincent Granet
est matre
de confrences
Polytech
Nice Sophia-Antipolis.
Public :
DUT
L1/L2
cole
dingnieurs
M
i
n
i

M
a
n
u
e
l

d

A
l
g
o
r
i
t
h
m
i
q
u
e

e
t

d
e

p
r
o
g
r
a
m
m
a
t
i
o
n
V
.

G
R
A
N
E
T
MINI MANUEL
Comment aller lessentiel, tudier et com-
prendre lalgorithmique et la programmation ?
Conus pour faciliter aussi bien lapprentissage
que la rvision, les Mini manuels proposent un
cours concis et progressif pour vous accom-
pagner jusqu lexamen. Des exemples, des
savoir-faire et des mthodes pour viter les
piges ainsi que des exercices tous corrigs et
programms en langage C compltent le cours.
Ce Mi ni manuel prsente l ensembl e des
connaissances relatives lalgorithmique et
la programmation quun tudiant doit acqurir
et matriser au cours de la licence dinformatique.
Contenu :
Types Expressions noncs conditionnels/
itratifs Fonctions/procdures Tableaux
Fichiers Complexit Rcursivit Structures
dynamiques Listes Arbres
Mini Manuel
dAlgorithmique
et de programmation
Vincent GRANET
Vincent Granet
C
o
u
r
s
+

e
x
o
s
c
o
r
r
i
g

s
Le code source des l i sti ngs est
disponible sur le site de Dunod sur la
page ddie cet ouvrage.
6953129
ISBN 978-2-10-057350-9