Vous êtes sur la page 1sur 8

Introduction

La vertu essentielle des algorithmes est de permettre l'exécution


optimisée de procédés répétitifs, essentiellement grâce à la
formalisation et à la description des enchaînements logiques à un
niveau plus abstrait, et donc plus général. Ils s'étendent ainsi à des
domaines de la société toujours plus nombreux et plus inattendus.
Cette généralisation a accompagné le développement des langages
de programmation depuis les années 60, qui permettent aujourd'hui
la manipulation de structures et d'objets ayant des propriétés et des
comportements analogues à ceux du monde ordinaire. Leur relation
avec les couches profondes du traitement informatique est assurée
après coup par le compilateur, de manière transparente pour le
programmateur et le concepteur d'algorithmes.

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
5 6
INTRODUCTION • Il doit posséder au moins un résultat (données de sortie).
• Il doit être effectif : toutes les opérations doivent pouvoir être effectuées exactement et
Le terme informatique est un néologisme proposé en 1962 par Philippe Dreyfus pour dans un temps fini. Cela nous servira plus tard pour pouvoir estimer le coût temporel
caractériser le traitement automatique de l’information : il est construit sur la contraction de d'un algorithme.
l’expression « information automatique ». Ce terme a été accepté par l’Académie française en
avril 1966, et l’informatique devint alors officiellement la science du traitement automatique
de l’information, où l’information est considérée comme le support des connaissances Taille n Opérations
humaines et des communications dans les domaines techniques, économiques et sociaux. Le élémentaires
mot informatique n’a pas vraiment d’équivalent aux Etats-Unis où l’on parle de Computing
Science (science du calcul) alors que Informatics est admis par les Britanniques. ENTRÉES ALGORITHME RÉSULTATS

L'Algorithmique est la science des Algorithmes. Le mot


«ALGORITHME» tire son origine du nom du célèbre
mathématicien Al Khawarizmi (‫ )اﻟﺨﻮارزﻣﻲ‬de la « maison de la Temps Ressources Espace
sagesse » à Bagdad. Au IXème siècle il écrivit le premier Fi g. 1 -A bstracti on d'un al gorit m
h e
ouvrage systématique sur la solution des équations linéaires et
quadratiques. L'étape de spécification des algorithmes et des descriptions de données est essentielle car
l'utilisation directe d'un langage de programmation présente des inconvénients liés à
l'opérationnalité et à l'hétérogénéité.
DEFINITIONS
Opérationnalité : Le fait qu'un langage de programmation soit opérationnel peut sembler un
Un algorithme est une suite finie d’opérations élémentaires constituant un schéma de calcul avantage grâce aux vérifications de la syntaxe voire de la sémantique, effectuées lors de la
ou de résolution d’un problème. C'est un moyen de présenter la résolution par calcul d’un compilation, et aussi grâce à la possibilité d'exécution immédiate du programme pour essai.
problème. C’est un énoncé dans un langage bien défini d’une suite d’opérations permettant
Dans la pratique, la possibilité d'exécution immédiate du programme diminue la
de résoudre par calcul un problème. Les Algorithmes sont les idées derrière les programmes
productivité du programmeur, lequel toujours tenté d'essayer, sans trop réfléchir, son
Un algorithme n’est intéressant que s’il est capable de résoudre de manière générale un
programme construit un peu au hasard. Cette attitude se reproduit également en cas
problème donné.
d'erreurs car il paraît toujours plus facile pour lui de faire une modification et de réessayer,
L’algorithme n’est pas un élément de résolution en lui même. C’est un schémas de résolution plutôt que d'analyser la cause de l'erreur. Le programmeur met ainsi beaucoup de temps à
pour produire des grandeurs cherchées quand on lui injecte des grandeurs connues. Le construire son programme qui, d'erreur en erreur et de modification en modification, s'écarte
travail de résolution du problème est totalement à la charge du programmeur ⇒ généralement de la solution rationnelle et efficace issue d'une bonne analyse préalable du
transformation d’une méthode en un composant opérationnel : le programme. problème posé.
Un algorithme reçoit des données en entrée qu'il traite et produit des résultats en sortie. Lors Hétérogénéité : Un langage de programmation est presque toujours orienté vers la
des traitements, un algorithme consomme deux ressources (fig. 1) : le temps et l'espace.
résolution d'une famille particulière de problèmes (COBOL pour la gestion, FORTRAN
Plusieurs algorithmes peuvent résoudre un même problème. Il importe évidemment de pour le calcul scientifique, etc.) et dispose donc d'une gamme d'actions de niveau
choisir le meilleur ce qui, en informatique, signifie le plus rapide, le plus simple et qui utilise
sémantique très différent.
le moins d’espace de mémoire. Hélas, il est rarement possible de satisfaire ces trois critères à
la fois et il faut faire des compromis. S'il est vrai que l'on puisse tout faire avec tous les langages, on le fera plus ou moins
Un algorithme est qualifié de "bon" s'il est correcte et efficace ; c'est à dire respectivement facilement, compte tenu de la différence de puissance qui existe entre les instructions
qu'il retourne un bon résultat et qu'il se termine en un temps raisonnable. Il doit vérifier les relatives aux domaines d'applications privilégiés du langage et les autres domaines.
propriétés suivante :
• Il doit être fini et doit se terminer après un nombre fini d’opérations sinon, il ne retourne
aucun résultat ; il ne sera donc pas correcte.
• Il doit être défini et précis : chaque règle (instruction) doit être définie sans ambiguïté.
C'est une condition pour que l'algorithme retourne toujours le même résultat pour un
même problème
• S’il y a des données d’entrée, le domaine d’application doit être précisé (exemple:
nombre entier, réel, etc.).

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
7 8
I
Données et
actions
. élémentaires

Dans les technologies de l'information (TI), une donnée est une


description élémentaire, souvent codée, d'une chose, d'une
transaction d'affaire, d'un événement, etc. Les données peuvent être
conservées et classées sous différentes formes : papier, numérique,
alphabétique, images, sons, etc.

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
9 10
Les données et les instructions élémentaires sont les éléments fondamentaux d’un langage ASCII (American Standard Code for Information Interchange). Cette table étant
algorithmique. Ils permettent de spécifier en termes informatiques précis un schéma de ordonnée, on peut écrire par exemple : 'A' < 'B'.
résolution, l'organisation de la mémoire, les types de données utilisées ou produites par ce
qui deviendra un programme. Dans ce chapitre nous allons nous intéresser aux données de • Le type BOOL (BOOLEEN) : Une donnée de ce type peut prendre les seules valeurs
base qu'un algorithme peut utiliser. TRUE ou FALSE. Les opérateurs prédéfinis associés aux données de type LOGIQUE
sont : la négation NOT et les connecteurs AND et OR.
I.1 Données élémentaires
Les opérateurs de comparaison (=, ≠, <, >, ≤, ≥) opèrent sur des données de même type
Les données décrites et manipulées dans un algorithme caractérisent une information Scalaire. Le résultat de ces opérateur est de type booléen.
pertinente aussi pour l'algorithme que pour son usage (utilisateur). Les données peuvent Le type REAL : Une donnée de ce type prend ses valeurs dans un ensemble fini de valeurs
provenir des éléments de stockage, fournies par l’utilisateur au clavier, générées par décimales relatives.
l’algorithme lui-même … Pour chaque algorithme, on distingue intuitivement :
Les opérations prédéfinies, opérant sur des données de type INT ou REAL, sont les
• Les données d’entrée : ce sont les données fournies à l’algorithme. opérations arithmétiques (+, -, *, /).
• Les données de sortie : ce sont les résultats produits par l’algorithme. R
E
M A QU E:
R
• Les données intermédiaires : ce sont les données de travail de l’algorithme, servant aux
On peut définir un nouveau type par réduction d’un type simple à un intervalle de valeurs,
manipulations internes (compteurs, données de stockage des résultats intermédiaires,
appelé type INTERVAL. La notation de ce type est alors :
etc.).
Type type_name = Inf .. Sup
L’ensemble des données d’entrée et des données de sorite d’un algorithme constitue le
paramétrage de cet algorithme. Une variable est identifiées par un nom unique est un type Inf et Sup désignent les valeurs extrêmes de l’intervalle considéré.

Nom d'une donnée: Il sert à désigner la donnée dans l’algorithme. Il est représenté par une I.2 Actions élémentaires
chaîne alphanumérique où le 1er caractère est une lettre et les autres caractères peuvent être
Les actions élémentaires sont les actions de bases, considérées comme prédéfinies et dont la
des lettres, des chiffres ou le trait de soulignement ‘_’. Chaque fois que c'est possible, ce nom
durée est supposée constante quelque soit la taille de données qu'elles traitent. Ces actions
doit être significatif.
élémentaires permettent de donner des valeurs aux données, de modifier ces valeurs, de
Type d'une donnée : Le type d'une donnée caractérise les valeurs que peut prendre cette comparer des données, etc.
donnée ainsi que les actions autorisées sur celle-ci. On distingue les types simples et les types
1.2.1 L'affectation
structurés. Ces derniers sont répartis en trois catégories : les structures statiques homogènes
(informations de même type), les structures statiques hétérogènes (informations de différents L'affectation est l’action permettant d'attribuer une valeur à une donnée. Cette valeur peut
types) et les structures dynamiques. résulter de l’évaluation d’une expression arithmétique ou logique (fig. 2). En langage de
description algorithmique, une affectation est représentée comme suit :
Une donnée de type simple contient une seule information, alors qu’une donnée structurée
contient une collection d’informations qui sont réparties en plusieurs champs accessibles donnee ← valeur ;
individuellement ou collectivement. donnee ← expression ;
L’utilisation d’une donnée désigne sa caractéristique dans l'algorithme : donnée d’entrée, L'expression à droite de signe d'affectation "←", sera complètement évaluée puis assignée
donnée de sortie ou donnée intermédiaire. La nature d’une donnée désigne sa caractéristique (affectée) à la variable située à gauche de même signe. La valeur ou le résultat de l'expression
constante ou variable dans l'algorithme. Une constante est une donnée dont la valeur est à droite du signe d'affectation doit être de même type ou de type compatible avec celui de la
précisée au début de l’algorithme et qui ne varie pas durant le déroulement de celui-ci. Une variable à gauche.
variable est une donnée dont la valeur doit être initialisée dans l'algorithme soit par une
simple valeur arbitraire soit par calcul et qui est susceptible d’être changée durant le
déroulement de celui-ci. Les types simples sont les types Scalaires et le type REAL (REEL). X 2 ;
Un type Scalaire est un ensemble de valeurs fini et totalement ordonné. On distingue les
types suivants :
Y 4 ; 2 ? ? ?
• Le type INT (ENTIER) : Une donnée de ce type prend théoriquement ses valeurs dans
l’ensemble des entier relatifs Z. Pour les entiers naturels appartenant à N, il faut utiliser
Z
X
X + Y ;
Y – X ; ? ? ? 6
Représentation de la mémoire


les entiers non signés.

Le type CHAR (CARACTERE) : Une donnée de ce type prend ses valeurs dans
? 4 ? ?
Fi g. 2 -O pérati ons d'aff ect ati on
l’ensemble des codes de représentation de caractères normalisés, appelé table des codes
Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
11 12
1.2.2 Les actions d'entrée / sortie Un algorithme est défini avec le mot ALGORITHM et est identifié par un nom. C'est l'entête
de l'algorithme. Il faut toujours attribuer un nom significatif à un algorithme afin de donner
Les actions d'entrée / sortie permettent respectivement de lire et d'écrire des données sur
une idée sur ce qu'il fait.
différents supports. Ce sont les actions qui expriment la communication entre un algorithme
et son environnement, utilisateur y compris. Dans un algorithme les actions de lecture La liste de données contient les données d'entrée, les données intermédiaires et les données
écriture sont respectivement formulées : de sortie, avec leur type
read (liste de nom de variables) Le bloc d'actions est bien sûr indiqués par les mots BEGIN et END.
write (liste d'objets)
ALGORITHM nom_algorithme
• Liste de noms de variables est une suite de noms de variables (pas forcément de même BEGIN
type) séparés par des virgules. actions
• Liste d’objets est une suite d’objets (constantes, variables, expressions ou constantes END
chaîne de caractères) séparés par des virgules. EXEMPLE : calcul de discriminant
Lors d’une lecture, un programme (l'exécution d'un algorithme) attend de recevoir des
ALGORITHM calcul_discriminant
données, soit à partir du clavier soit à partir d'un autre support, les valeurs à affecter INPUT REAL a, b, c;
respectivement aux variables dont les noms sont dans la liste de l’action read. Inversement, OUTPUT REAL delta;
les valeurs des objets désignés dans la liste de l’action write sont transmises à l’utilisateur à BEGIN
travers un organe de sortie, notamment l'écran. write ("Donner les réels a, b et c :");
read (a, b, c);
EXEMPLE delta ← b * b - 4 * a * c;
write ("La valeur du discriminant DELTA = ", delta);
END A lgo 1. - Cal cul de di scrim inant
read (a, b, c) ;
delta ← b * b - 4 * a * c ;
write ("∆ = ", delta) ;
1.5 Structures de contrôle
1.3 Bloc d'actions et enchaînement séquentiel d'actions Les instructions d'affectation et de lecture / écriture ne suffisent pas pour élaborer des
Dans un algorithme classique, on dit que des actions s'enchaînent séquentiellement, quand la algorithmes génériques et performants. De même les blocs d'instructions sont exécutés dans
fin d'une action déclenche l'exécution de l'action suivante. Un bloc d'actions est un ensemble l'ordre d'apparition des instructions. Dans un algorithme, certaines instructions sont
d'actions enchaînées séquentiellement et liées ensemble par une condition ou un facteur soumises à des conditions ; par exemple ne faire une opération de division que si le
d'exécution. L'exécution de ce bloc commence par la première action et se terminer par la dénominateur est différent de zéro. De même, si l'on souhaite compléter l'algorithme Algo 1
dernière. Un bloc d'action est situé entre les mots BEGIN et END : pour calculer les racines d'un polynôme de second degré, il faudrait tester si la valeur du
discriminant est positive, nulle ou négative.
BEGIN L'algorithmique fournit d'autres types d'instructions de base, ce sont les structures de
action 1 ; contrôle. Ces structures peuvent être des structures conditionnelles ou alternatives, des
action 2 ; structures itératives ou répétitives ou bien des structure de choix. Ces structures permettent
action 3 ; de contrôler l’ordre d’exécution des instructions dans un bloc.
...
action n; 1.5.1 Les structures conditionnelles
END
Elles permettent d’exécuter un ensemble (ou block) d’instructions selon qu’une condition est
I.4 Règles d'écriture d'un algorithme ou n’est pas vérifiée. Exemple, considérons un polynôme de degré 2 dont on veut calculer les
racines P(X ) = ax 2 + bx + c
Un algorithme se compose des parties suivantes:
2
On calcule le discriminant ∆ = b − 4ac
• Un en-tête.
• Une liste de données. Si ∆ > 0 alors il existe deux racines réelles. Si ∆ = 0 alors il existe une racine réelle double.
• Un bloc d'actions. Dans le dernier cas, c'est à dire si ∆ < 0 il existe deux racines complexes.
La syntaxe des structures conditionnelles est la suivante :

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
13 14
IF une condition 1 est vérifiée THEN SWITCH valeur (expression ou variable scalaire) DO
Bloc d'instruction CASE V1 : Bloc d'Actions1;
ELSE IF une condition 2 est vérifiée THEN END CASE
Bloc d'instruction CASE V2 : Bloc d'Actions2;
ELSE IF une condition 3 est vérifiée THEN END CASE
...
Bloc d'instruction
DEFAULT : Bloc d'Actions;
...
END CASE
ELSE END SWITCH
Bloc d'instruction
END IF Si la variable ou l’évaluation de l’expression vaut une valeur Vali alors c’est le bloc d’actions
<Bloci> qui sera exécuté et les autres blocs seront ignorés. Si la variable ou l’expression n’a
Le bloc d'instruction est le même que celui vu au §1.3. Le nombre d'alternatives peut être un aucune valeur parmi les valeurs Val1, .., Valn, c’est le bloc d’actions après la rubrique
ou plus. S'il n'y a qu'une seule alternative alors il n'y a aucun bloc ELSE, autrement il y a un DEFAULT qui sera exécuté et les autres blocs seront ignorés.
bloc ELSE IF par alternative et bloc ELSE pour la dernière alternative lorsque aucune des
EXEMPLE
condition des autres bloc n'a été vérifiée.
Un algorithme qui réalise au choix la somme, le produit, la différence ou la division de deux
EXEMPLE : calcul des racines d'un polynôme de degré 2 nombres donnés.
ALGORITHM calcul_racines ALGORITHM choix_operations
INPUT REAL a, b, c; INPUT REAL a, b;
OUTPUT REAL x1, x2; CHAR choix;
OUTPUT REAL resultat;
BEGIN
REAL delta; BEGIN
write ("Donner les réels a, b et c : "); write ("1 : Addition");
read (a, b, c); write ("2 : Multiplication");
write ("3 : Soustraction");
delta ← b * b - 4 * a * c ; write ("4 : Division");
IF delta > 0 THEN write ("Donner votre choix (1 / 2 / 3 / 4) : ");
x1 = (-b + sqrt(delta)) / (2*a) ; read (choix)
x2 = (-b - sqrt(delta)) / (2*a) ; write ("Donner le premier nombre : ");
write ("Deux racines réelles : x1 = ", x1, " x2 = ", x2); read (a)
ELSE IF delta = 0 THEN write ("Donner le deuxième nombre : ");
x1 = -b / (2*a) ; read (b)
write ("Une racines réelles double : x1 = ", x1); SWITCH choix DO
ELSE
CASE '1' : resultat ← a + b;
write ("Pas de racines réelles pour ce polynôme");
write ("Somme des deux nombres : ", resultat);
END IF
END CASE
END A lgo 2. - Cal cul de raci nes d'un pol ynô
m ede degré 2 CASE '2' : resultat ← a * b;
write ("Produit des deux nombres : ", resultat);
END CASE
CASE '3' : resultat ← a - b;
write ("Différence des deux nombres : ", resultat);
REMARQUE END CASE
CASE '4' : IF B ≠ 0 THEN
Si le bloc d’actions est réduit à une seule action, on peut omettre les clauses BEGIN et END. resultat ← a / b;
write ("Division des deux nombres : ", resultat);
1.5.2 Les structures de choix multiples ELSE
write ("La division par zéro est impossible")
Permet d’exécuter un ensemble (ou bloc) d’instructions selon la valeur d’une donnée END IF
scalaire. C’est un cas particulier d’une structure conditionnelle IF . . . ELSE. Toute structure END CASE
de choix peut être remplacée par une structure conditionnelle, l’inverse n’est cependant pas DEFAULT : write ("Opération inconnue");
vrai. END CASE
END SWITCH
END A lgo 3. - Choi x d'o pérati on de cal cul

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
15 16
1.5.3 Les structures itératives n
EXEMPLE : calcul de ∑i
Permet d’exécuter un ensemble (ou bloc) d’instructions plusieurs fois. Le nombre i =1

d’exécution du bloc d’instructions peut être connu d’avance ou peut dépendre de la ALGORITHM calcul_somme
vérification ou non d’une condition. INPUT INT n ;
OUTPUT INT somme ;
1.5.3.1 La structure FOR BEGIN
INT i;
Il est souvent dit que la structure FOR sert lorsque le nombre d'itérations à faire est connu write ("donner la valeur de n : ");
d'avance. Ceci est bien sûr vrai mais dire que cette structure ne sert que pour le cas où le read (n);
nombre d'itérations est connu d'avance est par contre une erreur. Il est tout à fait possible somme ← 0;
d'avoir des boucles itératives FOR dont le nombre de fois où elles s'exécutent est inconnu. i ← 1;
C'est la cas pour les langages de programmation comme le C, C++, Java entre autres.
WHILE i <= n DO
somme ← somme + i;
FOR compteur ← indice_debut TO indice_fin DO [ STEP = pas]
i ← i + 1;
Bloc d'instructions END WHILE
END FOR write ("Somme = ", somme);
END
A lgo 5. - Cal cul de l a so
m m edes n prem iers enti ers avec l a str uct ureWH ILE
Le bloc d'instructions est exécuté un nombre déterminé de fois. Ce nombre est contrôlé par
un compteur allant de la valeur indice_debut à la valeur indice_fin. La progression se fait
dans l’ordre croissant ou décroissant. La variable Compteur est de type scalaire.
Dans l'exemple de Algo 5, on connais d'avance le nombre de répétitions du bloc
Dans ce cas, la structure FOR est à utiliser impérativement lorsqu’on connaît à priori le d'instructions. Cela n'empêche pas d'utiliser une boucle WHILE.
nombre de répétitions à effectuer. Et dans ce cas précis, la finitude de la boucle est assurée.
Cependant, aucune action de la boucle ne doit affecter la variable Compteur ; ce qui serait, le EXEMPLE : on veut un algorithme qui fait deviner à l'utilisateur une valeur entière connue
d'avance (7 par exemple). On demande à un utilisateur de saisir une valeur entre 1 et 10
cas échéant, contraire à la nature déterministe du nombre d'itérations.
ALGORITHM devinette
n
INPUT INT val;
EXEMPLE : calcul de ∑i
i =1
BEGIN
CONST INT nombre = 7;
ALGORITHM calcul_somme
INPUT INT n; write ("deviner une valeur entre 1 et 10 : ");
OUTPUT INT somme; read (val);
BEGIN
INT i; WHILE val ≠ nombre DO
write ("donner la valeur de n : "); write ("deviner une valeur entre 1 et 10 : ");
read (n); read (val);
somme ← 0; END WHILE
END A lgo 6. -D evi nette avec l a str uct ureWH ILE
FOR i ← 1 TO n DO
somme ← somme + i;
END FOR Si l'utilisateur donne dès le premier coup la bonne valeur, la boucle WHILE ne sera jamais
write ("Somme = ", somme); exécutée. Sinon, elle sera exécutée jusqu'à ce que l'utilisateur devine la bonne valeur
A lgo 4. -END
Cal cul de l a so
m m edes n prem iers enti ers avec l a str uct ure O
F R
1.5.3.1 La structure REPEAT ... UNTIL
Cette structure est utilisée pour répéter un bloc d'instruction tant qu'une condition est
1.5.3.1 La structure WHILE vérifiée. le nombre de répétition du bloc d'instruction est généralement inconnu mais il peut
Cette structure est utilisée pour répéter un bloc d'instruction tant qu'une condition est aussi bien être connu d'avance. La différence entre cette structure de contrôle et le WHILE
vérifiée. le nombre de répétition du bloc d'instruction est généralement inconnu mais il peut est que la structure REPEAT est exécutée au moins une fois alors que le WHILE peut ne
aussi bien être connu d'avance. jamais être exécuté.

REPEAT
WHILE condition DO
Bloc d'instructions
Bloc d'instructions
UNTIL condition
END WHILE
Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
17 18
EXEMPLE : on veut un algorithme qui fait deviner à l'utilisateur une valeur entière connue ALGORITHM nbombre_de_le
d'avance (7 par exemple). On demande à un utilisateur de saisir une valeur entre 1 et 10 INPUT CHAR c;
OUTPUT INT nb_le;
ALGORITHM devinette BEGIN
INPUT INT val; BOOL trouve ← FALSE;
BEGIN nb_le ← 0;
CONST INT nombre = 7; write ("taper la chaîne de caractère terminée par CR : ");
read (c);
REPEAT WHILE c != CR DO
write ("deviner une valeur entre 1 et 10 : "); IF (c ='e' AND trouve = TRUE) THEN
read (val);
nb_le ← nb_le + 1;
UNTIL val = nombre
ELSE IF (c = 'l') THEN
END A lgo 6. -D evi nette avec l a struct ure REPE
A T trouve ← TRUE;
ELSE
trouve ← FALSE;
END IF
EXERCICE read (c);
END WHILE
Ecrire un algorithme qui compte le nombre d'occurrence de "le" dans une suite de caractères END A lgo 7. - Co
m ptage de no
m bre de "l e"
saisies par l'utilisateur. La suite de caractères se termine lorsque l'utilisateur tape le caractère
de fin de ligne CR.

SOLUTION
La solution généralement proposée est la suivante :
nb_le ← 0;
read (c);
WHILE c ≠ CR DO
IF c = 'l' THEN
read (c);
IF c = 'e' THEN
nb_le ← nb_le + 1;
END IF
END IF
read (c);
END WHILE
Cette solution est bien évidemment fausse. Si vous donnez la chaîne de caractères "elle" qui
contient bien une occurrence de "le", l'algorithme vous donnera zéro occurrences de "le". La
raison est simple : le premier caractère 'l' est suivit d'un autre caractère 'l' qui est ignoré par
l'algorithme. Pour corriger cette erreur, il faut voir si un caractère 'l' n'est pas suivit d'un
autre 'l', lui même suivit d'un autre 'l', etc. Ce n'est ni une bonne solution ni une solution
élégante.
Une autre solution serait de garder le même algorithme mais si un caractère 'l' n'est pas
suivit d'un caractère 'e', il faut revenir en arrière d'un caractère. Là aussi la solution n'est pas
recommandée car, lorsque plusieurs 'l' se suivent, il faut faire autant de retour en arrière.
Mais le problème principal dans le retour en arrière est de savoir l'exprimer. Ici il ne s'agit
pas d'une structure de chaîne de caractères avec des caractères ayant des indices mais il s'agit
de lecture de caractères au clavier. Le retour en arrière est très difficile.
La meilleure solution est de ne traiter qu'un seul et unique caractère à chaque itération de la
boucle WHILE. Lorsqu'on tombe sur le caractère 'l', on mémorise à l'aide d'une variable
booléenne que le dernier caractère lu est 'l'. Lorsqu'on rencontre le caractère 'e' et que le
dernier caractère lu auparavant est un 'e', alors on incrémente le compteur de nombre
d'occurrences de "le".

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
19 20

Vous aimerez peut-être aussi