ALGORITHMIQUE

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 87

I

EPIGRAPHE

« Il est assez difficile de trouver une erreur dans son code


quand on la cherche. C’est encore bien plus dur quand on est
convaincu que le code est juste. » - Steve McConnell

« Il n’existe pas, et il n’existera jamais, de langage dans


lequel il soit un tant soit peu difficile d’écrire de mauvais
programmes ». - Anonyme

« Si le débogage est l’art d’enlever les bogues, alors la


programmation doit être l’art de les créer. » - Anonyme

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
II

AVANT PROPOS
Le présent support a été élaboré après plusieurs tours d’horizon sur
différent cours d’algorithmique ou logique de programmation de premier
niveau en sciences informatiques. Ce tour d’horizon nous a amenés, à une
étude minutieuse, à connaître les besoins réel des étudiants en matière de
raisonnement informatique.

Les sciences informatiques prennent de plus en plus d’empileur dans


le monde et beaucoup de personnes avisées voudraient acquérir quelques
notions sur cette nouvelle science.

Pour certains étudiants qui débarquent en premier graduat, le bagage


intellectuel reçu ne prédispose pas aux études informatiques et c’est pour
cette raison qu’ils considèrent le contact avec le raisonnement informatique
avec beaucoup d’appréhension et de peur; on dirait un atterrissage forcé
dans un pays inconnu.

BUT DU COURS
Le but de ce cours et de permettre aux étudiants de premier graduat
d’exprimer les instructions résolvant un problème donné indépendamment
des particularités de tel ou tel langage de programmation.

OBJECTIFS DU COURS
Ce cours a pour objectif de :
Rendre le contact avec le monde de l’informatique plus doux et plus
agréable ;
Doter les étudiants des reflexes d’informaticien, reflexes sans les quels
la résolution des problèmes informatique ne serait pas possible.

METHODOLOGIE D’ENSEIGNEMENT
Dans ce cours nous utiliserons la méthodologie participative, c'est-à-
dire que les étudiants auront droit à un jeu des questions et réponses afin de
bien assoir la matière.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
III

PLAN DU COURS

0. INTRODUCTION

Chapitre I. LES VARIABLES

Chapitre II. INSTRUCTION DE LECTURE ET ECRITURE

Chapitre III. LES TESTS OU STRUCTURES CONDITIONNELLES

Chapitre IV. LES BOUCLES OU STRUCTURES REPETITIVES

Chapitre V. LES TABLEAUX

A. TABLEAUX UNIDIMENSIONNELS

B. TABLEAUX MULTIDIMENSIONNELS

Chapitre VI. LES FONCTIONS PREDEFINIES

Chapitre VII. PROCEDURES ET FONCTIONS

Chapitre VIII. NOTIONS COMPLEMENTAIRES

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
-1-

0. INTRODUCTION
0. 1. Préambule
L’algorithmique est un terme d’origine arabe, comme algèbre, amiral
ou zénith. Ainsi, l’algo n’est pas " rythmique ", à la différence du bon rock’n
roll. L’algo n’est pas non plus " l’agglo ".

0. 2. Qu’est-ce que l’algomachine ?


Avez-vous déjà ouvert un livre de recettes de cuisine ? Avez-vous déjà
déchiffré un mode d’emploi traduit directement du coréen pour faire
fonctionner un magnétoscope ou un répondeur téléphonique réticent ? Si
oui, sans le savoir, vous avez déjà exécuté des algorithmes. Plus fort : avez-
vous déjà indiqué un chemin à un touriste égaré ? Avez-vous fait chercher
un objet à quelqu’un par téléphone ? Ecrit une lettre anonyme stipulant
comment procéder à une remise de rançon ? Si oui, vous avez déjà fabriqué
et fait exécuter des algorithmes. Comme quoi, l’algorithmique n’est pas un
savoir ésotérique réservé à quelques rares initiés touchés par la grâce divine,
mais une aptitude partagée par la totalité de l’humanité. Donc, pas
d’excuses.

0.3. Définition de l’algorithmique


Un algorithme, c’est une suite d’instructions, qui une fois exécutée
correctement, conduit à un résultat donné. Si l’algorithme est juste, le
résultat est le résultat voulu, et le touriste se retrouve là où il voulait aller. Si
l’algorithme est faux, le résultat est, disons, aléatoire, et décidément, cette
saloperie de répondeur ne marche pas. Complétons toutefois cette définition.

Après tout, en effet, si l’algorithme, comme on vient de le dire, n’est


qu’une suite d’instructions menant celui qui l’exécute à résoudre un
problème, pourquoi ne pas donner comme instruction unique : " résous le
problème ", et laisser l’interlocuteur se débrouiller avec ça ? A ce tarif,
n’importe qui serait champion d’algorithmique sans faire aucun effort. Pas
de ça Lisette, ce serait trop facile. Le malheur (ou le bonheur, tout dépend

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
-2-

du point de vue) est que justement, si le touriste vous demande son chemin,
c’est qu’il ne le connaît pas. Donc, si on n’est pas un goujat intégral, il ne
sert à rien de lui dire de le trouver tout seul. De même les modes d’emploi
contiennent généralement (mais pas toujours) un peu plus d’informations
que " débrouillez vous pour que ça marche ". Pour fonctionner, un
algorithme doit donc contenir uniquement des instructions
compréhensibles par celui qui devra l’exécuter. C’est d’ailleurs l’un des
points délicats pour les rédacteurs de modes d’emploi : les références
culturelles, ou lexicales, des utilisateurs, étant variées, un même mode
d’emploi peut être très clair pour certains et parfaitement abscons pour
d’autres. En informatique, heureusement, il n’y a pas ce problème : les
choses auxquelles ont doit donner des instructions sont les ordinateurs, et
ceux-ci ont le bon goût d’être tous strictement aussi idiots les uns que les
autres.

0.4. Faut-il être matheux pour être bon en algorithmique ?

Je consacre quelques lignes à cette question, car cette opinion aussi


fortement affirmée que faiblement fondée sert régulièrement d’excuse. Faut-il
être " bon en maths " pour expliquer correctement le chemin à quelqu’un ?
Je vous laisse juge. La maîtrise de l’algorithmique requiert deux qualités :

Il faut être rigoureux. Car chaque fois qu’on écrit une série d’instructions
qu’on croit justes, il faut se mettre à la place de la machine qui va les
exécuter, pour vérifier si le résultat obtenu est bien celui que l’on voulait.
Mais cette opération ne requiert pas la moindre once d’intelligence,
uniquement d’être méthodique.
Il faut avoir une certaine intuition, car aucune recette ne permet de
savoir a priori quelles instructions permettront d’obtenir le résultat
voulu. C’est là, si l’on y tient, qu’intervient la forme " d’intelligence "
requise pour l’algorithmique. Alors, c’est certain, il y a des gens qui ont
au départ davantage cette intuition que les autres. Mais d’une part, les
réflexes, cela s’acquiert, et l’expérience finit par compenser largement

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
-3-

bien des intuitions. D’autre part, pour être bon en algorithmique, il ne


faut pas oublier le point précédent.

0.5. L’ADN

L’ADN, qui est en quelque sorte le programme génétique, l’algorithme à


la base de construction des êtres vivants, est une chaîne construite à partir
de quatre éléments invariables. Ce n’est que le nombre de ces éléments, et
l’ordre dans lequel ils sont arrangés, qui va déterminer si on obtient une
puce ou un éléphant. Et tous autant que nous sommes, splendides réussites
de la nature, avons été construits par un " programme " constitué
uniquement de ces quatre briques, ce qui devrait nous inciter à la modestie.
Enfin, les ordinateurs, quels qu’ils soient, ne sont fondamentalement
capables d’exécuter que quatre opérations logiques (je n’inclus pas ici les
opérations de calcul). Ces opérations sont :

1. L’affectation de variables
2. La lecture / écriture
3. Les tests
4. Les boucles

Un algorithme informatique se ramène donc toujours au bout du


compte à la combinaison de ces quatre petites briques de base. Il peut y en
avoir quelques unes, quelques dizaines, et jusqu’à plusieurs centaines de
milliers dans certains programmes de gestion. Rassurez-vous, dans le cadre
de ce cours, nous n’irons pas jusque là (cependant, la taille d’un algorithme
ne conditionne pas en soi sa complexité : de longs algorithmes peuvent être
finalement assez simples, et de petits très compliqués).

0.6. Algorithmique et programmation

Pourquoi apprendre l’algorithmique pour apprendre à programmer ?


En quoi a-t-on besoin d’un langage spécial, distinct des langages de
programmation compréhensibles par les ordinateurs ? Parce que
l’algorithmique exprime les instructions résolvant un problème donné

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
-4-

indépendamment des particularités de tel ou tel langage. Pour prendre une


image, si un programme était une dissertation, l’algorithmique serait le plan,
une fois mis de côté la rédaction et l’orthographe. Or, vous savez qu’il vaut
mieux faire d’abord le plan et rédiger ensuite que l’inverse.

0.7. Avec quelles conventions écrit-on un algorithme ?

Historiquement, plusieurs types de notations ont représenté des


algorithmes. Il y a eu notamment une représentation graphique, avec des
carrés, des losanges, etc. qu’on appelait des organigrammes. Aujourd’hui,
cette représentation est quasiment abandonnée, pour deux raisons. D’abord,
parce que dès que l’algorithme commence à grossir un peu, ce n’est plus
pratique du tout. Ensuite parce que cette représentation favorise le
glissement vers un certain type de programmation, dite non structurée (nous
définirons ce terme plus tard), que l’on tente en général d’éviter. C’est
pourquoi on utilise généralement une série de conventions appelée " pseudo-
code ", qui ressemble à un langage authentique, la plupart des problèmes de
syntaxe étant mis de côté.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
-5-

Chapitre I. LES VARIABLES

Dans un programme informatique, on va avoir en permanence besoin


de stocker provisoirement des valeurs. Il peut s’agir de données issues du
disque dur, fournies par l’utilisateur (frappées au clavier), ou que sais-je
encore. Il peut aussi s’agir de résultats obtenus par le programme,
intermédiaires ou définitifs. Ces données peuvent être de plusieurs types (on
en reparlera) : elles peuvent être des nombres, du texte, etc. Toujours est-il
que dès que l’on a besoin de stocker une information dans un programme,
on utilise une variable.

Pour employer une image, une variable est une boîte, repérée par une
étiquette. Pour avoir accès au contenu de la boîte, il suffit de la désigner par
son étiquette.

En réalité, dans la mémoire vive de l’ordinateur, il n’y a ni boîte ni


étiquette collée dessus. Il y a un emplacement de mémoire, désigné par une
adresse binaire. Le langage informatique se charge, entre autres rôles, de
vous épargner la gestion fastidieuse de ces emplacements mémoire et de
leurs adresses. Il est beaucoup plus facile d’employer les étiquettes de son
choix, que de devoir manier des adresses binaires.

La première chose à faire avant de pouvoir utiliser une variable est de


créer la boîte et de lui coller une étiquette. Ceci se fait tout au début de
l’algorithme, avant même les instructions proprement dites. C’est ce qu’on
appelle la déclaration des variables. C’est un genre de déclaration certes
moins romantique qu’une déclaration d’amour, mais d’un autre côté moins
désagréable qu’une déclaration d’impôts.

Le nom de la variable (l’étiquette de la boîte) obéit à des impératifs


changeant selon les langages. Toutefois, une règle absolue est qu’ils peuvent
comporter des lettres et des chiffres, mais qu’ils excluent la plupart des
signes de ponctuation, en particulier les espaces. Un nom de variable correct

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
-6-

commence impérativement par une lettre. Quant au nombre maximal de


signes pour un nom de variable, il dépend du langage utilisé.

En pseudo-code algorithmique, on est bien sûr libre du nombre de


signes pour un nom de variable, même si pour des raisons purement
pratiques, on évite généralement les noms à rallonge.

I.1. Type des variables

Il ne suffit pas de créer une boîte (réserver un emplacement mémoire) ;


encore doit-on préciser ce que l’on voudra mettre dedans, car de cela
dépendent la taille de la boîte (de l’emplacement mémoire) et le type de
codage utilisé.

I.1.1 Types numériques classiques

Commençons par le cas le plus fréquent, celui d’une variable destinée


à recevoir des nombres. Si l’on réserve un octet pour coder un nombre, on ne
pourra coder que 28 = 256 valeurs différentes. Cela peut signifier par
exemple les nombres entiers de 1 à 256, ou de 0 à 255, ou de –127 à +128,
c’est une pure question de convention. Mais ce qui n’est pas une convention,
c’est qu’on est limité à 256 valeurs possibles. Si l’on réserve deux octets, on
a droit à 65 536 valeurs ; avec trois octets, 16 777 216, etc. Et là se pose un
autre problème : ce codage doit-il représenter des nombres décimaux ? Des
nombres négatifs ?

Bref, le type de codage (autrement dit, le type de variable) choisi pour


un nombre va déterminer :

• Les valeurs maximales et minimales des nombres pouvant être stockés


dans la variable
• La précision de ces nombres (dans le cas de nombres décimaux).

Tous les langages, quels qu’ils soient offrent un " bouquet " de types
numériques, dont le détail est susceptible de varier légèrement d’un langage
à l’autre. Grosso modo, on retrouve cependant les types suivants :

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
-7-

Type Numérique Plage


Byte (octet) 0 à 255
Entier simple -32 768 à 32 767
Entier long -2 147 483 648 à 2 147 483 647
Réel simple -3,40E38 à -1,40E-45 pour les valeurs négatives

1,40E-45 à 3,40E38 pour les valeurs positives


Réel double 1,79E308 à -4,94E-324 pour les valeurs négatives

4,94E-324 à 1,79E308 pour les valeurs positives

Pourquoi ne pas déclarer toutes les variables numériques en réel


double, histoire de bétonner et d’être certain qu’il n’y aura pas de problème ?
En vertu du principe de l’économie de moyens. Un bon algorithme ne se
contente pas de marcher ; il marche en évitant de gaspiller les ressources de
la machine. Sur certains programmes de grande taille, l’abus de variables
surdimensionnées peut entraîner des ralentissements notables à l’exécution,
voire un plantage pur et simple. Alors, autant prendre de bonnes habitudes
d’hygiène.

Une déclaration algorithmique de variables aura ainsi cette tête :

Variable Phi en Entier Long

Variables PrixHT, TauxTVA, PrixTTC en Réel Simple

I.1.2 Autres types numériques

Certains langages autorisent d’autres types numériques, notamment :

• le type monétaire (avec strictement deux chiffres après la virgule)


• le type date (jour / mois / année).

Nous n’emploierons pas ces types ici, mais vous ne manquerez pas de
les rencontrer en programmation proprement dite.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
-8-

I.1.3 Types non numériques

Fort heureusement, les boîtes que sont les variables peuvent contenir
bien d’autres informations que des nombres. Sans cela, on serait un peu
embêté dès que l’on devrait stocker un nom de famille, par exemple.

On dispose donc également du type alphanumérique (également


appelé type caractère) : dans une variable de ce type, on stocke des
caractères, qu’il s’agisse de lettres, de signes de ponctuation, d’espaces, ou
de chiffres. Le nombre maximal de caractères pouvant être stockés dans une
seule variable dépend du langage utilisé. Une série de caractères (stockée ou
non dans une variable alphanumérique, d’ailleurs), s’appelle une chaîne de
caractères. Et une telle chaîne de caractères est toujours notée entre
guillemets. Pourquoi? Parce que 423 peut représenter le nombre 423, ou la
suite de caractères 4, 2, et 3, selon le type de codage (le type de la variable)
qui a été utilisé pour le stocker. Les guillemets permettent d’éviter toute
ambiguïté à ce sujet. On y reviendra.

Un autre type est le type booléen : on y stocke uniquement les valeurs


logiques VRAI et FAUX.

I. 2. L’instruction d’affectation

I. 2. 1. Syntaxe et signification

Après toute cette longue théorie préliminaire, abordons maintenant


nos premières véritables manipulations d’algorithmique.

La seule chose qu’on puisse vraiment faire avec une variable, c’est de
l’affecter, c’est-à-dire lui attribuer une valeur. En algorithmique, cette
instruction se note avec le signe .

Ainsi :

Phigo 24

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
-9-

Ceci veut dire que l’on affecte (attribue) la valeur 24 à la variable


Phigo. Ce qui, soit dit en passant, sous-entend impérativement que Phigo est
une variable de type numérique.

On peut attribuer à une variable la valeur d’une autre variable, telle


quelle ou modifiée. Par exemple :

Fabi Phigo

Signifie que la valeur de Fabi est maintenant celle de Phigo, c'est-à-


dire que nous affectons la valeur de la variable Phigo à la variable Fabi.

Il est à notez que cette instruction n’a modifié en rien la valeur de


Phigo : une instruction d’affectation ne modifie que ce qui est situé à gauche
de la flèche.

Fabi Phigo + 4

Si Phigo contenait 12, Fabi vaut maintenant 16. De même que


précédemment, Phigo vaut toujours 12.

Fabi Fabi + 1

Si Fabi valait 6, il vaut maintenant 7. La valeur de Fabi est modifiée,


puisque Fabi est la variable située à gauche de la flèche.

Pour revenir à présent sur le rôle des guillemets dans les chaînes de
caractères et sur la confusion numéro 2 signalée plus haut, comparons
maintenant deux algorithmes suivants :

Exemple n°1 Exemple n°2


Début Début
Phigo ← "Jeomie" Phigo ← "Jeomie"
Fabi ← "Phigo" Fabi ← Phigo
Fin Fin

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 10 -

La seule différence entre les deux algorithmes consiste dans la


présence ou dans l’absence des guillemets lors de la seconde affectation. Et
l'on voit que cela change tout.

Dans l'exemple n°1, ce que l'on affecte à la variable Fabi, c'est la suite
de caractères P – h – i – g – o. Et à la fin de l’algorithme, le contenu de la
variable Fabi est donc « Phigo ».

Dans l'exemple n°2, en revanche, Phigo étant dépourvu de guillemets,


n'est pas considéré comme une suite de caractères, mais comme un nom de
variable. Le sens de la ligne devient donc : « affecte à la variable Fabi le
contenu de la variable Phigo ». A la fin de l’algorithme n°2, la valeur de la
variable Fabi est donc « Jeomie ». Ici, l’oubli des guillemets conduit certes à
un résultat, mais à un résultat différent.

Il est à noter que généralement, lorsqu’on oublie les guillemets lors


d’une affectation de chaîne, ce qui se trouve à droite du signe d’affectation ne
correspond à aucune variable précédemment déclarée et affectée. Dans ce
cas, l’oubli des guillemets se solde immédiatement par une erreur
d’exécution, ce qui est un cas très fréquent.

Ceci est une simple illustration. Mais elle résume l’ensemble des
problèmes qui surviennent lorsqu’on oublie la règle des guillemets aux
chaînes de caractères.

I. 2. 2 Ordre des instructions

Il va de soi que l’ordre dans lequel les instructions sont écrites va jouer
un rôle essentiel dans le résultat final. Considérons les deux algorithmes
suivant (notez que ce sont les premiers algorithmes complets que nous
examinerons, comme quoi on avance) :

Variable A en Entier Variable A en Entier


Début Début
A 34 A 12
A 12 A 34
Fin Fin

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 11 -

Il est clair que dans le premier cas la valeur finale de A est 12, dans
l’autre elle est 34.

Il est tout aussi clair que ceci ne doit pas nous étonner. Lorsqu’on
indique le chemin à quelqu’un, dire " prenez tout droit sur 1km, puis à
droite " n’envoie pas les gens au même endroit que si l’on dit " prenez à
droite puis tout droit pendant 1 km ".

Enfin, il est également clair que si l’on met de côté leur vertu
pédagogique, les deux algorithmes ci-dessus sont parfaitement idiots ; à tout
le moins ils contiennent une incohérence. Il n’y a aucun intérêt à affecter
une variable pour l’affecter différemment juste après. En l’occurrence, on
aurait tout aussi bien atteint le même résultat en écrivant simplement :

Variable A en Entier Variable A en Entier

Début Début

A 12 A 34

Fin Fin

Tous les éléments sont maintenant en votre possession pour que ce soit à
vous de jouer maintenant !

Applications

0. Quelles seront les valeurs des variables A et B après exécution des


instructions suivantes ?

Variables A, B en Entier
Début
A←1
B←A+3
A←3
Fin

1. Quelles seront les valeurs des variables A, B et C après exécution des


instructions suivantes ?

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 12 -

Variables A, B, C en Entier
Début
A←5
B←3
C←A+B
A←2
C←B–A
Fin

2. Quelles seront les valeurs des variables A et B après exécution des


instructions suivantes ?

Variables A, B en Entier
Début
A←5
B←A+4
A←A+1
B←A–4
Fin

I. 2.3 Expressions et opérateurs

Si on fait le point, on s’aperçoit que dans une instruction d’affectation,


on trouve :

• à gauche de la flèche, un nom de variable, et uniquement cela. En ce


monde empli de doutes qu’est celui de l’algorithmique, c’est une des
rares règles d’or qui marche à tous les coups : si on voit à gauche
d’une flèche d’affectation autre chose qu’un nom de variable, on peut
être certain à 100% qu’il s’agit d’une erreur.

• à droite de la flèche, ce qu’on appelle une expression. Voilà encore un


mot qui est trompeur ; en effet, ce mot existe dans le langage courant,

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 13 -

où il revêt bien des significations. Mais en informatique, le terme


d’expression ne désigne qu’une seule chose, et qui plus est une chose
très précise :

Une expression est un ensemble de valeurs, reliées par des opérateurs,


et équivalent à une seule valeur. Cette définition vous paraît peut-être
obscure. Mais réfléchissez-y quelques minutes, et vous verrez qu’elle
recouvre quelque chose d’assez simple sur le fond. Par exemple, voyons
quelques expressions de type numérique. Ainsi :

7
5+4
123-45+844
Phigo-12+5-Fabi

Elles sont toutes des expressions valides, pour peu que Phigo et Fabi
soient bien des nombres. Car dans le cas contraire, la quatrième expression
n’a pas de sens. En l’occurrence, les opérateurs que j’ai employés sont
l’addition (+) et la soustraction (-).

Revenons pour le moment sur l’affectation. Une condition


supplémentaire (en plus des deux précédentes) de validité d’une instruction
d’affectation est que :

• l’expression située à droite de la flèche soit du même type que la


variable située à gauche. C’est très logique : on ne peut pas ranger
convenablement des outils dans un sac à provision, ni des légumes
dans une trousse à outils. Sauf à provoquer un résultat
catastrophique.

Si l’un des trois points énumérés ci-dessus n’est pas respecté, la


machine sera incapable d’exécuter l’affectation, et déclenchera une erreur
(est-il besoin de dire que si aucun de ces points n’est respecté, il y aura
aussi erreur !)

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 14 -

Revenons maintenant sur ce terme d’opérateurs. Un opérateur est un


signe qui peut relier deux valeurs, pour produire un résultat. Les opérateurs
possibles dépendent du type des valeurs qui sont en jeu. Allons-y, faisons le
tour, c’est un peu fastidieux, mais comme dit le sage, quand c’est fait, c’est
plus à faire.

Opérateurs numériques :

Ce sont les quatre opérations arithmétiques tout ce qu’il y a de classique.

+ Addition
- soustraction
* multiplication
/ division

Mentionnons également le ^ qui signifie " puissance ". 45 au carré


s’écrira donc 45 ^ 2.

Enfin, on a le droit d’utiliser les parenthèses, avec les mêmes règles


qu’en mathématiques. La multiplication et la division ont " naturellement "
priorité sur l’addition. Les parenthèses ne sont ainsi utiles que pour modifier
cette priorité naturelle.

Cela signifie qu’en informatique, 12 * 3 + 5 et (12 * 3) + 5 valent


strictement la même chose, à savoir 41. Pourquoi dès lors se fatiguer à
mettre des parenthèses inutiles ?

En revanche, 12 * (3 + 5) vaut 12 * 8 soit 96. Rien de difficile là-


dedans, que du normal.

Opérateur alphanumérique : &

Cet opérateur permet de concaténer, autrement dit d’agglomérer,


deux chaînes de caractères.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 15 -

Exemple

Variables A, B, C en Caractère
Début
A "Bien"
B "Phil"
C A&B
Fin
La valeur de C à la fin de l’algorithme est "BienPhil"

Opérateurs de comparaison

Les opérateurs de comparaison sont :

> Supérieur
< Inférieur
= Egale
<> Différent
=< Inférieur ou égale
>= Supérieur ou égale
Noter que ces opérateurs de comparaison s’emploient tout à fait avec
des caractères. Ceux-ci sont codés par la machine dans l’ordre alphabétique,
les majuscules étant systématiquement placées avant les minuscules. Ainsi
on a :

"t" < "w" VRAI

"Maman" > "Papa" FAUX

"maman" > "Papa" VRAI

Attention à certains raccourcis du langage courant qui peuvent mener


à des non-sens informatiques. Prenons par exemple la condition " Phigo est
compris entre 5 et 8 ". On peut être tenté de la traduire par : 5 < Phigo < 8.
Or, une telle expression, qui a du sens en mathématiques, ne veut rien dire
en programmation.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 16 -

Opérateurs logiques (ou booléens) :

Il s’agit du ET, du OU et du NON. Nous les laisserons de côté


provisoirement, soyez-en sûrs.

Exercice 1.8
Exercice 1.9

Applications

1. Que produit l’algorithme suivant ?


Variables A, B, C en Caractères
Début
A ← "423"
B ← "12"
C←A+B
Fin
2. Que produit l’algorithme suivant ?
Variables A, B, C en Caractères
Début
A ← "423"
B ← "12"
C←A&B
Fin

1. 3. REMARQUES
Maintenant que nous avons fait connaissance des variables et que
nous les manipulons les yeux fermés (mais les neurones en éveil, toutefois),
j’attire votre attention sur la trompeuse similitude de vocabulaire entre les
mathématiques et l’informatique.

En mathématiques, une « variable » est généralement une inconnue,


qui recouvre un nombre non précisé de valeurs. Lorsque j’écris : y = 3 x + 2,
les « variables » x et y satisfaisant à l’équation existent en nombre infini
(graphiquement, l’ensemble des solutions à cette équation dessine une

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 17 -

droite). Lorsque j’écris : ax² + bx + c = 0, la « variable » x désigne les solutions


à cette équation, c’est-à-dire zéro, une ou deux valeurs à la fois.

En informatique, une variable possède à un moment donné une valeur


et une seule. A la rigueur, elle peut ne pas avoir de valeur du tout (une fois
qu’elle a été déclarée, et tant qu’on ne l’a pas affectée). Il est à signaler que
dans certains langages, les variables non encore affectées sont considérées
comme valant automatiquement zéro. Mais ce qui est important, c’est que
cette valeur justement, ne « varie » pas à proprement parler. Du moins ne
varie-t-elle que lorsqu’elle est l’objet d’une instruction d’affectation.

La deuxième remarque concerne le signe de l’affectation. En


algorithmique, comme on l’a vu, c’est le signe ←. Mais en pratique, la quasi
totalité des langages emploient le signe égal. Et là, pour les débutants, la
confusion avec les maths est également facile. En maths, A = B et B = A sont
deux propositions strictement équivalentes. En informatique, absolument
pas, puisque cela revient à écrire A ← B et B ← A, deux choses bien
différentes. De même, A = A + 1, qui en mathématiques, constitue une
équation sans solution, représente en programmation une action tout à fait
licite (et de surcroît extrêmement courante). Donc, attention ! ! ! La
meilleure des vaccinations contre cette confusion consiste à bien employer le
signe ← en pseudo-code, signe qui a le mérite de ne pas laisser place à
l’ambiguïté. Une fois acquis les bons réflexes avec ce signe, vous n’aurez plus
aucune difficulté à passer au = des langages de programmation.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 18 -

Chapitre II. INSTRUCTION DE LECTURE ET


ECRITURE
1. 1. Introduction

Imaginons que nous ayons fait un programme pour calculer le carré


d’un nombre, mettons 12. Si on a fait au plus simple, on a écrit un truc du
genre :

Exemple

Variable A en Numérique

Début

A 12^2

Fin

Ce programme nous donne le carré de 12. Mais si l’on veut calculer le


carré d’un autre nombre que 12, il faut réécrire le programme.

D’autre part, le résultat est très certainement calculé par la machine.


Mais elle le garde soigneusement pour elle, et le pauvre utilisateur qui fait
exécuter ce programme, lui, ne saura jamais quel est le carré de 12.

C’est pourquoi un certain nombre d’instructions permettent à la


machine de dialoguer avec l’utilisateur.

Dans un sens, cela permet à l’utilisateur d’entrer des valeurs au


clavier pour qu’elles soient utilisées par le programme. Cette opération est
appelée la lecture.

Dans l’autre sens, cela permet au programme de communiquer des


valeurs à l’utilisateur en les affichant à l’écran. Cette opération est appelée
l’écriture.

Remarque essentielle : A première vue, on peut avoir l’impression que les


informaticiens étaient bourrés comme des petites vaches lorsqu’ils ont

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 19 -

baptisé ces opérations; puisque quand l’utilisateur doit écrire au clavier, on


appelle ça la lecture, et quand il doit lire ou afficher sur l’écran on appelle
çà l’écriture. Mais avant d’insulter cette digne corporation, il faut réfléchir
un peu plus loin. Un algorithme, c’est une suite d’instructions que
programme la machine, pas l’utilisateur. Donc quand on dit à la machine de
lire une valeur, cela implique que l’utilisateur va devoir écrire cette valeur. Et
quand on demande à la machine d’écrire une valeur, c’est pour que
l’utilisateur puisse la lire. Lecture et écriture sont donc des termes qui
comme toujours en programmation, doivent être compris du point de vue de
la machine qui sera chargée de les exécuter. Et là, tout devient parfaitement
logique.

II. 2. Les instructions de lecture et d’écriture


Observons cette ligne d’instruction, pour que l’utilisateur entre la (nouvelle)
valeur de Brian, on mettra :

Lire Brian

Dès que le programme rencontre une instruction Lire, l’exécution


s’interrompt, attendant la frappe d’une valeur au clavier de la part de l’utilisateur.

Dès lors, aussitôt que la touche Entrée (Enter) a été frappée, l’exécution
reprend. Dans le sens inverse, pour écrire quelque chose à l’écran, c’est aussi
simple que :

Ecrire Phigo

Avant de Lire une variable, il est très fortement conseillé d’écrire des libellés
à l’écran, afin de prévenir l’utilisateur de ce qu’il doit introduire comme valeur ou
frapper au clavier (sinon, le pauvre utilisateur passe son temps à se demander ce
que l’ordinateur attend de lui et c’est très désagréable !) :

Ecrire "Entrez votre nom : "


Lire NomFamille

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 20 -

Lecture et Ecriture sont des instructions algorithmiques qui ne présentent pas


de difficultés particulières, une fois qu’on a bien assimilé ce problème du sens du
dialogue (homme → machine, ou machine ← homme).

APPLICATION

1. Quel résultat produit le programme suivant ?

Variables val, double numériques


Début
Val ← 231
Double ← Val * 2
Ecrire Val
Ecrire Double
Fin

2. Ecrire un programme qui demande un nombre à l’utilisateur, puis qui


calcule et affiche le carré de ce nombre.

3. Ecrire un programme qui lit le prix HT d’un article, le nombre


d’articles et le taux de TVA, et qui fournit le prix total TTC
correspondant. Faire en sorte que des libellés apparaissent clairement.

4. Ecrire un algorithme utilisant des variables de type chaîne de


caractères, et affichant quatre variantes possibles de la célèbre « belle
marquise, vos beaux yeux me font mourir d’amour ». On ne se soucie
pas de la ponctuation, ni des majuscules.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 21 -

Chapitre III. LES TESTS OU STRUCTURES


CONDITIONNELLES
Nous l’avions dit tout au début que l’algorithmique, c’est la
combinaison de quatre structures élémentaires. Nous en avons déjà vu deux,
voici la troisième. Autrement dit, on a quasiment fini le programme. Mais
non, c’est juste une façon de le dire.

III. 1. De quoi s’agit-il ?

Reprenons le cas de notre " programmation algorithmique du touriste


égaré ". Normalement, notre algorithme ressemblera à quelque chose
comme : " Allez tout droit jusqu’au prochain carrefour, puis prenez à droite
et ensuite la deuxième à gauche, et vous y êtes ".

Mais en cas de doute légitime de votre part, cela pourrait devenir :


" Allez tout droit jusqu’au prochain carrefour et là regardez à droite. Si la rue
est autorisée à la circulation, alors prenez la et ensuite c’est la deuxième à
gauche. Mais si en revanche elle est en sens interdit, alors continuez jusqu’à
la prochaine à droite, prenez celle-là, et ensuite la première à droite ".

Ce deuxième algorithme a ceci de supérieur au premier qu’il prévoit,


en fonction d’une situation pouvant se présenter de deux façons différentes,
deux façons alternatives d’agir. Cela suppose que l’interlocuteur (le touriste)
sache analyser la condition que nous avons fixée à son comportement (" la
rue est-elle en sens interdit ? ") pour effectuer la série d’actions
correspondante.

Eh bien, croyez le ou non, mais les ordinateurs possèdent cette


aptitude, sans laquelle d’ailleurs nous aurions bien du mal à les
programmer. Nous allons donc pouvoir parler à notre ordinateur comme à
notre touriste, et lui donner des séries d’instructions à effectuer selon que la
situation se présente d’une manière ou d’une autre.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 22 -

III. 2. Structure d’un test

Il n’y a que deux formes possibles pour un test ; la forme de gauche


qui est la forme complète, celle de droite qui est la forme simple.

Si booléen Alors Si booléen Alors


Instructions 1 Instructions
Sinon Finsi
Instructions 2
Finsi

Ceci appelle quelques explications. Un booléen est une expression dont


la valeur est VRAIE ou FAUSSE. Cela peut donc être (il n’y a que deux
possibilités) :

• Une variable de type booléen


• Une condition

Nous reviendrons dans quelques instants sur ce qu’est une condition


en informatique.

Toujours est-il que la structure d’un test est relativement claire. Arrivé
à la première ligne (Si…Alors) la machine examine la valeur du booléen. Si ce
booléen a pour valeur " Vrai ", elle exécute la série d’instructions 1. Cette
série d’instructions peut être très brève comme très longue, cela n’a aucune
importance. A la fin de cette série d’instructions, au moment où elle arrive
au mot " Sinon ", la machine sautera directement à la première instruction
située après le " Finsi ". De même, au cas où le booléen avait comme valeur
" Faux ", la machine saute directement à la première ligne située après le
" Sinon " et exécute l’ensemble des " instructions 2 ".

La forme simplifiée correspond au cas où l’une des deux " branches "
du Si est vide. Dès lors, plutôt qu’écrire " sinon ne rien faire du tout ", il est
plus simple de ne rien écrire.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 23 -

Exprimé sous forme de pseudo-code, la programmation de notre


touriste de tout à l’heure donnerait donc quelque chose du genre :

Exemple

Allez tout droit jusqu’au prochain carrefour


Si la rue à droite est autorisée à la circulation Alors
Tournez à droite
Avancez
Prenez la deuxième à gauche
Sinon
Continuez jusqu’à la prochaine rue à droite
Prenez cette rue
Prenez la première à droite
Fin si

III. 3. Qu’est ce qu’une condition ?


Une condition est une comparaison. C’est-à-dire qu’elle est composée
de trois éléments :

• Une valeur
• Un opérateur de comparaison
• Une autre valeur

Les valeurs peuvent être a priori de n’importe quel type (numériques,


caractères, …).

L’ensemble constitue donc si l’on veut une affirmation, qui a un


moment donné est VRAIE ou FAUSSE.

III. 4. Conditions composées

Certains problèmes exigent parfois de formuler des conditions qui ne


peuvent pas être exprimées sous la forme simple exposée ci-dessus.
Reprenons le cas " Phigo est inclus entre 5 et 8 ". En fait cette phrase cache

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 24 -

non une, mais deux conditions. Car elle revient à dire que " Phigo est
supérieur à 5 et Phigo est inférieur à 8 ". Il y a donc bien là deux conditions,
reliées par ce qu’on appelle un opérateur logique, le mot ET.

Comme on l’a évoqué plus haut, l’informatique met à notre disposition


trois opérateurs logiques : ET, OU, et NON. Le ET a le même sens en
informatique que dans le langage courant. Pour que :

Condition1 ET Condition2 soit VRAI, il faut impérativement que


Condition1 soit VRAIE et que Condition2 soit VRAIE.

Il faut se méfier un peu plus du OU. Pour que :

Condition1 OU Condition2 soit VRAI, Il suffit que Condition1 soit


VRAIE ou que Condition2 soit VRAIE. Le point important est que si
Condition1 est VRAIE et que Condition2 est VRAIE aussi, Condition1
OU Condition2 est VRAIE. Le OU informatique ne veut donc pas dire "
ou bien " (sauf dans certaines formes rares, dénommées OU exclusif et
notées XOR).

On représente fréquemment tout ceci dans des tables de vérité :

C1 et C2 C2 Vrai C2 Faux
C1 Vrai Vrai Faux
C1 Faux Faux Faux

C1 ou C2 C2 Vrai C2 Faux
C1 Vrai Vrai Vrai
C1 Faux Vrai Faux

C1 xor C2 C2 Vrai C2 Faux


C1 Vrai Faux Vrai
C1 Faux Vrai Faux

Non C1
C1 Vrai Faux
C1 Faux Vrai

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 25 -

L’exercice de la journée : c’est bien sûr formuler une condition qui ne


pourra jamais être vraie. Si ce n’est pas fait exprès, c’est assez rigolo. Si c’est
fait exprès, c’est encore plus drôle, car une condition dont on sait d’avance
qu’elle sera toujours fausse n’est pas une condition. Cela peut être par
exemple : Si Phigo < 10 ET Phigo > 15, Alors… Bon, ça, c’est un motif
immédiat pour payer une tournée générale, et je sens qu’on ne restera pas
longtemps le gosier sec.

Quelques mots pour finir là-dessus. L’opérateur NON, lui, inverse une
condition :

Condition VRAI NON (Condition) FAUX


NON (X > 15) revient à écrire X =< 15

III. 5. Tests imbriqués

Graphiquement, on peut très facilement représenter un SI comme un


aiguillage de chemin de fer (ou un aiguillage de train électrique, c’est moins
lourd à porter). Un SI ouvre donc deux voies, correspondant à deux
traitements différents. Mais il y a des tas de situations où deux voies ne
suffisent pas. Par exemple, un programme devant donner l’état de l’eau selon
sa température doit pouvoir choisir entre trois réponses possibles (solide,
liquide ou gazeuse).

Exemple

Variable Fabi en Entier


Début
Ecrire "Entrez la température de l’eau :"
Lire Fabi
Si Fabi =< 0 Alors
Ecrire "C’est de la glace"
Finsi
Si Fabi > 0 Et Fabi < 100 Alors

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 26 -

Ecrire "C’est du liquide"


Finsi
Si Fabi > 100 Alors
Ecrire "C’est de la vapeur"
Finsi
Fin

Vous constaterez que c’est un peu laborieux. Les conditions se


ressemblent plus ou moins, et surtout on oblige la machine à examiner trois
tests successifs alors que tous portent sur une même chose, la température
(la valeur de la variable Fabi). Il serait ainsi bien plus rationnel d’imbriquer
les tests de cette manière :

Exemple

Variable Fabi en Entier


Début
Ecrire "Entrez la température de l’eau :"
Lire Fabi
Si Fabi =< 0 Alors
Ecrire "C’est de la glace"
Sinon
Si Fabi < 100 Alors
Ecrire "C’est du liquide"
Sinon
Ecrire "C’est de la vapeur"
Finsi
Finsi
Fin

Nous avons fait des économies au niveau de la frappe du programme :


au lieu de devoir taper trois conditions, dont une composée, nous n’avons
plus que deux conditions simples. Mais aussi, et surtout, nous avons fait
des économies sur le temps d’exécution de l’ordinateur. Si la température est

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 27 -

inférieure à zéro, celui-ci écrit dorénavant " C’est de la glace " et passe
directement à la fin, sans être ralenti par l’examen d’autres possibilités (qui
sont forcément fausses). Cette deuxième version n’est donc pas seulement
plus simple à écrire et plus lisible, elle est également plus performante à
l’exécution.

Les structures de tests imbriqués sont donc un outil indispensable à la


simplification et à l’optimisation des algorithmes.

III. 6. De l’aiguillage à la gare de tri

Cette citation n’apporte peut-être pas grand chose à cet exposé, mais
je l’aime bien, alors c’était le moment ou jamais.

En effet, dans un programme, une structure SI peut être facilement


comparée à un aiguillage de train. La voie principale se sépare en deux, le
train devant rouler ou sur l’une, ou sur l’autre, et les deux voies se
rejoignant tôt ou tard pour ne plus en former qu’une seule, lors du FinSi. On
peut schématiser cela ainsi :

Mais dans certains cas, ce ne sont pas deux voies qu’il nous faut, mais
trois, ou même plus. Dans le cas de l’état de l’eau, il nous faut trois voies
pour notre « train », puisque l’eau peut être solide, liquide ou gazeuse. Alors,
nous n’avons pas eu le choix : pour deux voies, il nous fallait un aiguillage,
pour trois voies il nous en faut deux, imbriqués l’un dans l’autre.

Cette structure (telle que nous l’avons programmée à la page


précédente) devrait être schématisée comme suit :

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 28 -

Soyons bien clairs : cette structure est la seule possible du point de


vue logique (même si on peut toujours mettre le bas en haut et le haut en
bas). Mais du point de vue de l’écriture, le pseudo-code algorithmique admet
une simplification supplémentaire. Ainsi, il est possible (mais non
obligatoire, que l’algorithme initial :

Variable Fabi en Entier


Début
Ecrire "Entrez la température de l’eau :"
Lire Fabi
Si Fabi =< 0 Alors
Ecrire "C'est de la glace"
Sinon
Si Fabi < 100 Alors
Ecrire "C’est du liquide"
Sinon
Ecrire "C’est de la vapeur"
Finsi
Finsi
Fin

Devient :
Variable Fabi en Entier
Début
Ecrire "Entrez la température de l’eau :"
Lire Fabi
Si Fabi =< 0 Alors
Ecrire "C’est de la glace"

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 29 -

SinonSi Fabi < 100 Alors


Ecrire "C’est du liquide"
Sinon
Ecrire "C’est de la vapeur"
Finsi
Fin
Dans le cas de tests imbriqués, le Sinon et le Si peuvent être fusionnés
en un SinonSi. On considère alors qu’il s’agit d’un seul bloc de test, conclu
par un seul FinSi
Le SinonSi permet en quelque sorte de créer (en réalité, de simuler)
des aiguillages à plus de deux branches. On peut ainsi enchaîner les SinonSi
les uns derrière les autres pour simuler un aiguillage à autant de branches
que l’on souhaite.

III. 7. Variables Booléennes

Jusqu’ici, nous avons utilisé uniquement des conditions pour faire des
choix. Mais vous vous rappelez qu’il existe un type de variables (les
booléennes) susceptibles de stocker les valeurs VRAI ou FAUX. En fait, on
peut donc entrer des conditions dans ces variables, et tester ensuite la
valeur de ces variables.

Reprenons l’exemple de l’eau. On peut le réécrire ainsi :


Variable Fabi en Entier
Variables A, B en Booléen
Début
Ecrire "Entrez la température de l’eau :"
Lire Fabi
A Fabi =< 0
B Fabi < 100
Si A Alors
Ecrire "C’est de la glace"
Sinon
B Alors
Ecrire "C’est du liquide"
Sinon
Ecrire "C’est de la vapeur"

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 30 -

Finsi
Finsi
Fin

A priori, cette technique ne présente guère d’intérêt : on a alourdi


plutôt qu’allégé l’algorithme de départ, en lui faisant recourir à deux
variables supplémentaires. Mais :

• Une variable booléenne n’a besoin que d’un seul bit pour être stockée.
L’alourdissement de ce point de vue n’est donc pas considérable.
• Dans certains cas, notamment celui de conditions composées très
lourdes (avec plein de ET et de OU tout partout) cette technique peut
faciliter le travail du programmeur. Les variables booléennes peuvent
également s’avérer très utiles pour servir de flag, technique dont on
reparlera plus loin (rassurez-vous, rien à voir avec le flagrant délit des
policiers).

III. 7. Quelques jeux logiques

Une remarque pour commencer : dans le cas de conditions composées,


les parenthèses jouent un rôle important.

Exemple
Variables A, B, C, D, E en Booléen
Variable X en Entier
Début
Lire X
A ← X > 12
B←X>2
C←X<6
D ← (A ET B) OU C
E ← A ET (B OU C)
Ecrire D, E
Fin

Si X = 3, alors on remarque que D sera VRAI alors que E sera FAUX.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 31 -

S’il n’y a dans une condition que des ET, ou que des OU, en revanche,
les parenthèses ne changent strictement rien.
Dans une condition composée employant à la fois des opérateurs ET et
des opérateurs OU, la présence de parenthèses possède une influence sur le
résultat, tout comme dans le cas d’une expression numérique comportant
des multiplications et des additions.
On en arrive à une autre propriété des ET et des OU, bien plus
intéressante.
Spontanément, on pense souvent que ET et OU s’excluent
mutuellement, au sens où un problème donné s’exprime soit avec un ET,
soit avec un OU. Pourtant, ce n’est pas si évident.
Quand faut-il ouvrir la fenêtre de la salle ? Uniquement si les
conditions l’imposent, à savoir :
Si il fait trop chaud ET il ne pleut pas Alors
Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi
Cette petite règle pourrait tout aussi bien être formulée comme suit :
Si il ne fait pas trop chaud OU il pleut Alors
Fermer la fenêtre
Sinon
Ouvrir la fenêtre
Finsi
Ces deux formulations sont strictement équivalentes. Ce qui nous
amène à la conclusion suivante :
Toute structure de test requérant une condition composée faisant
intervenir l’opérateur ET peut être exprimée de manière équivalente avec un
opérateur OU, et réciproquement.
Ceci est moins surprenant qu’il n’y paraît au premier abord. Jetez
pour vous en convaincre un œil sur les tables de vérité, et vous noterez la
symétrie entre celle du ET et celle du OU. Dans les deux tables, il y a trois
cas sur quatre qui mènent à un résultat, et un sur quatre qui mène au

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 32 -

résultat inverse. Alors, rien d’étonnant à ce qu’une situation qui s’exprime


avec une des tables (un des opérateurs logiques) puisse tout aussi bien être
exprimée avec l’autre table (l’autre opérateur logique). Toute l’astuce consiste
à savoir effectuer correctement ce passage.
Bien sûr, on ne peut pas se contenter de remplacer purement et
simplement les ET par des OU ; ce serait un peu facile. La règle
d’équivalence est la suivante (on peut la vérifier sur l’exemple de la fenêtre) :
Si A ET B Alors
Instructions 1
Sinon
Instructions 2
Finsi
équivaut à :
Si NON A OU NON B Alors
Instructions 2
Sinon
Instructions 1
Finsi

Cette règle porte le nom de transformation de Morgan, du nom du


mathématicien anglais qui l'a formulée.

III. 8. Au-delà de la logique : le style


Ce titre un peu provocateur (mais néanmoins justifié) a pour but
d’attirer maintenant votre attention sur un fait fondamental en
algorithmique, fait que plusieurs remarques précédentes ont déjà dû vous
faire soupçonner : il n’y a jamais une seule manière juste de traiter les
structures alternatives. Et plus généralement, il n’y a jamais une seule
manière juste de traiter un problème. Entre les différentes possibilités, qui
ne sont parfois pas meilleures les unes que les autres, le choix est une
affaire de style.
C’est pour cela qu’avec l’habitude, on reconnaît le style d’un
programmeur aussi sûrement que s’il s’agissait de style littéraire.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 33 -

Reprenons nos opérateurs de comparaison maintenant familiers, le ET


et le OU. En fait, on s’aperçoit que l’on pourrait tout à fait s’en passer ! Par
exemple, pour reprendre l’exemple de la fenêtre de la salle :
Si il fait trop chaud ET il ne pleut pas Alors
Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi
Possède un parfait équivalent algorithmique sous la forme de :
Si il fait trop chaud Alors
Si il ne pleut pas Alors
Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi
Sinon
Fermer la fenêtre
Finsi
Dans cette dernière formulation, nous n’avons plus recours à une
condition composée (mais au prix d’un test imbriqué supplémentaire) et
comme tout ce qui s’exprime par un ET peut aussi être exprimé par un OU,
nous en concluons que le OU peut également être remplacé par un test
imbriqué supplémentaire. On peut ainsi poser cette règle stylistique
générale :
Dans une structure alternative complexe, les conditions composées,
l’imbrication des structures de tests et l’emploi des variables booléennes
ouvrent la possibilité de choix stylistiques différents. L’alourdissement des
conditions allège les structures de tests et le nombre des booléens
nécessaires ; l’emploi de booléens supplémentaires permet d’alléger les
conditions et les structures de tests, et ainsi de suite.
Si vous avez compris ce qui précède, et que l'exercice de la date ne
vous pose plus aucun problème, alors vous savez tout ce qu'il y a à savoir

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 34 -

sur les tests pour affronter n'importe quelle situation. Non, ce n'est pas de la
démagogie.
Malheureusement, nous ne sommes pas tout à fait au bout de nos
peines ; il reste une dernière structure logique à examiner, et pas des
moindres.

Applications

1. Ecrire un algorithme qui demande un nombre à l’utilisateur, et


l’informe ensuite si ce nombre est positif ou négatif (on laisse de côté le
cas où le nombre vaut zéro).

2. Ecrire un algorithme qui demande deux nombres à l’utilisateur et


l’informe ensuite si leur produit est négatif ou positif (on laisse de côté
le cas où le produit est nul). Attention toutefois : on ne doit pas
calculer le produit des deux nombres.

3. Ecrire un algorithme qui demande trois noms à l’utilisateur et


l’informe ensuite s’ils sont rangés ou non dans l’ordre alphabétique.

4. Formulez un algorithme équivalent à l’algorithme suivant :


Si Tutu > Toto + 4 OU Tata = "OK" Alors
Tutu ← Tutu + 1
Sinon
Tutu ← Tutu – 1
Finsi

5. Cet algorithme est destiné à prédire l'avenir, et il doit être infaillible !


Il lira au clavier l’heure et les minutes, et il affichera l’heure qu’il sera
une minute plus tard. Par exemple, si l'utilisateur tape 21 puis 32,
l'algorithme doit répondre :
"Dans une minute, il sera 21 heure(s) 33".
NB : on suppose que l'utilisateur entre une heure valide. Pas besoin
donc de la vérifier.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 35 -

6. De même que le précédent, cet algorithme doit demander une heure et


en afficher une autre. Mais cette fois, il doit gérer également les
secondes, et afficher l'heure qu'il sera une seconde plus tard.
Par exemple, si l'utilisateur tape 21, puis 32, puis 8, l'algorithme
doit répondre : "Dans une seconde, il sera 21 heure(s), 32 minute(s) et
9 seconde(s)".
NB : là encore, on suppose que l'utilisateur entre une date valide.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 36 -

Chapitre IV. LES BOUCLES OU STRUCTURES


REPETITIVES

IV. 1. A quoi cela sert-il donc ?


Prenons le cas d’une saisie au clavier (une lecture), par exemple, on
pose une question à laquelle l’utilisateur doit répondre par O (Oui) ou N
(Non). Mais l’utilisateur, facétieux ou maladroit, risque fort tôt ou tard de
taper autre chose que cela. Dès lors, le programme peut soit planter par une
erreur d’exécution (parce que le type de réponse ne correspond pas au type
de la variable attendu) soit se dérouler normalement jusqu’au bout, mais en
produisant des résultats fantaisistes. Alors, dans tout programme un tant
soit peu sérieux, on met en place ce qu’on appelle un contrôle de saisie
(pour vérifier que les données entrées au clavier correspondent bien à celles
attendues par l’algorithme.

A vue de nez, on pourrait essayer avec un SI. Voyons voir ce que ça donne :

Variable Rep en Caractère


Ecrire "Voulez vous un café ? (O/N)"
Lire Rep
Si Rep <> "O" ET Rep <> "N" Alors
Ecrire "Saisie erronnée. Recommencez"
Lire Rep
FinSi

C’est impeccable. Du moins tant que l’utilisateur a le bon goût de ne


se tromper qu’une seule fois, et d’entrer une valeur correcte à la deuxième
demande. Si l’on veut également bétonner en cas de deuxième erreur, il
faudrait rajouter un SI. Et ainsi de suite, on peut rajouter des centaines de
SI, et écrire un algorithme aussi lourd qu’une blague des Grosses Têtes, on
n’en sortira pas, il y aura toujours moyen qu’un acharné flanque le
programme par terre. C’est donc une impasse.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 37 -

IV. 2. Une première structure de boucle (Tant Que)


La seule issue est donc cette structure de boucle, qui se présente ainsi :

TantQue booléen
...
Instructions
...
FinTantQue

Le principe est simple : le programme arrive sur la ligne du TantQue. Il


examine alors la valeur du booléen (qui, je le rappelle, peut être une variable
booléenne ou, plus fréquemment, une condition). Si cette valeur est VRAI, le
programme exécute les instructions qui suivent, jusqu’à ce qu’il rencontre la
ligne FinTantQue. Il retourne ensuite sur la ligne du TantQue, procède au
même examen, et ainsi de suite. Le manège enchanté ne s’arrête que lorsque
le booléen prend la valeur FAUX. Illustration avec notre problème de contrôle
de saisie :

Variable Rep en Caractère


Ecrire "Voulez vous un café ? (O/N)"
TantQue Rep <> "O" ET Rep <> "N"
Lire Rep
Si Rep <> "O" ET Rep <> "N" Alors
Ecrire "Saisie erronnée. Recommencez"
FinSi
FinTantQue

On remarquera que la présence du bloc " Si " est uniquement là pour


l’affichage éventuel du message de saisie erronée. En lui-même, le bloc " tant
que " est d’une simplicité biblique. Le jeu de la journée : c’est d’écrire une
structure TantQue dans laquelle le booléen ne devient jamais faux !
L’ordinateur tourne alors dans la boucle comme un dératé et n’en sort plus.
Seule solution, quitter le programme avec un démonte-pneu ou un bâton de
dynamite. Cette faute de programmation grossière mais fréquente ne

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 38 -

manquera pas d’égayer l’ambiance collective de cette formation et


accessoirement d’étancher la soif proverbiale de vos enseignants.

IV. 3. Boucler en comptant, ou compter en bouclant


Dans le dernier algorithme, vous avez remarqué qu’une boucle était
fréquemment utilisée pour augmenter la valeur d’une variable. Il arrive
également très souvent qu’on ait besoin d’effectuer un nombre déterminé de
passages. Or, a priori, notre structure TantQue ne sait pas à l’avance
combien de tours de boucle elle va effectuer (cela dépend d’une condition).
C’est pourquoi une autre structure de boucle est à notre disposition :

Variable Truc en Entier


Truc 0
TantQue Truc < 15
Truc = Truc + 1
Ecrire "Passage numéro : ", Truc
FinTantQue

Equivaut à :

Variable Truc en Entier


Pour Truc = 1 à 15
Ecrire "Passage numéro : ", Truc
Truc Suivant

Au sens strict, on pourrait donc s’en dispenser, mais c’est tellement


agréable de faire moins d’efforts.

IV. 4. Des boucles dans des boucles


De même qu’une structure SI … ALORS peut contenir d’autres
structures SI … ALORS, une boucle peut contenir d’autres boucles.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 39 -

Variables Truc, Trac en Entier


Pour Truc 1 à 15
Ecrire "Il est passé par ici"
Pour Trac 1à6
Ecrire "Il repassera par là"
Trac Suivant
Truc Suivant

Dans cet exemple, le programme écrira une fois "il est passé par ici"
puis six fois de suite "il repassera par là", et ceci quinze fois en tout. A la fin,
il y aura donc eu 15 x 6 = 90 passages dans la deuxième boucle (celle du
milieu). Notez la différence marquante avec cette structure :

Variables Truc, Trac en Entier


Pour Truc 1 à 15
Ecrire "Il est passé par ici"
Truc Suivant
Pour Trac 1à6
Ecrire "Il repassera par là"
Trac Suivant

Ici, il y aura quinze écritures consécutives du message "il est passé par
ici", puis six écritures consécutives du message "il repassera par là" , et ce
sera tout. Si des boucles peuvent être imbriquées (cas n°1) ou successives
(cas n°2), elles ne peuvent jamais, au grand jamais, être croisées. Cela
n’aurait aucun sens logique, et de plus, bien peu de langages vous
autoriseraient ne serait-ce qu’à écrire cette structure aberrante.

Variables Truc, Trac en Entier

Pour Truc ...


Instructions
Pour Trac ...
Instructions
Truc Suivant

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 40 -

Instructions
Trac Suivant

IV. 5. Et encore une tournée générale

Examinons l’algorithme suivant :

Variable Truc en Entier


Pour Truc 1 à 15
Truc Truc * 2
Ecrire "Passage numéro : ", Truc
Truc Suivant

Vous remarquerez que nous faisons ici gérer " en double " la variable
Truc, ces deux gestions étant contradictoires. D’une part, la ligne " Pour… "
augmente la valeur de Truc de 1 à chaque passage. D’autre part la ligne
" Truc Truc * 2 " double la valeur de Truc à chaque passage. Il va sans dire
que de telles manipulations perturbent complètement le déroulement normal
de la boucle, et sont sources d’exécutions erratiques.

L’exercice de la journée : consiste donc à manipuler, au sein d’une


boucle Pour, la variable qui sert de compteur à cette boucle. Cette technique
est à proscrire absolument.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 41 -

Chapitre V. LES TABLEAUX

A. TABLEAUX UNIDIMENSIONNELS

A. 1. Utilité des tableaux

Imaginons que dans un programme, nous ayons besoin


simultanément de 12 valeurs (par exemple, des notes pour calculer une
moyenne). Evidemment, la seule solution dont nous disposons à l’heure
actuelle consiste à déclarer quinze variables, appelées par exemple Notea,
Noteb, Notec, etc. Bien sûr, on peut opter pour une notation un peu
simplifiée, par exemple N1, N2, N3, etc. Mais cela ne change pas
fondamentalement notre problème, car arrivé au calcul, cela donnera
obligatoirement une atrocité du genre :

Moy = (N1 + N2 + N3 + N4 + N5 + N6 + N7 + N8 + N9 + N10 + N11 + N12) / 12

Ouf ! C’est tout de même bigrement laborieux. Et pour un peu que


nous soyons dans un programme de gestion avec quelques centaines ou
quelques milliers de valeurs à traiter, alors là c’est direct le suicide.

Cerise sur le gâteau, pour peu que l’on ne puisse savoir d’avance
combien il y aura de valeurs à traiter, là on est carrément cuits.

C’est pourquoi la programmation nous permet de rassembler toutes


ces variables en une seule, au sein de laquelle chaque valeur sera désignée
par un numéro. En bon français, cela donnerait donc quelque chose du
genre " la note numéro 1 ", " la note numéro 2 ", " la note numéro 8 ". C’est
largement plus pratique, vous vous en doutez.

Un ensemble de valeurs portant ainsi le même nom de variable et


repérées par un nombre, s’appelle un tableau, ou encore une variable
indicée. Et le nombre qui sert à repérer chaque valeur s’appelle un indice.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 42 -

A. 2. Notation et utilisation algorithmique.

Dans notre exemple, nous créerons donc un tableau appelé Note (ou
N, si on veut aller plus vite). Et chaque note individuelle sera désignée
Note(1), Note(2), etc.

Un tableau doit être déclaré comme tel, en précisant le nombre et le


type de valeurs qu’il contiendra (la déclaration des tableaux est susceptible
de varier d'un langage à l'autre. Certains langages réclament le nombre
d'éléments, d'autre le plus grand indice... C'est donc une affaire de
conventions).

En nous calquant sur les choix les plus fréquents dans les langages de
programmations, nous déciderons ici arbitrairement et une bonne fois pour
toutes que :

• Les "cases" sont numérotées à partir de zéro, autrement dit que le plus
petit indice est zéro.

• Lors de la déclaration d'un tableau, on précise la plus grande valeur de


l'indice (différente, donc, du nombre de cases du tableau, puisque si
on veut 12 emplacements, le plus grand indice sera 11). Au début, ça
déroute, mais vous verrez, avec le temps, on se fait à tout, même au
pire.

Tableau Note(11) en Entier

On peut créer des tableaux contenant des variables de tous types :


tableaux de numériques, bien sûr, mais aussi tableaux de caractères, de
booléens, de tout ce qui existe dans un langage donné comme type de
variables. Par contre, hormis dans quelques rares langages, on ne peut pas
faire un mixage de types différents de valeurs au sein d’un même tableau.

L’énorme avantage des tableaux, c’est qu’on va pouvoir les traiter en


faisant des boucles. Par exemple, pour effectuer notre calcul de moyenne,
cela donnera :

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 43 -

Tableau Note(11) en Numérique


Variables Moy, Som en Numérique
Début
Pour i ← 0 à 11
Ecrire "Entrez la note n°", i
Lire Note(i)
i Suivant
Som ← 0
Pour i ← 0 à 11
Som ← Som + Note(i)
i Suivant
Moy ← Som / 12
Fin

NB : On a fait deux boucles successives pour plus de lisibilité, mais on


aurait tout aussi bien pu n’en écrire qu’une seule dans laquelle on aurait
tout fait d’un seul coup.

Remarque générale : l’indice qui sert à désigner les éléments d’un tableau
peut être exprimé directement comme un nombre en clair, mais il peut être
aussi une variable, ou une expression calculée.
Dans un tableau, la valeur d’un indice doit toujours :

• être égale au moins à 0 (dans quelques rares langages, le premier


élément d’un tableau porte l’indice 1). Mais comme je l'ai déjà dit plus
haut, nous avons choisi ici de commencer la numérotation des indices
à zéro, comme c’est le cas en langage C et en Visual Basic. Donc
attention, Truc(6) est le septième élément du tableau Truc !
• être un nombre entier Quel que soit le langage, l’élément Truc(3,1416)
n’existe jamais.
• être inférieure ou égale au nombre d’éléments du tableau (moins 1, si
l’on commence la numérotation à zéro). Si le tableau Bidule a été
déclaré comme ayant 25 éléments, la présence dans une ligne, sous

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 44 -

une forme ou sous une autre, de Bidule(32) déclenchera


automatiquement une erreur.

Je le re-re-répète, si l’on est dans un langage où les indices


commencent à zéro, il faut en tenir compte à la déclaration :
Tableau Note(13) en Numérique
...créera un tableau de 14 éléments, le plus petit indice étant 0 et le plus
grand 13.

L’exercice de la journée consiste à confondre, dans sa tête et / ou dans


un algorithme, l’indice d’un élément d’un tableau avec le contenu de cet
élément. La troisième maison de la rue n’a pas forcément trois habitants, et
la vingtième vingt habitants. En notation algorithmique, il n’y a aucun
rapport entre i et truc(i).

A. 3. Tableaux dynamiques
Il arrive fréquemment que l’on ne connaisse pas à l’avance le nombre
d’éléments que devra comporter un tableau. Bien sûr, une solution
consisterait à déclarer un tableau gigantesque (10 000 éléments, pourquoi
pas) pour être sûr que « ça rentre ». Mais d’une part, on n’en sera jamais
parfaitement sûr, d’autre part, en raison de l’immensité de la place mémoire
réservée et la plupart du temps non utilisée, c’est un gâchis préjudiciable à
la rapidité, voire à la viabilité, de notre algorithme.

Aussi, pour parer à ce genre de situation, a-t-on la possibilité de


déclarer le tableau sans préciser au départ son nombre d’éléments. Ce n’est
que dans un second temps, au cours du programme, que l’on va fixer ce
nombre via une instruction de redimensionnement : Redim.

Notez que tant qu’on n’a pas précisé le nombre d’éléments d’un
tableau, d’une manière ou d’une autre, ce tableau est inutilisable.

Exemple : on veut faire saisir des notes pour un calcul de moyenne, mais on
ne sait pas combien il y aura de notes à saisir. Le début de l’algorithme
sera quelque chose du genre :

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 45 -

Tableau Notes() en Numérique


Variable nb en Numérique
Début
Ecrire "Combien y a-t-il de notes à saisir ?"
Lire nb
Redim Notes(nb-1)

Cette technique n’a rien de sorcier, mais elle fait partie de l’arsenal de
base de la programmation en gestion.

A. 4. Tri d’un tableau

Ce qui suit est incontournable. Combien de fois au cours d’une


carrière (brillante) de développeur a-t-on besoin de ranger des valeurs dans
un ordre donné ? C’est incalculable. Aussi, plutôt qu’avoir à réinventer à
chaque fois la roue, le fusil à tirer dans les coins, le fil à couper le roquefort
et la poudre à maquiller, vaut-il mieux avoir assimilé quelques techniques
solidement éprouvées, même si elles paraissent un peu ardues au départ.

Il existe plusieurs stratégies possibles pour trier les éléments d’un


tableau ; nous en verrons une : le tri par sélection et le tri à bulles.

A. 4. 1. Le tri par sélection

Admettons que le but de la manœuvre soit de trier un tableau de 12


éléments dans l’ordre croissant. La technique du tri par sélection est la
suivante : on met en bonne position l’élément numéro 1, c’est-à-dire le plus
petit. Puis en met en bonne position l’élément suivant. Et ainsi de suite
jusqu’au dernier. Par exemple, si l’on part de :

45 122 12 3 21 78 64 53 89 28 84 46

On commence par rechercher, parmi les 12 valeurs, quel est le plus


petit élément, et où il se trouve. On l’identifie en quatrième position (c’est le

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 46 -

nombre 3), et on l’échange alors avec le premier élément (le nombre 45). Le
tableau devient ainsi :

3 122 12 45 21 78 64 53 89 28 84 46

On recommence à chercher le plus petit élément, mais cette fois,


seulement à partir du deuxième (puisque le premier est maintenant correct,
on n’y touche plus). On le trouve en troisième position (c’est le nombre 12).
On échange donc le deuxième avec le troisième :

3 12 122 45 21 78 64 53 89 28 84 46

On recommence à chercher le plus petit élément à partir du troisième


(puisque les deux premiers sont maintenant bien placés), et on le place
correctement, en l’échangeant, ce qui donnera in fine :

3 12 21 45 122 78 64 53 89 28 84 46

Et cetera, et cetera, jusqu’à l’avant dernier.


En bon français, nous pourrions décrire le processus de la manière
suivante :

• Boucle principale : prenons comme point de départ le premier élément,


puis le second, etc. jusqu’à l’avant dernier.
• Boucle secondaire : à partir de ce point de départ mouvant,
recherchons jusqu’à la fin du tableau quel et le plus petit élément. Une
fois que nous l’avons trouvé, nous l’échangeons avec le point de
départ.

Mais tout cela serait bien aride et sans saveur, si nous nous privions du
spectacle assez étonnant de cet algorithme permettant d’effectuer cette tâche
est le suivant :

La boucle principale : le point de départ se décale à chaque tour

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 47 -

Pour i ← 0 à 10
mini = t(i)
posmini ← i
on examine tous les éléments suivants
Pour j ← i + 1 à 11
Si t(j) < t(posmini) Alors
posmini ← j
Finsi
j suivant
A cet endroit, on sait maintenant où est le plus petit élément. Il ne reste plus
qu'à effectuer la permutation.
temp ← t(posmini)
t(posmini) ← t(i)
t(i) ← temp
On a placé correctement l'élément numéro i, on passe à présent au suivant.
i suivant

A. 4. 2. Un exemple: la recherche dans un tableau

Nous allons maintenant nous intéresser au maniement habile d’une


variable booléenne : la technique dite du « flag ».

Le flag, en anglais, est un petit drapeau, qui va rester baissé aussi


longtemps que l’événement attendu ne se produit pas. Et, aussitôt que cet
événement a lieu, le petit drapeau se lève (la variable booléenne change de
valeur). Ainsi, la valeur finale de la variable booléenne permet au
programmeur de savoir si l’événement a eu lieu ou non.

Tout ceci peut vous sembler un peu fumeux, mais cela devrait
s’éclairer à l’aide d’un exemple extrêmement fréquent : la recherche de
l’occurrence d’une valeur dans un tableau. On en profitera au passage pour
corriger une erreur particulièrement fréquente chez le programmeur
débutant.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 48 -

Soit un tableau comportant, disons, 20 valeurs. L’on doit écrire un


algorithme saisissant un nombre au clavier, et qui informe l’utilisateur de la
présence ou de l’absence de la valeur saisie dans le tableau.

La première étape, évidente, consiste à écrire les instructions de


lecture / écriture, et la boucle car il y en a manifestement une de parcours
du tableau :

Tableau Tab(19) en Numérique


Variable N en Numérique
Début
Ecrire "Entrez la valeur à rechercher"
Lire N
Pour i ← 0 à 19
???
i suivant
Fin

Il nous reste à combler les points d'interrogation de la boucle Pour.


Évidemment, il va falloir comparer N à chaque élément du tableau : si les
deux valeurs sont égales, alors bingo, N fait partie du tableau. Cela va se
traduire, bien entendu, par un Si … Alors … Sinon. Et voilà le programmeur
raisonnant hâtivement qui se vautre en écrivant :

Tableau Tab(19) en Numérique


Variable N en Numérique
Début
Ecrire "Entrez la valeur à rechercher"
Lire N
Pour i ← 0 à 19
Si N = Tab(i) Alors
Ecrire N "fait partie du tableau"
Sinon
Ecrire N "ne fait pas partie du tableau"
FinSi

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 49 -

i suivant
Fin

Et patatras, cet algorithme est une véritable catastrophe.

Il suffit d'ailleurs de le faire tourner mentalement pour s'en rendre


compte. De deux choses l'une : ou bien la valeur N figure dans le tableau, ou
bien elle n'y figure pas. Mais dans tous les cas, l'algorithme ne doit produire
qu'une seule réponse, quel que soit le nombre d'éléments que compte le
tableau. Or, l'algorithme ci-dessus envoie à l'écran autant de messages qu'il
y a de valeurs dans le tableau, en l'occurrence pas moins de 20.

Il y a donc une erreur manifeste de conception : l'écriture du message


ne peut se trouver à l'intérieur de la boucle : elle doit figurer à l'extérieur. On
sait si la valeur était dans le tableau ou non uniquement lorsque le balayage
du tableau est entièrement accompli.

Nous réécrivons donc cet algorithme en plaçant le test après la boucle.


Faute de mieux, on se contentera de faire dépendre pour le moment la
réponse d'une variable booléenne que nous appellerons Trouvé.

Tableau Tab(19) en Numérique


Variable N en Numérique
Début
Ecrire "Entrez la valeur à rechercher"
Lire N
Pour i ← 0 à 19
???
i suivant
Si Trouvé Alors
Ecrire "N fait partie du tableau"
Sinon
Ecrire "N ne fait pas partie du tableau"
FinSi
Fin

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 50 -

Il ne nous reste plus qu'à gérer la variable Trouvé. Ceci se fait en deux
étapes.

• Un test figurant dans la boucle, indiquant lorsque la variable Trouvé


doit devenir vraie (à savoir, lorsque la valeur N est rencontrée dans le
tableau). Et attention : le test est asymétrique. Il ne comporte pas de
"sinon". On reviendra là dessus dans un instant.
• L'affectation par défaut de la variable Trouvé, dont la valeur de départ
doit être évidemment Faux.

Au total, l'algorithme complet et juste est le suivant :

Tableau Tab(19) en Numérique


Variable N en Numérique
Début
Ecrire "Entrez la valeur à rechercher"
Lire N
Trouvé ← Faux
Pour i ← 0 à 19
Si N = Tab(i) Alors
Trouvé ← Vrai
FinSi
i suivant
Si Trouvé Alors
Ecrire "N fait partie du tableau"
Sinon
Ecrire "N ne fait pas partie du tableau"
FinSi
Fin

Méditons un peu sur cette affaire.


La difficulté est de comprendre que dans une recherche, le problème
ne se formule pas de la même manière selon qu'on le prend par un bout ou
par un autre. On peut résumer l'affaire ainsi : il suffit que N soit égal à une
seule valeur de Tab pour qu'elle fasse partie du tableau. En revanche, il faut

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 51 -

qu'elle soit différente de toutes les valeurs de Tab pour qu'elle n'en fasse pas
partie.

Voilà la raison qui nous oblige à passer par une variable booléenne, un
« drapeau » qui peut se lever, mais ne jamais se rabaisser. Et cette technique
de flag (que nous pourrions élégamment surnommer « gestion asymétrique
de variable booléenne ») doit être mise en œuvre chaque fois que l’on se
trouve devant pareille situation.

Autrement dit, connaître ce type de raisonnement est indispensable, et


savoir le reproduire à bon escient ne l'est pas moins.

A. 4. 3. Tri de tableau + flag = tri à bulles

Et maintenant, nous en arrivons à la formule magique : tri de tableau


+ flag = tri à bulles.

L’idée de départ du tri à bulles consiste à se dire qu’un tableau trié en


ordre croissant, c’est un tableau dans lequel tout élément est plus petit que
celui qui le suit.

En effet, prenons chaque élément d’un tableau, et comparons-le avec


l’élément qui le suit. Si l’ordre n’est pas bon, on permute ces deux éléments.
Et on recommence jusqu’à ce que l’on n’ait plus aucune permutation à
effectuer. Les éléments les plus grands « remontent » ainsi peu à peu vers les
dernières places, ce qui explique la charmante dénomination de « tri à
bulle ». Comme quoi l’algorithmique n’exclut pas un minimum syndical de
sens poétique.

Vous pouvez à présent retirer vos boules et passer à l'écriture de


l'algorithme. En quoi le tri à bulles implique-t-il l’utilisation d’un flag ? Eh
bien, par ce qu’on ne sait jamais par avance combien de remontées de bulles
on doit effectuer. En fait, tout ce qu’on peut dire, c’est qu’on devra effectuer
le tri jusqu’à ce qu’il n’y ait plus d’éléments qui soient mal classés. Ceci est
typiquement un cas de question « asymétrique » : il suffit que deux éléments
soient mal classés pour qu’un tableau ne soit pas trié. En revanche, il faut
que tous les éléments soient bien rangés pour que le tableau soit trié.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 52 -

Nous baptiserons le flag Yapermute, car cette variable booléenne va


nous indiquer si nous venons ou non de procéder à une permutation au
cours du dernier balayage du tableau (dans le cas contraire, c’est signe que
le tableau est trié, et donc qu’on peut arrêter la machine à bulles). La boucle
principale sera alors :

Variable Yapermute en Booléen


Début

TantQue Yapermute

FinTantQue
Fin

Que va-t-on faire à l’intérieur de la boucle ? Prendre les éléments du


tableau, du premier jusqu’à l’avant-dernier, et procéder à un échange si
nécessaire. C’est parti :

Variable Yapermute en Booléen


Début

TantQue Yapermute
Pour i ← 0 à 10
Si t(i) > t(i+1) Alors
temp ← t(i)
t(i) ← t(i+1)
t(i+1) ← temp
Finsi
i suivant
Fin

Mais il ne faut pas oublier un détail capital : la gestion de notre flag.


L’idée, c’est que cette variable va nous signaler le fait qu’il y a eu au moins
une permutation effectuée. Il faut donc :

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 53 -

• Lui attribuer la valeur Vrai dès qu’une seule permutation a été faite (il
suffit qu’il y en ait eu une seule pour que l’on soit obligé de tout
recommencer encore une fois).
• La remettre à Faux à chaque tour de la boucle principale (quand on
recommence un nouveau tour général de bulles, il n’y a pas encore eu
d’éléments échangés),
• Dernier point, il ne faut pas oublier de lancer la boucle principale, et
pour cela de donner la valeur Vrai au flag au tout départ de
l’algorithme.

La solution complète donne donc :


Variable Yapermute en Booléen
Début

Yapermut ← Vrai
TantQue Yapermut
Yapermut ← Faux
Pour i ← 0 à 10
Si t(i) > t(i+1) alors
temp ← t(i)
t(i) ← t(i+1)
t(i+1) ← temp
Yapermut ← Vrai
Finsi
i suivant
FinTantQue
Fin

Au risque de me répéter, la compréhension et la maîtrise du principe


du flag font partie de l’arsenal du programmeur bien armé.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 54 -

A. 5. La recherche dichotomique
Nous allons terminer ce point migraineux par une technique célèbre de
recherche, qui révèle toute son utilité lorsque le nombre d'éléments est très
élevé.
Par exemple, imaginons que nous ayons un programme qui doit
vérifier si un mot existe dans le dictionnaire. Nous pouvons supposer que le
dictionnaire a été préalablement entré dans un tableau (à raison d'un mot
par emplacement). Ceci peut nous mener à, disons à la louche, 40 000 mots.

Une première manière de vérifier si un mot se trouve dans le


dictionnaire consiste à examiner successivement tous les mots du
dictionnaire, du premier au dernier, et à les comparer avec le mot à vérifier.
Ca marche, mais cela risque d'être long : si le mot ne se trouve pas dans le
dictionnaire, le programme ne le saura qu'après 40 000 tours de boucle ! Et
même si le mot figure dans le dictionnaire, la réponse exigera tout de même
en moyenne 20 000 tours de boucle. C'est beaucoup, même pour un
ordinateur.

Or, il y a une autre manière de chercher, bien plus intelligente


pourrait-on dire, et qui met à profit le fait que dans un dictionnaire, les mots
sont triés par ordre alphabétique. D'ailleurs, un être humain qui cherche un
mot dans le dictionnaire ne lit jamais tous les mots, du premier au dernier :
il utilise lui aussi le fait que les mots sont triés.

Pour une machine, quelle est la manière la plus rationnelle de


chercher dans un dictionnaire ? C'est de comparer le mot à vérifier avec le
mot qui se trouve pile poil au milieu du dictionnaire. Si le mot à vérifier est
antérieur dans l'ordre alphabétique, on sait qu'on devra le chercher
dorénavant dans la première moitié du dictionnaire. Sinon, on sait
maintenant qu'on devra le chercher dans la deuxième moitié.

A partir de là, on prend la moitié de dictionnaire qui nous reste, et on


recommence : on compare le mot à chercher avec celui qui se trouve au
milieu du morceau de dictionnaire restant. On écarte la mauvaise moitié, et
on recommence, et ainsi de suite.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 55 -

A force de couper notre dictionnaire en deux, puis encore en deux, etc.


on va finir par se retrouver avec des morceaux qui ne contiennent plus qu'un
seul mot. Et si on n'est pas tombé sur le bon mot à un moment ou à un
autre, c'est que le mot à vérifier ne fait pas partie du dictionnaire.

Regardons ce que cela donne en terme de nombre d'opérations à


effectuer, en choisissant le pire cas : celui où le mot est absent du
dictionnaire.

• Au départ, on cherche le mot parmi 40 000.


• Après le test n°1, on ne le cherche plus que parmi 20 000.
• Après le test n°2, on ne le cherche plus que parmi 10 000.
• Après le test n°3, on ne le cherche plus que parmi 5 000.
• etc.
• Après le test n°15, on ne le cherche plus que parmi 2.
• Après le test n°16, on ne le cherche plus que parmi 1.

Et là, on sait que le mot n'existe pas. Moralité : on a obtenu notre


réponse en 16 opérations contre 40 000 précédemment ! Il n'y a pas photo
sur l'écart de performances entre la technique barbare et la technique futée.
Attention, toutefois, même si c'est évident, je le répète avec force : la
recherche dichotomique ne peut s'effectuer que sur des éléments
préalablement triés.

Au risque de me répéter, la compréhension et la maîtrise du principe


du flag font partie du bagage du programmeur bien outillé.

B. TABLEAUX MULTIDIMENSIONNELS
« Le vrai problème n’est pas de savoir si les machines pensent, mais de
savoir si les hommes pensent » - B.F. Skinner

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 56 -

« La question de savoir si un ordinateur peut penser n'est pas plus


intéressante que celle de savoir si un sous-marin peut nager » - Edgar W.
Dijkstra

B. 1. Pourquoi plusieurs dimensions ?

Une seule ne suffisait-elle pas déjà amplement à notre bonheur, me


demanderez-vous ? Certes, répondrai-je, mais vous allez voir qu’avec deux
(et davantage encore) c’est carrément le Paradis.

Prenons le cas de la modélisation d’un jeu de dames, et du


déplacement des pions sur le damier. Je rappelle qu’un pion qui est sur une
case blanche peut se déplacer (pour simplifier) sur les quatre cases blanches
adjacentes.

Avec les outils que nous avons abordés jusque là, le plus simple serait
évidemment de modéliser le damier sous la forme d’un tableau. Chaque case
est un emplacement du tableau, qui contient par exemple 0 si elle est vide,
et 1 s’il y a un pion. On attribue comme indices aux cases les numéros 1 à 8
pour la première ligne, 9 à 16 pour la deuxième ligne, et ainsi de suite
jusqu’à 64.

Un pion placé dans la case numéro i, autrement dit la valeur 1 de


Cases(i), peut bouger vers les cases contiguës en diagonale. Cela va nous
obliger à de petites acrobaties intellectuelles : la case située juste au-dessus
de la case numéro i ayant comme indice i-8, les cases valables sont celles
d’indice i-7 et i-9. De même, la case située juste en dessous ayant comme
indice i+8, les cases valables sont celles d’indice i+7 et i+9.

Bien sûr, on peut fabriquer tout un programme comme cela, mais le


moins qu’on puisse dire est que cela ne facilite pas la clarté de l’algorithme.
Il serait évidemment plus simple de modéliser un damier par… un damier.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 57 -

B. 2. Tableaux à deux dimensions


L’informatique nous offre la possibilité de déclarer des tableaux dans
lesquels les valeurs ne sont pas repérées par une seule, mais par deux
coordonnées.
Un tel tableau se déclare ainsi :

Tableau Cases (7, 7) en Numérique

Cela veut dire : réserve-moi un espace de mémoire pour 8 x 8 entiers,


et quand j’aurai besoin de l’une de ces valeurs, je les repèrerai par deux
indices (comme à la bataille navale, ou Excel, la seule différence étant que
pour les coordonnées, on n’utilise pas de lettres, juste des chiffres).

Pour notre problème de dames, les choses vont sérieusement


s’éclaircir. La case qui contient le pion est dorénavant Cases (i, j). Et les
quatre cases disponibles sont Cases (i-1, j-1), Cases (i-1, j+1), Cases (i+1, j-1)
et Cases (i+1, j+1).

REMARQUE ESSENTIELLE : Il n’y a aucune différence qualitative entre un


tableau à deux dimensions (i, j) et un tableau à une dimension (i * j). De
même que le jeu de dames qu’on vient d’évoquer, tout problème qui peut être
modélisé d’une manière peut aussi être modélisé de l’autre. Simplement,
l’une ou l’autre de ces techniques correspond plus spontanément à tel ou tel
problème, et facilite donc (ou complique, si on a choisi la mauvaise option)
l’écriture et la lisibilité de l’algorithme.

Une autre remarque : une question classique à propos des tableaux à


deux dimensions est de savoir si le premier indice représente les lignes ou le
deuxième les colonnes, ou l’inverse. Je ne répondrai pas à cette question non
parce que j’ai décidé de bouder, mais parce qu’elle n’a aucun sens. « Lignes »
et « Colonnes » sont des concepts graphiques, visuels, qui s’appliquent à des
objets du monde réel ; les indices des tableaux ne sont que des coordonnées
logiques, pointant sur des adresses de mémoire vive. Si cela ne vous
convainc pas, pensez à un jeu de bataille navale classique : les lettres
doivent-elles désigner les lignes et les chiffres les colonnes ? Aucune

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 58 -

importance ! Chaque joueur peut même choisir une convention différente,


aucune importance ! L’essentiel est qu’une fois une convention choisie, un
joueur conserve la même tout au long de la partie, bien entendu.

B. 3. Tableaux à n dimensions
Si vous avez compris le principe des tableaux à deux dimensions, sur
le fond, il n’y a aucun problème à passer au maniement de tableaux à trois,
quatre, ou pourquoi pas neuf dimensions. C’est exactement la même chose.
Si je déclare un tableau Titi (2, 4, 3, 3), il s’agit d’un espace mémoire
contenant 3 x 5 x 4 x 4 = 240 valeurs. Chaque valeur y est repérée par
quatre coordonnées.

Le principal obstacle au maniement systématique de ces tableaux à


plus de trois dimensions est que le programmeur, quand il conçoit son
algorithme, aime bien faire des petits gribouillis, des dessins immondes,
imaginer les boucles dans sa tête, etc. Or, autant il est facile d’imaginer
concrètement un tableau à une dimension, autant cela reste faisable pour
deux dimensions, autant cela devient l’apanage d’une minorité privilégiée
pour les tableaux à trois dimensions (je n’en fais malheureusement pas
partie) et hors de portée de tout mortel au-delà. C’est comme ça, l’esprit
humain a du mal à se représenter les choses dans l’espace, et crie grâce dès
qu’il saute dans l’hyperespace (oui, c’est comme ça que ça s’appelle au delà
de trois dimensions).

Donc, pour des raisons uniquement pratiques, les tableaux à plus de


trois dimensions sont rarement utilisés par des programmeurs non matheux
(car les matheux, de par leur formation, ont une fâcheuse propension à
manier des espaces à n dimensions comme qui rigole, mais ce sont bien les
seuls, et laissons les dans leur coin, ce n’est pas des gens comme nous).

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 59 -

Chapitre VI. LES FONCTIONS PREDEFINIES

Certains traitements ne peuvent être effectués par un algorithme,


aussi savant soit-il. D’autres ne peuvent l’être qu’au prix de souffrances
indicibles.

C’est par exemple le cas du calcul du sinus d’un angle : pour en


obtenir une valeur approchée, il faudrait appliquer une formule d’une
complexité à vous glacer le sang. Aussi, que se passe-t-il sur les petites
calculatrices que vous connaissez tous ? On vous fournit quelques touches
spéciales, dites touches de fonctions, qui vous permettent par exemple de
connaître immédiatement ce résultat. Sur votre calculatrice, si vous voulez
connaître le sinus de 35°, vous taperez 35, puis la touche SIN, et vous aurez
le résultat.

Tout langage de programmation propose ainsi un certain nombre de


fonctions ; certaines sont indispensables, car elles permettent d’effectuer des
traitements qui seraient sans elles impossibles. D’autres servent à soulager
le programmeur, en lui épargnant de longs et pénibles algorithmes.

VI. 1. Structure générale des fonctions


Reprenons l’exemple du sinus. Les langages informatiques, qui se
doivent tout de même de savoir faire la même chose qu’une calculatrice à
19F90, proposent généralement une fonction SIN. Si nous voulons stocker le
sinus de 35 dans la variable A, nous écrirons :

A ← Sin(35)

Une fonction est donc constituée de trois parties :

• le nom proprement dit de la fonction. Ce nom ne s’invente pas. Il doit


impérativement correspondre à une fonction proposée par le langage.
Dans notre exemple, ce nom est SIN.
• deux parenthèses, une ouvrante, une fermante. Ces parenthèses sont
toujours obligatoires, même lorsqu'on n'écrit rien à l'intérieur.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 60 -

• une liste de valeurs, indispensables à la bonne exécution de la


fonction. Ces valeurs s’appellent des arguments, ou des paramètres.
Certaines fonctions exigent un seul argument, d’autres deux, etc. et
d’autres encore aucun. A noter que même dans le cas de ces fonctions
n’exigeant aucun argument, les parenthèses restent obligatoires. Le
nombre d’arguments nécessaire pour une fonction donnée ne s’invente
pas : il est fixé par le langage. Par exemple, la fonction sinus a besoin
d’un argument (ce n’est pas surprenant, cet argument est la valeur de
l’angle). Si vous essayez de l’exécuter en lui donnant deux arguments,
ou aucun, cela déclenchera une erreur à l’exécution. Notez également
que les arguments doivent être d’un certain type, et qu’il faut respecter
ces types.

L’EXERCICE DE LA JOURNEE

Il consiste à affecter une fonction, quelle qu'elle soit.


Toute écriture plaçant une fonction à gauche d'une instruction d'affectation
est aberrante, pour deux raisons symétriques.

• d'une part, parce que nous le savons depuis le premier chapitre de ce


cours extraordinaire, on ne peut affecter qu'une variable, à l'exclusion
de tout autre chose.

• ensuite, parce qu'une fonction a pour rôle de produire, de renvoyer, de


valoir (tout cela est synonyme), un résultat. Pas d'en recevoir un, donc
l'affectation d'une fonction sera considérée comme l'une des pires
fautes algorithmiques, et punie comme telle.

VI. 2. Les fonctions de texte


Une catégorie privilégiée de fonctions est celle qui nous permet de
manipuler des chaînes de caractères. Nous avons déjà vu qu’on pouvait
facilement « coller » deux chaînes l’une à l’autre avec l’opérateur de
concaténation &. Mais ce que nous ne pouvions pas faire, et qui va être

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 61 -

maintenant possible, c’est pratiquer des extractions de chaînes (moins


douloureuses, il faut le noter, que les extractions dentaires).

Tous les langages, je dis bien tous, proposent peu ou prou les
fonctions suivantes, même si le nom et la syntaxe peuvent varier d’un
langage à l’autre :

• Len (chaîne) : renvoie le nombre de caractères d’une chaîne

• Mid (chaîne, n, n2) : renvoie un extrait de la chaîne, commençant au


caractère n1 et faisant n2 caractères de long.

Ce sont les deux seules fonctions de chaînes réellement


indispensables. Cependant, pour nous épargner des algorithmes fastidieux,
les langages proposent également :

• Left (chaîne, n) : renvoie les n caractères les plus à gauche dans


chaîne.

• Right (chaîne, n) : renvoie les n caractères les plus à droite dans


chaîne

• Trouve (chaîne1, chaîne2) : renvoie un nombre correspondant à la


position de chaîne2 dans chaîne1. Si chaîne2 n’est pas comprise dans
chaîne1, la fonction renvoie zéro.

Exemples :

Len ("Bonjour, ça va ?") Vaut 16


Len ("") Vaut 0
Mid ("Zorro is back", 4, 7) Vaut "ro is b"
Mid ("Zorro is back", 12, 1) Vaut "c"
Left ("Et pourtant…", 8) Vaut "Et pourt"
Right ("Et pourtant…", 4) Vaut "t…"
Trouve ("Un pur bonheur", "pur") Vaut 4
Trouve ("Un pur bonheur", "techno") Vaut 0

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 62 -

Il existe aussi dans tous les langages une fonction qui renvoie le
caractère correspondant à un code Ascii donné (fonction Asc), et Lycée de
Versailles (fonction Chr) :

Asc ("N") vaut 78


Chr (63) vaut "?"

J’insiste ; à moins de programmer avec un langage un peu particulier,


comme le C, qui traite en réalité les chaînes de caractères comme des
tableaux, on ne pourrait pas se passer des deux fonctions Len et Mid pour
traiter les chaînes. Or, si les programmes informatiques ont fréquemment à
traiter des nombres, ils doivent tout aussi fréquemment gérer des séries de
caractères (des chaînes). Je sais bien que cela devient un refrain, mais
connaître les techniques de base sur les chaînes est plus qu’utile : c’est
indispensable.

VI. 3. Trois fonctions numériques classiques


Partie Entière

Une fonction extrêmement répandue est celle qui permet de récupérer


la partie entière d’un nombre :

Après : A ← Ent (3,228) A vaut 3

Cette fonction est notamment indispensable pour effectuer le


célébrissime test de parité (voir exercice dans pas longtemps).

Modulo

Cette fonction permet de récupérer le reste de la division d’un nombre


par un deuxième nombre. Par exemple :

A ← Mod (10,3) A vaut 1 car 10 = 3*3 + 1


B ← Mod (12,2) B vaut 0 car 12 = 6*2
C ← Mod (44,8) C vaut 4 car 44 = 5*8 + 4

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 63 -

Cette fonction peut paraître un peu bizarre, est réservée aux seuls
matheux. Mais vous aurez là aussi l’occasion de voir dans les exercices à
venir que ce n’est pas le cas.

Génération de nombres aléatoires

Une autre fonction classique, mais très utile, est celle qui génère un
nombre choisi au hasard.

Tous les programmes de jeu, ou presque, ont besoin de ce type


d’outils, qu’il s’agisse de simuler un lancer de dés.

Mais il n’y a pas que les jeux qui ont besoin de générer des nombres
aléatoires. La modélisation (physique, géographique, économique, etc.) a
parfois recours à des modèles dits stochastiques. Ce sont des modèles dans
lesquels les variables se déduisent les unes des autres par des relations
déterministes (autrement dit des calculs), mais où l’on simule la part
d’incertitude par une « fourchette » de hasard.

Par exemple, un modèle démographique supposera qu’une femme a en


moyenne x enfants au cours de sa vie, mettons 1,5. Mais il supposera aussi
que sur une population donnée, ce chiffre peut fluctuer entre 1,35 et 1,65 (si
on laisse une part d’incertitude de 10%). Chaque année, c’est-à-dire chaque
série de calcul des valeurs du modèle, on aura ainsi besoin de faire choisir à
la machine un nombre au hasard compris entre 1,35 et 1,65.

Dans tous les langages, cette fonction existe et produit le résultat


suivant :

Après : Toto ← Alea () On a : 0 =< Toto < 1

En fait, on se rend compte avec un tout petit peu de pratique que cette
fonction Aléa peut nous servir pour générer n’importe quel nombre compris
dans n’importe quelle fourchette. Je sais bien que mes lecteurs ne sont
guère matheux, mais là, on reste franchement en deçà du niveau de feu le
BEPC :

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 64 -

• si Alea génère un nombre compris entre 0 et 1, Alea multiplié par Z


produit un nombre entre 0 et Z. Donc, il faut estimer la « largeur » de
la fourchette voulue et multiplier Alea par cette « largeur » désirée.

• ensuite, si la fourchette ne commence pas à zéro, il va suffire d’ajouter


ou de retrancher quelque chose pour « caler » la fourchette au bon
endroit.

Par exemple, si je veux générer un nombre entre 1,35 et 1,65 ; la


« fourchette » mesure 0,30 de large. Donc : 0 =< Alea()*0,30 < 0,30

Il suffit dès lors d’ajouter 1,35 pour obtenir la fourchette voulue. Si


j’écris que :

Toto ← Alea ()*0,30 + 1,35

Toto aura bien une valeur comprise entre 1,35 et 1,65. Et le tour est
joué.

VI. 4. Les fonctions de conversion


Dernière grande catégorie de fonctions, là aussi disponibles dans tous
les langages, car leur rôle est parfois incontournable, les fonctions dites de
conversion.

Rappelez-vous ce que nous avons vu dans les premières pages de ce


cours : il existe différents types de variables, qui déterminent notamment le
type de codage qui sera utilisé. Prenons le chiffre 3. Si je le stocke dans une
variable de type alphanumérique, il sera codé en tant que caractère, sur un
octet. Si en revanche je le stocke dans une variable de type entier, il sera
codé sur deux octets. Et la configuration des bits sera complètement
différente dans les deux cas.

Une conclusion évidente, et sur laquelle on a déjà eu l'occasion


d'insister, c'est qu'on ne peut pas faire n'importe quoi avec n'importe quoi, et
qu'on ne peut pas par exemple multiplier "3" et "5", si 3 et 5 sont stockés

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 65 -

dans des variables de type caractère. Jusque là, pas de scoop me direz-vous,
à juste titre vous répondrai-je, mais attendez donc la suite.

Pourquoi ne pas en tirer les conséquences, et stocker convenablement


les nombres dans des variables numériques, les caractères dans des
variables alphanumériques, comme nous l'avons toujours fait ?

Parce qu'il y a des situations où on n'a pas le choix. Nous allons voir
dès le chapitre suivant un mode de stockage (les fichiers textes) où toutes les
informations, quelles qu'elles soient, sont obligatoirement stockées sous
forme de caractères. Dès lors, si l'on veut pouvoir récupérer des nombres et
faire des opérations dessus, il va bien falloir être capable de convertir ces
chaînes en numériques.

Aussi, tous les langages proposent-ils une palette de fonctions


destinées à opérer de telles conversions. On trouvera au moins une fonction
destinée à convertir une chaîne en numérique (appelons-la Cnum en
pseudo-code), et une convertissant un nombre en caractère (Ccar).

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 66 -

Chapitre VII. PROCEDURES ET FONCTIONS

VII. 1. Sous-procédures
Une application, surtout si elle est longue, a toutes les chances de
devoir procéder aux mêmes traitements, ou à des traitements similaires, à
plusieurs endroits de son déroulement. Par exemple, la saisie (et le contrôle
qu’elle implique) d’une réponse par oui ou par non, peuvent être répétés dix
fois à des moments différents de la même application. La manière la plus
immédiate – et la moins habile – de résoudre la question est bien entendu de
répéter le code correspondant autant de fois que nécessaire. Ainsi, la
structure peut paraître simple. Mais elle est inutilement lourdingue, et en
réalité, pour peu que le programme soit joufflu, il peut devenir parfaitement
illisible. Il faut donc opter pour une autre stratégie, qui consiste à séparer ce
traitement du corps du programme et à appeler ces instructions (qui ne
figurent donc plus qu’en un seul exemplaire) à chaque fois qu’on en a
besoin. Le corps du programme s’appelle alors la procédure principale, et
ces groupes d’instructions auxquels on a recours s’appellent des sous-
procédures. Reprenons cet exemple de question à laquelle l’utilisateur doit
répondre par oui ou par non.

Mauvaise Structure

...
Ecrire "Etes-vous marié ?"
Rep = ""
TantQue Rep <> " Oui" et Rep <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep
FinTantQue
Ecrire "Avez-vous des enfants ?"
Rep = ""
TantQue Rep <> "Oui" et Rep <> "Non"
Ecrire "Tapez Oui ou Non"

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 67 -

Lire Rep
FinTantQue

Bonne Structure

Ecrire "Etes-vous marié ?"


RéponseOuiNon()
...
Ecrire "Avez-vous des enfants ?"
RéponseOuiNon()
...
Procédure RéponseOuiNon()
Rep = ""
TantQue Rep <> " Oui" et Rep <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep
FinTantQue
Fin Procédure

Dans ce cas, on se contente donc d’appeler des lignes de codes qui se


répètent à l’identique. Mais on peut avoir des cas beaucoup plus rigolos.

VII. 2. Passage de paramètres


Reprenons l’exemple qui précède et analysons-le. Nous écrivons un
message, puis appelons la procédure pour poser une question ; puis plus
tard, on écrit un autre message, et on relance la procédure pour poser la
même question, etc. C’est une démarche acceptable, mais qui peut encore
être améliorée : puisqu’avant chaque question, on doit écrire un message,
autant que cette écriture du message figure directement dans la procédure
appelée. Cela implique deux choses :

• lorsqu’on appelle la procédure, on doit lui préciser quel message elle


doit afficher avant de lire la réponse

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 68 -

• la procédure doit être " prévenue " qu’elle recevra un message, et être
capable de le récupérer pour l’afficher.

En langage algorithmique, on dira que le message est un paramètre.


Comme le paramètre (le message) est transmis de la procédure principale
vers la sous-procédure, il s’agit d’un paramètre en entrée. Voilà comment
l’affaire se présente : La procédure sera déclarée comme suit :

Procédure RéponseOuiNon(Msg en Caractère)


...

Il y a donc dorénavant une variable, Msg, dont on précise le type, et


qui signale à le procédure qu’un paramètre peut lui être envoyé. A présent, le
corps de la procédure sera :

Procédure RéponseOuiNon(Msg en Caractère)


Ecrire Msg
Rep = ""
TantQue Rep <> " Oui" et Rep <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep
FinTantQue
Fin Procédure La procédure principale devient alors :

RéponseOuiNon("Etes-vous marié ?")


...
RéponseOuiNon("Avez-vous des enfants ?")

Et voilà le travail. Là, on a passé qu’un seul paramètre en entrée, mais


on peut en passer autant qu’on veut ; mais ne soyons pas gourmands, il
suffit d’en passer autant qu’on en a besoin. D’un autre côté, on ne s’est
guère préoccupé jusque là de récupérer le résultat de notre sous-procédure,
à savoir la réponse à la question posée. Examinons maintenant ce problème.
Une première solution serait la suivante : juste après l’appel de la procédure,
on teste la variable Rep : Si Rep = "Oui" alors … L’inconvénient de cette

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 69 -

technique, c’est que la variable Rep doit pouvoir conserver son contenu en
voyageant d’une procédure à l’autre. On en reparlera plus loin mais ce genre
de variable est extrêmement gourmand en mémoire vive. Donc, si on appelle
comme cela plusieurs procédures, avec plein de variables qu’on veut
récupérer, cela risque de coincer sérieusement à l’exécution. La solution la
plus économique en ressources consiste à transmettre la valeur de la
variable Rep de la sous-procédure vers la procédure principale, exactement
comme on transmettait jusque là la valeur de la variable Msg de la procédure
principale vers la sous-procédure. On introduit donc un second
paramètre, mais qui est maintenant un paramètre en sortie. La déclaration
de la procédure devient :

Procédure RéponseOuiNon(Msg en Caractère, Rep en Booléen)


L’appel devient quant à lui :
RéponseOuiNon("Etes-vous marié ?", toto)
si toto = "Oui" alors
...
RéponseOuiNon("Avez-vous des enfants ?", tata)
si tata = "Oui" alors
... Là encore, rien n’empêche une sous-procédure de renvoyer plusieurs
paramètres en sortie, vous avez toute liberté !

VII. 3. Fonctions personnalisées


Si vous n’avez qu’un seul paramètre à renvoyer en sortie, alors vous
pourrez opter pour une solution encore plus légère : créer, plutôt qu’une
sous procédure, une fonction personnalisée. Ce type de fonction, comme une
fonction normale, renvoie une valeur. Mais cette fois, c’est vous qui créez la
fonction, en indiquant le nombre et le type des paramètres en entrée, le
mode de traitement et la valeur qui doit être renvoyée en sortie. Imaginons
qu’à plusieurs reprises au cours d’une application, on ait besoin de calculer
la moyenne d’un tableau de notes, le nombre de notes étant susceptible de
varier d’une fois sur l’autre. Plutôt qu’écrire plusieurs boucles de calcul, qui
à chaque fois risquent de se ressembler, il sera préférable de créer une

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 70 -

fonction pour calculer cette moyenne. Cette fonction admettra deux


arguments, qui lui sont indispensables pour effectuer ses calculs :
Le tableau lui-même
Le nombre d’éléments du tableau

Cela donnera, en pseudo-code, la chose suivante :

Fonction Moy(Tab en tableau numérique, n en entier)


Som = 0
Pour i = 1 à n
Som = Som + Tab(i)
i suivant
m = som / n
Renvoyer m
Fin Fonction

On remarque au passage l’apparition d’un nouveau mot-clé :


Renvoyer, qui indique quelle valeur doit prendre la fonction. Quant au
programme principal, quelques lignes pourraient en être :

Tableau Notes en Numérique


....
moyenne = Moy(notes, nbnotes)
écrire "la moyenne est : ", moyenne

D’une manière générale, la création de fonctions est un puissant outil


de programmation, qui ne possède que des avantages : on économise des
lignes de programmation, on rend le déboguage plus facile, et on ne gaspille
aucune ressource de la machine. Pensez-y donc sérieusement à chaque fois
que vous devez créer une application un peu joufflue (un projet, par
exemple).

VII. 4. Une logique vicelarde : la programmation récursive


Vous savez comment sont les informaticiens : on ne peut pas leur
donner quoi que ce soit sans qu’ils essayent de jouer avec, et le pire, c’est

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 71 -

qu’ils y réussissent. Cette technique des fonctions personnalisées a donné


lieu à la floraison d’une logique un peu particulière, destinée en particulier à
traiter certains problèmes mathématiques (ou de jeux) : la programmation
récursive. Pour vous expliquer de quoi il retourne, nous allons reprendre un
exemple cher à vos cœurs : le calcul d’une factorielle (là, je sentais que
j’allais encore me faire des copains). Rappelez-vous : la formule de calcul de
la factorielle d’un nombre n s’écrit : N ! = 1 x 2 x 3 x … x n Nous avions
programmé cela aussi sec avec une boucle Pour, et roule Raoul. Mais une
autre manière de voir les choses, ni plus juste, ni moins juste, serait de dire
que : N ! = n x (n-1) ! En bon français : la factorielle d’un nombre, c’est ce
nombre multiplié par la factorielle du nombre précédent. Encore une fois,
c’est une manière ni plus juste ni moins juste de présenter les choses ; c’est
simplement une manière différente. Si l’on doit programmer cela, on peut
alors imaginer une fonction Fact, chargée de calculer la factorielle. Cette
fonction effectue la multiplication du nombre passé en argument par la
factorielle du nombre précédent. Et cette factorielle du nombre précédent va
bien entendu être elle-même calculée par la fonction Fact. Autrement dit, on
va créer une fonction qui pour fournir son résultat, va s’appeler elle-même
un certain nombre de fois. C’est cela, la récursivité. Toutefois, il nous
manque une chose pour finir : quand ces auto-appels de la fonction Fact
vont-ils s’arrêter ? Cela n’aura-t-il donc jamais de fin ? Si, bien sûr, rassure-
toi, ô public, la récursivité, ce n’est pas Les Feux de L’Amour. On s’arrête
quand on arrive au nombre 1, pour lequel la factorielle est par définition 1.
Cela produit l’écriture suivante, un peu déconcertante certes, mais parfois
très pratique :

Fonction Fact (N en Numérique)


Si N = 1 alors
Renvoyer 1
Sinon
Renvoyer Fact(N-1)
Finsi
Fin Fonction

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 72 -

Vous remarquerez que le processus récursif remplace en quelque sorte


la boucle, c’est-à-dire un processus itératif. Et en plus, avec tous ces
nouveaux mots qui riment, vous allez pouvoir écrire de très chouettes
poèmes. Vous remarquerez aussi qu’on traite le problème à l’envers : on part
du nombre, et on remonte à rebours jusqu’à 1 pour pouvoir calculer la
factorielle. Cet effet de rebours est caractéristique de la programmation
récursive. Pour conclure sur la récursivité, trois remarques fondamentales.

• la programmation récursive, pour traiter certains problèmes, est très


économique pour le programmeur ; elle permet de faire les choses
correctement, en très peu de lignes de programmation.
• en revanche, elle est très dispendieuse de ressources machine. Car
à l’exécution, la machine va être obligée de créer autant des variables
temporaires que de " tours " de fonction en attente.
• Last but not least, et c’est le gag final, tout problème formulé en
termes récursifs peut également être formulé en termes itératifs !
Donc, si la programmation récursive peut faciliter la vie du
programmeur, elle n’est pas indispensable. Mais ça me faisait tant
plaisir de vous en parler que je n’ai pas pu résister.

VII. 5. Variables publiques et privées


L’existence de sous-procédures, de paramètres, pose le problème de la
" durée de vie " des variables, ce qu’on appelle leur portée. Pour faire simple,
une variable peut être déclarée :

• Comme privée, ou locale (c’est en général l’option par défaut). Cela


signifie qu’une telle variable disparaît (et sa valeur avec) dès que prend
fin la procédure ou elle a été créée.
• Comme publique, ou globale. Ce qui signifie qu’une telle variable est
conservée intacte pour toute l’application, au-delà des ouvertures et
fermetures de procédures.

La manière dont ces déclarations doivent être faites est évidemment fonction
de chaque langage de programmation. En pseudo-code algorithmique, vous

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 73 -

pourrez utiliser le mot-clé Public pour déclarer une variable publique :


Public Toto en Entier Comment choisir entre déclarer une variable en
Public ou en Privé ? C’est très simple : les variables globales consomment
énormément de ressources en mémoire. En conséquence, le principe qui
doit présider au choix entre variables publiques et privées doit être celui de
l’économie de moyens : on ne déclare comme publiques que les variables
qui doivent absolument l’être. Et chaque fois que possible, lorsqu’on crée
une sous-procédure, on utilise le passage de paramètres par valeur plutôt
que des variables publiques.

VII. 6. Algorithmes fonctionnels


Pour clore ce chapitre, quelques mots à propos de la structure
générale d’une application. Celle-ci va couramment être formée d’une
procédure principale, et de sous-procédures (qui vont au besoin elles-mêmes
en appeler d’autres, etc.). L’exemple typique est celui d’un menu, ou d’un
sommaire, qui " branche " sur différents traitements, donc différentes sous-
procédures. L’algorithme fonctionnel de l’application est la représentation
graphique de cette structure générale, ayant comme objectif de faire
comprendre d’un seul coup d’œil quelle procédure fait quoi, et quelle
procédure appelle quelle autre. L’algorithme fonctionnel est donc en quelque
sorte la représentation du squelette de l’application. Il se situe à un niveau
plus général, plus abstrait, que l’algorithme normal, qui lui, détaille pas à
pas les traitements effectués au sein de chaque procédure. Dans la
construction – et la compréhension – d’une application, les deux documents
sont indispensables, et constituent deux étapes successives de l’élaboration
d’un projet.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 74 -

Chapitre VIII. NOTIONS COMPLEMENTAIRES

Une fois n’est pas coutume, ce chapitre ne sera l’objet d’aucun


exercice. Cela ne veut pas dire pour autant que ce qui s’y trouve n’est pas
intéressant.

VIII. 1. Programmation structurée

Petit retour sur une notion très rapidement survolée plus haut : celle
de " programmation structurée ". En fait, nous avons jusqu’à présent, tels
Monsieur Jourdain, fait de la programmation structurée sans le savoir.
Aussi, plutôt qu’expliquer longuement en quoi cela consiste, je préfère
passer directement à raconter en quoi cela ne consiste pas.

Dans certains langages (historiquement, ce sont généralement des


langages anciens), les lignes de programmation portent des numéros. Les
lignes sont ensuite exécutées dans l’ordre de leurs numéros. Jusqu’ici, en
soi, pas de problème. Mais l’astuce est que tous ces langages, il existe une
instruction de branchement, notée aller à en pseudo-code, instruction qui
envoie directement le programme à la ligne spécifiée. Inversement, ce type de
langage ne comporte pas d’instructions comme FinTantQue, ou FinSi, qui
" ferment " un bloc.

Prenons l’exemple d’une structure " Si … Alors … Sinon "

Programmation Structurée

Si condition Alors
instructions 1
Sinon
instructions 2
FinSi

Programmation non structurée

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 75 -

1000 Si condition Alors Aller En 1100 Sinon Aller En 1200


1100 instruction 1
1110 etc.
1120 etc.
1190 Aller en 1400
1200 instruction 2
1210 etc.
1220 etc.
1350 Aller en 1400
1400 suite de l’algorithme

Vous voyez le topo : un programme écrit dans ce type de langages se


présente comme une suite de branchements emmêlés les uns des les autres.
D’une part, on ne peut pas dire que cela favorise la lisibilité du programme.
D’autre part, c’est une source importante d’erreurs, car tôt ou tard on oublie
un " aller à ", ou on un met un de trop, etc. A fortiori lorsqu’on complique un
algorithme existant, cela peut devenir une jungle inextricable.

A l’inverse, la programmation structurée, surtout si l’on prend soin de


rationaliser la présentation en mettant des lignes de commentaires et en
pratiquant l’indentation, évite des erreurs, et se révèle sa structure logique
de manière très claire.

Le danger est que si la plupart des langages de programmation utilisés


sont structurés, ils offrent tout de même la plupart du temps la possibilité de
pratiquer la programmation non structurée. Dans ce cas, les lignes ne sont
pas désignées par des numéros, mais certaines peuvent être repérées par
des noms (dits " étiquettes ") et on dispose d’une instruction de
branchement.

Une règle d’hygiène absolue est de programmer systématiquement


de manière structurée, sauf impératif contraire fixé par le langage.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 76 -

Autrement dit, même quand un langage vous offre une possibilité de


faire des entorses à la programmation structurée, il ne faut s’en saisir sous
aucun prétexte.

VIII. 2. Interprétation et compilation

Avec ce paragraphe, on sort un peu de l’algorithmique proprement dite


pour entrer dans le domaine plus technique de la réalisation pratique. Ou, si
l’on préfère, ces dernières lignes sont l’apothéose, le bouquet final, l’extase
ultime, la consécration grandiose, de ce cours.

En toute modestie, bien sûr.

Jusqu’ici, nous avons travaillé sur la première étape de la réalisation


d’un programme :

En fait, si l’algorithme est bien écrit, sans faute logique, l’étape


suivante ne doit normalement poser aucun problème conceptuel. Il n'y a
plus qu'à effectuer une simple traduction.

A partir de là, le travail du programmeur est virtuellement terminé (en


réalité, il reste tout de même une inévitable phase de tests, de corrections,
etc., qui s'avère souvent très longue). Mais en tout cas, pour l’ordinateur,
c’est là que les ennuis commencent. En effet, aucun ordinateur n’est en soi
apte à exécuter les instructions telles qu’elles sont rédigées dans tel ou tel
langage ; l’ordinateur, lui, ne comprend qu’un seul langage, qui est un

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 77 -

langage codé en binaire (à la rigueur en hexadécimal) et qui s’appelle le


langage machine (ou assembleur).

C’est à cela que sert un langage : à vous épargner la programmation en


binaire (une pure horreur, vous vous en doutez) et vous permettre de vous
faire comprendre de l’ordinateur d’une manière (relativement) lisible.

C’est pourquoi tout langage, à partir d’un programme écrit, doit


obligatoirement procéder à une traduction en langage machine pour que ce
programme soit exécutable.

Il existe deux stratégies de traduction, ces deux stratégies étant parfois


disponibles au sein du même langage.

• le langage traduit les instructions au fur et à mesure qu’elles se


présentent. Cela s’appelle la compilation à la volée, ou l’interprétation.
• le langage commence par traduire l’ensemble du programme en
langage machine, constituant ainsi un deuxième programme (un
deuxième fichier) distinct physiquement et logiquement du premier.
Ensuite, et ensuite seulement, il exécute ce second programme. Cela
s’appelle la compilation

Il va de soi qu’un langage interprété est plus maniable : on peut


exécuter directement son code - et donc le tester - au fur et à mesure qu’on
le tape, sans passer à chaque fois par l’étape supplémentaire de la
compilation. Mais il va aussi de soi qu’un programme compilé s’exécute
beaucoup plus rapidement qu’un programme interprété : le gain est
couramment d’un facteur 10, voire 20 ou plus.
Toute application destinée à un usage professionnel (ou même, tout
simplement sérieux) est forcément une application compilée.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 78 -

VIII. 3. Une logique vicelarde : la programmation récursive


Vous savez comment sont les informaticiens : on ne peut pas leur
donner quoi que ce soit sans qu’ils essayent de jouer avec, et le pire, c’est
qu’ils y réussissent.

La programmation des fonctions personnalisées a donné lieu à l'essor


d’une logique un peu particulière, adaptée en particulier au traitement de
certains problèmes mathématiques (ou de jeux) : la programmation
récursive. Pour vous expliquer de quoi il retourne, nous allons reprendre un
exemple cher à vos cœurs : le calcul d’une factorielle (là, je sentais que
j’allais encore me faire des copains).

Rappelez-vous : la formule de calcul de la factorielle d’un nombre n s’écrit :


N!=1x2x3x…xn

Nous avions programmé cela aussi sec avec une boucle Pour, et roule
Raoul. Mais une autre manière de voir les choses, ni plus juste, ni moins
juste, serait de dire que quel que soit le nombre n :

n ! = n x (n-1) !

En bon français : la factorielle d’un nombre, c’est ce nombre multiplié


par la factorielle du nombre précédent. Encore une fois, c’est une manière ni
plus juste ni moins juste de présenter les choses ; c’est simplement une
manière différente.

Si l’on doit programmer cela, on peut alors imaginer une fonction Fact,
chargée de calculer la factorielle. Cette fonction effectue la multiplication du
nombre passé en argument par la factorielle du nombre précédent. Et cette
factorielle du nombre précédent va bien entendu être elle-même calculée par
la fonction Fact.

Autrement dit, on va créer une fonction qui pour fournir son résultat,
va s’appeler elle-même un certain nombre de fois. C’est cela, la récursivité.

Toutefois, il nous manque une chose pour finir : quand ces auto-appels de la
fonction Fact vont-ils s’arrêter ? Cela n’aura-t-il donc jamais de fin ? Si, bien

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 79 -

sûr, rassure-toi, ô public, la récursivité, ce n’est pas Les Feux de L’Amour.


On s’arrête quand on arrive au nombre 1, pour lequel la factorielle est par
définition 1.

Cela produit l’écriture suivante, un peu déconcertante certes, mais


parfois très pratique :

Fonction Fact (N en Numérique)


Si N = 0 alors
Renvoyer 1
Sinon
Renvoyer Fact(N-1) * N
Finsi
Fin Fonction

Vous remarquerez que le processus récursif remplace en quelque sorte


la boucle, c’est-à-dire un processus itératif. Et en plus, avec tous ces
nouveaux mots qui riment, vous allez pouvoir écrire de très chouettes
poèmes. Vous remarquerez aussi qu’on traite le problème à l’envers : on part
du nombre, et on remonte à rebours jusqu’à 1 pour pouvoir calculer la
factorielle. Cet effet de rebours est caractéristique de la programmation
récursive.
Pour conclure sur la récursivité, trois remarques fondamentales.

• la programmation récursive, pour traiter certains problèmes, est très


économique pour le programmeur ; elle permet de faire les choses
correctement, en très peu d'instructions.
• en revanche, elle est très dispendieuse de ressources machine. Car à
l’exécution, la machine va être obligée de créer autant de variables
temporaires que de « tours » de fonction en attente.
• Last but not least, et c’est le gag final, tout problème formulé en
termes récursifs peut également être formulé en termes itératifs !
Donc, si la programmation récursive peut faciliter la vie du
programmeur, elle n’est jamais indispensable. Mais ça me faisait tant
plaisir de vous en parler que je n’ai pas pu résister… Et puis,

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 80 -

accessoirement, même si on ne s'en sert pas, en tant qu'informaticien,


il faut connaître cette technique sur laquelle on peut toujours tomber
un jour ou l'autre.

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 81 -

BIBLIOGRAPHIE

1. Sébastien ROHAUT Algorithmique Techniques fondamentales de


programmation, Ed. ENI.
2. Christophe HARO, Algorithmique Raisonner pour concevoir, Ed. ENI.
3. Christophe Darmangeat, Cours d’algorithmique

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 82 -

TABLE DES MATIERES


EPIGRAPHE ................................................................................................. I
AVANT PROPOS .......................................................................................... II
BUT DU COURS ....................................................................................... II
OBJECTIFS DU COURS ........................................................................... II
METHODOLOGIE D’ENSEIGNEMENT.................................................... II
PLAN DU COURS ....................................................................................... III
0. INTRODUCTION ..................................................................................- 1 -
0. 1. Préambule ....................................................................................- 1 -
0. 2. Qu’est-ce que l’algomachine ? .......................................................- 1 -
0.3. Définition de l’algorithmique .........................................................- 1 -
0.4. Faut-il être matheux pour être bon en algorithmique ? ..................- 2 -
0.5. L’ADN ...........................................................................................- 3 -
0.6. Algorithmique et programmation ...................................................- 3 -
0.7. Avec quelles conventions écrit-on un algorithme ? ........................- 4 -
Chapitre I. LES VARIABLES ....................................................................- 5 -
I.1. Type des variables ..........................................................................- 6 -
I.1.1 Types numériques classiques .....................................................- 6 -
I.1.2 Autres types numériques ...........................................................- 7 -
I.1.3 Types non numériques ..............................................................- 8 -
I. 2. L’instruction d’affectation ..............................................................- 8 -
I. 2. 1. Syntaxe et signification ...........................................................- 8 -
I. 2. 2 Ordre des instructions ...........................................................- 10 -
I. 2.3 Expressions et opérateurs .......................................................- 12 -
1. 3. REMARQUES............................................................................- 16 -
Chapitre II. INSTRUCTION DE LECTURE ET ECRITURE........................- 18 -
1. 1. Introduction .............................................................................- 18 -
II. 2. Les instructions de lecture et d’écriture ......................................- 19 -
Chapitre III. LES TESTS OU STRUCTURES CONDITIONNELLES ...........- 21 -
III. 1. De quoi s’agit-il ?.......................................................................- 21 -
III. 2. Structure d’un test.................................................................- 22 -
III. 3. Qu’est ce qu’une condition ? ......................................................- 23 -
Cours d’Algorithmique Patrick KASONGA
G1 Info ESIS 2011-2012 [email protected]
- 83 -

III. 4. Conditions composées ...............................................................- 23 -


III. 5. Tests imbriqués .........................................................................- 25 -
III. 6. De l’aiguillage à la gare de tri .....................................................- 27 -
III. 7. Variables Booléennes ................................................................- 29 -
III. 7. Quelques jeux logiques ..............................................................- 30 -
III. 8. Au-delà de la logique : le style ...................................................- 32 -
Chapitre IV. LES BOUCLES OU STRUCTURES REPETITIVES................- 36 -
IV. 1. A quoi cela sert-il donc ? ...........................................................- 36 -
IV. 2. Une première structure de boucle (Tant Que).............................- 37 -
IV. 3. Boucler en comptant, ou compter en bouclant ...........................- 38 -
IV. 4. Des boucles dans des boucles ...................................................- 38 -
IV. 5. Et encore une tournée générale .................................................- 40 -
Chapitre V. LES TABLEAUX ..................................................................- 41 -
A. TABLEAUX UNIDIMENSIONNELS...................................................- 41 -
A. 1. Utilité des tableaux ..................................................................- 41 -
A. 2. Notation et utilisation algorithmique. .......................................- 42 -
A. 3. Tableaux dynamiques ..............................................................- 44 -
A. 4. Tri d’un tableau .......................................................................- 45 -
A. 4. 1. Le tri par sélection ............................................................- 45 -
A. 4. 2. Un exemple: la recherche dans un tableau ........................- 47 -
A. 4. 3. Tri de tableau + flag = tri à bulles......................................- 51 -
A. 5. La recherche dichotomique ......................................................- 54 -
B. TABLEAUX MULTIDIMENSIONNELS ..............................................- 55 -
B. 2. Tableaux à deux dimensions ...................................................- 57 -
B. 3. Tableaux à n dimensions .........................................................- 58 -
Chapitre VI. LES FONCTIONS PREDEFINIES ........................................- 59 -
VI. 1. Structure générale des fonctions ...............................................- 59 -
VI. 2. Les fonctions de texte ................................................................- 60 -
VI. 3. Trois fonctions numériques classiques ......................................- 62 -
VI. 4. Les fonctions de conversion ....................................................- 64 -
Chapitre VII. PROCEDURES ET FONCTIONS.........................................- 66 -
VII. 1. Sous-procédures ......................................................................- 66 -
VII. 2. Passage de paramètres .............................................................- 67 -

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]
- 84 -

VII. 3. Fonctions personnalisées .........................................................- 69 -


VII. 4. Une logique vicelarde : la programmation récursive ..................- 70 -
VII. 5. Variables publiques et privées ..................................................- 72 -
VII. 6. Algorithmes fonctionnels ..........................................................- 73 -
Chapitre VIII. NOTIONS COMPLEMENTAIRES .......................................- 74 -
VIII. 1. Programmation structurée ......................................................- 74 -
VIII. 2. Interprétation et compilation ...................................................- 76 -
VIII. 3. Une logique vicelarde : la programmation récursive .................- 78 -
BIBLIOGRAPHIE ...................................................................................- 81 -
TABLE DES MATIERES .........................................................................- 82 -

Cours d’Algorithmique Patrick KASONGA


G1 Info ESIS 2011-2012 [email protected]

Vous aimerez peut-être aussi