Académique Documents
Professionnel Documents
Culture Documents
CHAPITRE 1
Page 1
Chapitre 1 : Généralités sur l’algorithmique
1. Définitions
• L’informatique
• L’ordinateur
Un algorithme est un ensemble de règles précises qui définit un procédé de calcul destiné à
obtenir un résultat déterminé à partir de données initiales. Cet ensemble de règles constitue les
étapes de la résolution d’un problème.
En d'autres termes, un algorithme est une suite finie et non-ambiguë d’opérations ou
d'instructions permettant de résoudre un problème.
Un algorithme manipule des données (par exemples des nombres et des mots). Ces données
sont mémorisées (ou stockées) dans des cases mémoire. En effet, dans la mémoire de
l’ordinateur, les données sont rangées dans des cases mémoire.
sous l’angle physique, une structure de données est un ensemble de cases mémoire
destiné à contenir des données, et organisé de sorte à faciliter l’accès aux données et
leur manipulation ;
sous l’angle logique, une structure de données est une méthode de stockage et
d’organisation des données qui facilite l’accès aux données et leur manipulation.
Un algorithme est écrit en langage naturel. Il peut alors varier "légèrement", dans la forme mais
pas dans le fond, d’un livre ou d’un concepteur à un autre. Cependant, il ne peut être exécuté
sur aucun ordinateur à moins d’être codé en un programme informatique.
Page 2
Chapitre 1 : Généralités sur l’algorithmique
• Le langage de programmation
Un ordinateur ne sait rien faire. Pour qu’il réalise une tâche, par exemple calculer la factorielle
d’un nombre, on doit lui montrer comment le faire. On lui fournit alors un programme qu’il
exécute. Ce programme lui montre comment effectuer cette tâche.
L’étape de la conception de la solution n’est pas du tout facultative au regard des avantages
certains que l’on en tire. Ces avantages seront exposés plus loin.
Le calcul de la factorielle d’un nombre est, sur un plan purement mathématique, élémentaire
car la méthode de calcul est très simple à appliquer. La difficulté réside au niveau
algorithmique, c’est-à-dire :
− Comment "expliquer" la méthode à un ordinateur ?
− Comment traduire les étapes du calcul en instructions algorithmiques ?
− La solution proposée est-elle juste ?
− Si cette solution est juste, est-elle la meilleure ?
Il est évident que l’on ne peut pas directement créer un programme pour la résolution de ce
problème sans l’avoir sérieusement analysé.
En effet, Il faudra réfléchir sur la définition de la factorielle et ses propriétés, pour espérer
pouvoir proposer une ou plusieurs solutions. Ce qui signifie implicitement qu’un problème peut
admettre plusieurs solutions.
Page 3
Chapitre 1 : Généralités sur l’algorithmique
− la finitude : un algorithme doit toujours se terminer après un nombre fini d'étapes (donc
il doit avoir un nombre fini d’instructions) ;
− la précision : chaque étape d'un algorithme doit être définie précisément (donc il doit
avoir chacune de ses instructions, définie sans ambiguïté) ;
− les entrées : ce sont des quantités prises dans un ensemble spécifié d'objets, qui sont
données à l'algorithme avant qu'il ne commence (on doit utiliser des données connues
par l’utilisateur) ;
− les sorties : ce sont des quantités qui ont une relation spécifiée avec les entrées (un
algorithme doit être déterministe, c’est-à-dire qu’il doit donner les mêmes résultats pour
les mêmes données) ;
− le rendement : toutes les opérations que l'algorithme doit accomplir doivent être
suffisamment élémentaires pour pouvoir être en principe réalisées dans une durée finie
par un homme utilisant du papier et un crayon.
Aujourd’hui, les ordinateurs sont devenus nos plus fidèles compagnons. Ils sont présents, sous
une forme ou une autre, dans la quasi-totalité des appareils électroniques que nous utilisons au
quotidien. Tous ces systèmes dits informatisés ou électroniques sont en réalité pilotés par des
programmes plus ou moins complexes.
Ces programmes découlent évidemment d’algorithmes. Donc, partout où un ordinateur
intervient, ce sont, en réalité, des algorithmes qui sont mis en œuvre. Les algorithmes
interviennent dans de nombreux domaines :
Page 4
Chapitre 1 : Généralités sur l’algorithmique
Page 5
Chapitre 2 : Variables, types, instructions élémentaires et expressions
CHAPITRE 2
Page 6
Chapitre 2 : Variables, types, instructions élémentaires et expressions
1. Un exemple d’algorithme
Algorithme CalculFactorielle
Var nombre, sauvegarde, resultat : entier
Début
écrire ("Calcul de la factorielle d’un nombre")
Répéter
écrire ("Donnez un entier naturel : ")
lire (nombre)
Jusqu’à (nombre >= 0)
sauvegarde ← nombre
Si ((nombre = 0) OU (nombre = 1))
Alors resultat ← 1
Sinon resultat ← 1
TantQue (nombre > 1) Faire
resultat ← nombre * resultat
nombre ← nombre - 1
FinTantQue
FinSi
écrire ("La factorielle de ", sauvegarde, "est ", resultat) Fin
2.1. L’en-tête
L’en-tête est annoncé par le mot réservé (ou mot-clé) Algorithme suivi du nom que l’on a
choisi pour désigner l’algorithme. Le nom d’un algorithme est aussi appelé identificateur.
Le choix de l’identificateur est libre, mais il doit respecter certaines règles. Ces règles seront
présentées dans la leçon suivante.
L’en-tête sert à nommer un algorithme de sorte à ne pas réécrire cet algorithme à nouveau
lorsque l’on en aura besoin.
L’algorithme de l’exemple a pour en-tête : Algorithme CalculFactorielle
Page 7
Chapitre 2 : Variables, types, instructions élémentaires et expressions
La zone des déclarations est l’espace réservé pour lister les "ingrédients" dont on a besoin pour
résoudre un problème. Ces ingrédients sont appelés objets algorithmiques.
Ce sont : les constantes, les types, les procédures, les fonctions, et les variables.
La zone des déclarations est délimitée par les mots réservés Algorithme et Début.
Dans l’algorithme de l’exemple, trois variables (nombre, sauvegarde et resultat) ont été
déclarées.
Les variables forment une catégorie d’objets algorithmiques. Le
mot réservé Var sert à déclarer les variables.
2.3. Le corps
Le corps d’un algorithme est la zone située entre les mots réservés Début et Fin.
On y écrit toutes les instructions qui permettent de résoudre le problème.
Le mot réservé Début indique le début de la suite d’instructions, le mot réservé Fin marque,
à la fois, la fin de la suite des instructions, et la fin de l’algorithme. Donc il n’y a plus
d’instruction après le mot Fin, et l’algorithme s’arrête.
Page 8
Chapitre 2 : Variables, types, instructions élémentaires et expressions
Remarques
Page 9
Chapitre 2 : Variables, types, instructions élémentaires et expressions
1. Notion d’objet
Un objet doit être impérativement déclaré avant d’être utilisé dans un algorithme.
On donne alors ses caractéristiques : son identificateur, son type et si possible sa valeur.
1.1. L’identificateur
L’identificateur est le nom choisi pour l’objet. Il se présente sous la forme d’une suite de
caractères alphanumériques (alphabétiques et/ou numériques) sans espace. Il commence
toujours par une lettre. Il est recommandé de choisir un nom qui a un lien sémantique avec le
contenu de l’objet ou avec le rôle de l’objet. Les caractères accentués ne sont pas autorisés.
Par exemples : nombre, resultat sont acceptés tandis que 1nombre, résultat sont refusés.
1.2. Le type
Avant d’appliquer un quelconque traitement à un objet, il faut d’abord connaître son type.
Un objet est soit du type numérique, soit du type chaîne de caractères, soit du type booléen.
Exemple : On considère deux objets a et b contenant des données. S’il est possible
d’additionner ces données, alors ces données sont des nombres. Il faut donc nécessairement
que les deux objets qui les contiennent soient du type numérique.
1.3. La valeur
Le traitement d’un objet porte sur la valeur de la donnée que cet objet contient.
Il y a deux cas :
− si cette valeur est modifiable, alors l’objet est une variable,
− si cette valeur n’est pas modifiable, alors l’objet est une constante.
Const < identificateur de la constante > ← < valeur affectée à la constante >
Exemple : dans l’algorithme précédent, deux variables ont été déclarées : nombre, sauvegarde
et resultat. La variable appelée nombre reçoit le nombre dont on veut calculer la factorielle ; la
variable nommée sauvegarde reçoit une copie du contenu de la variable nombre, et enfin la
variable appelée resultat reçoit le résultat du calcul.
Page 10
Chapitre 2 : Variables, types, instructions élémentaires et expressions
Elles sont toutes les trois de type numérique et précisément de type entier. D’où
la déclaration : Var nombre, sauvegarde, resultat : entier.
Remarques
Chaque objet algorithmique est déclaré à l’aide d’un mot réservé propre.
Les objets algorithmiques types, procédures et fonctions seront étudiés plus loin.
Page 11
Chapitre 2 : Variables, types, instructions élémentaires et expressions
1. Rappel
Une variable sert à stocker une donnée dans la mémoire vive de l’ordinateur. La variable peut
mémoriser la donnée si elle est du même type que cette donnée.
2. Définition
On distingue trois principaux types de base (ou types élémentaires ou types simples) : le type
numérique, le type chaîne de caractères et le type booléen.
Le type numérique regroupe tous les nombres : les entiers et les réels.
On déclare alors une donnée numérique soit dans le type réel, soit dans le type entier.
Page 12
Chapitre 2 : Variables, types, instructions élémentaires et expressions
Opérateurs Signification
= est égal à
> est strictement supérieur à
< est strictement inférieur à
>= ou ≥ est supérieur ou égal à
<= ou ≤ est inférieur ou égal à
< > ou ≠ est différent de
On retient alors :
Une chaîne de caractères est une suite finie de caractères regroupés dans une seule variable.
Le type chaîne de caractères supporte les opérateurs de comparaison et les instructions de
manipulation de chaînes de caractères.
Une chaîne de caractères est délimitée par des griffes (" ") tandis qu’un caractère est délimité
par des apostrophes (' ').
Exemples : "Calcul de la factorielle d’un nombre", 'D', 'd'.
Le type chaîne supporte les mêmes opérateurs de comparaison que ceux supportés par le
type numérique.
Il existe des tables (par exemples : ASCII, ASCII étendu) qui regroupent tous les caractères
utilisés en informatique. Dans ces tables, chaque caractère est lié à un code numérique, c’est-
àdire un nombre, qui le représente dans l’ordinateur. Ce code numérique permet d’établir une
relation d’ordre entre les chaînes de caractères.
Page 13
Chapitre 2 : Variables, types, instructions élémentaires et expressions
Exemples :
'a' > 'A' car dans la table ASCII, le code numérique lié à 'a' est supérieur au code
numérique lié à 'A'. En effet, 97 > 65
'A' < 'Z' car, selon la table ASCII, 65 < 90
"235" < "236" car le code numérique lié à '5' est inférieur à celui de '6' (car 53 < 54)
"2015" < "3" car le code numérique lié à '2' est inférieur à celui de '3' (car 50 < 51)
La manipulation des chaînes de caractères nécessite l’utilisation de certaines instructions
spécifiques. Ces instructions sont en réalité des algorithmes prédéfinis. On n’écrit pas à
nouveau de tels algorithmes, on les utilise directement comme on utilise les fonctions
mathématiques prédéfinies (ln x, ex, sin x, cos x, abs x) en prenant soin de respecter leurs règles
d’utilisation. Ces instructions sont des primitives algorithmiques.
Exemple : longueur ("YAO Kassi Benoît"), résultat : 16 (car il faut aussi compter les espaces)
+ est la fonction de concaténation de chaînes. Elle recopie une chaîne à la fin d’une autre.
sschaine (< chaîne >, < position >, < nombre >)
Elle extrait de < chaîne >, à partir de la position < position >, < nombre > caractères.
Page 14
Chapitre 2 : Variables, types, instructions élémentaires et expressions
LA TABLE ASCII
L'ordinateur conserve les données en mémoire sous forme numérique. Puisqu’il n'existe pas
de méthode pour stocker directement les caractères, alors chaque caractère est représenté en
mémoire par un code numérique appelé code ASCII. L’acronyme ASCII signifie American
Standard Code for Information Interchange (Code américain normalisé pour l'échange
d'information). La table ASCII permet de déterminer le code ASCII de chaque caractère.
Page 15
Chapitre 2 : Variables, types, instructions élémentaires et expressions
Selon la table ci-dessus, pour déterminer le code ASCII en codage décimal du caractère
contenu dans une cellule de la table ASCII, on additionne le nombre lu en ligne et le
nombre lu en colonne. Ainsi, par exemples :
− ASCII ('A') = 65 (car 60 + 5 = 65) ; −
ASCII ('a') = 97 (car 90 + 7 = 97). −
ASCII ('0') = 48 (car 40 + 8 = 48) ;
− ASCII ('9') = 57 (car 50 + 7 = 57).
Les codes 0 à 31 ne sont pas des caractères. Ce sont des caractères de contrôle, ils sont
utilisés en programmation. Les codes 48 à 57 représentent les chiffres, ceux de 65 à 90
représentent les majuscules, et ceux de 97 à 122 représentent les minuscules.
Le code ASCII ne contient ni caractère accentué ni caractère spécifique à une langue. Ces
caractères particuliers ont été intégrés à la table ASCII, aboutissant ainsi à la table ASCII
étendu.
3.3. le type booléen
Certaines questions et assertions (ou propositions) n’admettent que deux réponses qui
s’excluent mutuellement : Non/Oui, Faux/Vrai.
Par exemples : être à l’intérieur, être admis, être en bonne santé, être en marche.
La réponse à la question relative à l’une de ces situations est soit "Non", soit "Oui" ; ou alors
soit "Faux", soit "Vrai". Mais jamais les deux à la fois.
La variable qui contient la réponse à une telle assertion est du type booléen. Donc le type
booléen n’admet que deux valeurs : Faux et Vrai notées respectivement F et V (et symbolisés
respectivement par les chiffres 0 et 1).
Le type booléen supporte les opérateurs logiques suivants : ET, OU, NON.
La réponse relative à l’état de la salle dépend entièrement de l’état de chacune des ampoules.
La réponse peut être aussi formulée en fonction de l’état que l’on recherche (salle éclairée
totalement, salle éclairée partiellement, salle sombre totalement, etc.) En effet :
− si les deux ampoules sont allumées, on dira que la salle est entièrement éclairée
Page 16
Chapitre 2 : Variables, types, instructions élémentaires et expressions
− si les deux ampoules sont éteintes, on dira que la salle est entièrement sombre − si
l’une des ampoules est allumée, on dira que la salle est partiellement éclairée − si la
salle est partiellement éclairée, laquelle des ampoules est allumée ?
− si la salle est partiellement éclairée, laquelle des ampoules est éteinte ?
− peut-on avoir au moins une ampoule éteinte si la salle est éclairée ? − peut-
on avoir les deux ampoules allumées si la salle est sombre ?
− ...
Pour obtenir les réponses à toutes les questions possibles selon tous les points de vue, on
construit des tableaux. Ces tableaux sont des tables de vérité.
l’opérateur ET
a b a ET b
V V V
V F F
F V F
F F F
Selon le "point de vue" de l’opérateur ET, la salle est éclairée si l’ampoule a et l’ampoule b
sont simultanément allumées.
l’opérateur OU
a b a OU b
V V V
V F V
F V V
F F F
Selon le "point de vue" de l’opérateur OU, la salle est éclairée si l’une des ampoules est allumée
: C’est-à-dire :
− soit uniquement a est allumée − soit
uniquement b est allumée
− soit a et b sont simultanément allumées.
Page 17
Chapitre 2 : Variables, types, instructions élémentaires et expressions
l’opérateur NON
a NON a
V F
F V
Ce sont les trois tables de vérité élémentaires. On construit d’autres tables plus complexes à
partir de ces tables.
Remarque
Page 18
Chapitre 2 : Variables, types, instructions élémentaires et expressions
1. Définition
2.1. La déclaration
La déclaration d’un objet est une instruction qui permet de réserver un espace dans la mémoire
vive dans le but de mémoriser cet objet. Lors de la déclaration d’un objet, on précisera son
identificateur, son type et si possible sa valeur (pour plus de détails, voir les leçons
précédentes).
Exemples
2.2. L’affectation
L’affectation est une instruction qui permet d’affecter ou d’assigner ou d’attribuer une valeur
à un objet. On dit couramment "stocker une valeur dans un objet".
Représentée par une flèche orientée à gauche (←), cette instruction a pour format général :
Page 19
Chapitre 2 : Variables, types, instructions élémentaires et expressions
2.3. La lecture
La lecture ou saisie est une instruction qui permet de fournir une valeur à une variable, cette
valeur étant récupérée généralement via le clavier.
Elle a pour format général :
2.4. L’écriture
L’écriture ou affichage est une instruction qui permet d’écrire ou d’afficher ou d’éditer une
valeur à l’écran.
Elle a pour format général :
écrire (valeur)
ou
afficher (valeur)
La valeur peut être :
• le contenu d’une variable ;
• le contenu d’une constante ;
• le résultat d’une expression.
Page 20
Chapitre 2 : Variables, types, instructions élémentaires et expressions
La première instruction permet d’afficher du texte (ou plus généralement, une chaîne de
caractères) à l’écran, sur une ligne. On délimite le texte à l’aide de griffes (" ").
La seconde instruction permet d’afficher, à la fois, du texte et les contenus des variables nombre
et resultat.
L’affectation est une opération qui consiste à stocker une valeur dans une variable ou dans une
constante.
Cette opération est représentée par une flèche orientée à gauche : ←, et a pour format général
< identificateur > ← < valeur >.
La valeur est soit un nombre, soit une chaîne de caractères, soit une variable du type de
l’identificateur, soit une constante du type de l’identificateur, soit une expression dont le
résultat de l’évaluation est du type de l’identificateur.
2. Définition : L’expression
Une expression est un ensemble de valeurs reliées par des opérateurs, et qui fournit une
seule valeur.
Par exemple :
La partie b*b - 4*a*c (située à droite de la flèche) est une expression. On veut stocker sa valeur
dans la variable delta.
Le calcul de cette valeur est effectué avec les valeurs contenues dans les variables a, b et c.
L’affectation est possible si la variable delta est du même type que le résultat de l’expression
b*b - 4*a*c. Alors la variable delta doit être du type réel.
Une expression possède une valeur et un type. Une expression peut alors être aussi bien une
variable qu’une constante, de n’importe quel type.
Page 21
Chapitre 2 : Variables, types, instructions élémentaires et expressions
TRAVAUX DIRIGÉS
Page 22
Chapitre 2 : Variables, types, instructions élémentaires et expressions
Indiquez, pour chaque variable, sa valeur après l’exécution de chacune des instructions :
Situation
1a←5b
←7a←
bb←a
Situation
2a←5b
←7b←
aa←b
On a du jus de gnanmankou dans un verre bleu, et du bissape dans un verre jaune. Comment
procéder pour échanger les contenus des deux verres ?
Page 23
Chapitre 2 : Variables, types, instructions élémentaires et expressions
Écrire les instructions qui permettent d’échanger les valeurs de deux variables.
On supposera que ces deux variables sont a et b de type entier et qu’elles contiennent
respectivement les valeurs 10 et -10.
Indication : S’inspirer de la méthode de résolution de la question pour gagner 2000 FCFA.
TD 6 : : Permutation triangulaire
Soient trois variables x, y et z (supposées du même type). Écrivez les instructions permettant
de permuter leurs valeurs, de telle sorte que la valeur de x passe dans z, celle de z dans y, et
celle de y dans x. On utilisera une seule variable supplémentaire.
Que trouvera-t-on dans c à l’exécution de l’instruction c ← 14, sachant que c est une constante
de type entier contenant la valeur 7 ?
RÉSUMÉ
Toute variable (ainsi que toute constante) a un type. Un type couvre un ensemble de
valeurs et un ensemble d’opérateurs.
Page 24
Chapitre 2 : Variables, types, instructions élémentaires et expressions
POUR S’ENTRAÎNER…
Écrire un algorithme qui extrait les initiales d’une personne. On suppose que la personne donne
le nom et un seul prénom.
On donne une durée en jours. Écrire un algorithme qui permet d’exprimer cette durée en
années, mois, semaines et jours.
(Par exemple : 433 jours équivalent à une durée de 1 an 2 mois 1 semaine et 1 jour)
Page 25
Chapitre 2 : Variables, types, instructions élémentaires et expressions
Écrire un algorithme qui lit le prix HT en francs CFA et la quantité d’un article, et qui retourne
le prix total TTC correspondant, sachant que la TVA vaut 18%. L’algorithme devra afficher
une facture détaillée.
Écrire un algorithme qui affiche le résultat d’un candidat au test d’entrée au cycle d’ingénieur
de l’INSTI, selon les données du tableau ci-dessous :
Page 26
Chapitre 3 : Les Structures Conditionnelles
CHAPITRE 3
Page 27
Chapitre 3 : Les Structures Conditionnelles
Introduction
Chacun des algorithmes écrits s’exécute de manière séquentielle, c’est-à-dire que les
instructions sont exécutées les unes après les autres, selon leur position dans le corps de
l’algorithme. Tranquillement, de la première instruction à la dernière.
En réalité, la plupart des algorithmes ne sont pas des algorithmes à déroulement séquentiel (ou
algorithmes séquentiels).
Les algorithmes doivent tenir compte de certaines contraintes posées par les problèmes. Ces
contraintes peuvent porter, par exemples, sur l’intervalle des valeurs acceptées, sur des choix à
faire face à plusieurs possibilités, sur des répétitions d’actions ou sur des itérations.
Une structure de contrôle ou (instruction de contrôle) est une instruction complexe qui
contrôle l’ordre dans lequel les instructions du corps d’un algorithme sont exécutées.
• de prendre des décisions ou d’effectuer des choix dans le traitement réalisé. Par
exemple, dans l’énoncé 6 de la série d’exercices du chapitre précédent, l’algorithme
doit "décider" de l’admission ou de l’échec du candidat selon la moyenne obtenue.
• les instructions de contrôle : ce sont des instructions complexes qui agissent sur
l’ordre d’exécution des instructions élémentaires. Elles ont un rôle de structuration de
l’algorithme.
Page 28
Chapitre 3 : Les Structures Conditionnelles
1. Définitions
• Une condition est une expression dont le résultat est une valeur booléenne.
• Une condition composée (ou condition complexe) est formée d’au moins deux
conditions simples reliées entre elles par un ou plusieurs opérateurs logiques (ET, OU,
NON).
2. Description
Il existe deux catégories de conditions : les conditions simples et les conditions composées.
Une condition simple contient un opérateur de comparaison (=, <, ≤, >, ≥, ≠).
Une condition composée relie une ou plusieurs conditions simples en une condition unique à
l’aide des opérateurs logiques.
Exemple : (x > 0) ET (x ≠ 30) est une condition composée ; (x > 0) est une condition simple,
(x ≠ 30) est aussi une condition simple. Ces deux conditions simples sont reliées par l’opérateur
logique ET.
Page 29
Chapitre 3 : Les Structures Conditionnelles
− la structure de choix.
[3] L’action peut être un algorithme. En effet, un algorithme peut exécuter un autre algorithme
comme s’il exécutait une instruction. L’algorithme exécuté est un sous-algorithme. Cette
catégorie d’algorithmes sera étudiée plus tard.
Page 30
Chapitre 3 : Les Structures Conditionnelles
Si <condition>
Alors <actions>
FinSi
Page 31
Chapitre 3 : Les Structures Conditionnelles
Selon le problème à résoudre, on peut être amené à poser une ou plusieurs conditions sur une
condition. Dans ce cas, l’une des parties d’une structure conditionnelle renferme une ou
plusieurs autres structures conditionnelles. La structure obtenue est une structure
conditionnelle imbriquée.
Le format d’une structure conditionnelle imbriquée varie selon le problème à traiter. Néanmoins
le format de base est :
Une structure conditionnelle contenue dans une autre peut elle-même contenir une autre
structure conditionnelle.
Il faut bien prendre soin de toujours indiquer la fin de la structure conditionnelle alternative, de
la structure conditionnelle simple et des structures conditionnelles imbriquées à l’aide du mot
réservé FinSi.
Écrire un algorithme qui affiche la décision concernant un élève donné à partir de la saisie de
sa moyenne. On suppose que l’utilisateur ne saisira pas de moyennes fantaisistes.
Page 32
Chapitre 3 : Les Structures Conditionnelles
On effectue les tests et les choix à l’aide des structures conditionnelles. Un choix est une
sélection parmi plusieurs possibilités.
On peut présenter chacune des possibilités à l’aide de la structure conditionnelle simple.
Si plusieurs valeurs exécutent la même action, on peut regrouper ces valeurs dans une liste de
valeurs séparées par des virgules.
D’où le format plus général :
Page 33
Chapitre 3 : Les Structures Conditionnelles
On veut écrire un algorithme (pour le service inscriptions d’une école de football) qui intègre
si possible un élève à une catégorie, à la saisie de son année de naissance.
Les catégories selon les tranches d’âge sont les suivantes :
Poussin : de 6 à 7 ans Pupille
: de 8 à 9 ans
Minime : de 10 à 11 ans Cadet
: 12 à 13 ans
On veut effectuer l’une ou l’autre des opérations ci-dessous sur trois nombres, à partir d’un
menu :
− additionner ;
− multiplier ;
− rechercher le minimum ;
− rechercher le maximum.
On admettra qu’un menu est une liste d’options affichées à l’écran de l’ordinateur.
TRAVAUX DIRIGÉS
Proposer un algorithme qui recherche les racines d’un polynôme du second degré dans ℝ.
Écrire un algorithme qui résout une équation du second degré dans ℝ, en mettant en œuvre la
structure de choix.
Page 34
Chapitre 3 : Les Structures Conditionnelles
Page 35
Chapitre 4 : Les structures répétitives
CHAPITRE 4
Page 36
Chapitre 4 : Les structures répétitives
Introduction
Certains algorithmes du chapitre précédent présentent des failles. La solution à ces failles
consiste à contraindre l’utilisateur à saisir des valeurs appartenant à une plage de valeurs.
En effet, on doit :
− soit lui demander de saisir une nouvelle valeur tant que l’actuelle n’est pas valide,
− soit répéter le refus de toute valeur invalide jusqu’à ce qu’il saisisse une valeur valide.
Ces structures jouent presque le même rôle mais elles ne s’utilisent pas de la même façon.
Page 37
Chapitre 4 : Les structures répétitives
La structure Tant Que permet d’exécuter une ou plusieurs actions plusieurs fois de suite tant
que la condition spécifiée est vérifiée.
Puisque la condition est évaluée avant l’entrée dans la boucle, il peut alors arriver que le bloc
d’actions ne soit pas exécuté. Cela se produit lorsque la première évaluation de la condition
produit la valeur Faux.
Par conséquent, les actions définies dans la boucle Tant Que peuvent être exécutées 0 ou 1 ou
plusieurs fois.
De plus, il faut qu’au moins une variable de l’expression d’évaluation soit susceptible de
modification à l’intérieur de la boucle pour que l’on puisse en sortir.
Si la condition qui régit la boucle ne prend jamais la valeur Faux (donc si la condition prend
toujours la valeur Vrai), les actions seront répétées indéfiniment. On aura alors un cas de
"boucle infinie". (On ne sort jamais de la boucle)
Pour éviter ce genre d’erreur, il faut toujours rechercher la condition d’arrêt de la boucle, et
exprimer sa proposition contraire.
Écrire un algorithme qui demande la saisie d’un entier naturel strictement positif. L’algorithme
valide la saisie si elle est correcte, sinon il invite l’utilisateur à recommencer.
Écrire un algorithme qui affiche les entiers naturels de 1 à n, n étant un entier naturel strictement
supérieur à 1, saisi au clavier.
Page 38
Chapitre 4 : Les structures répétitives
Répéter
< action(s) >
Jusqu’à < condition >
La structure Répéter permet d’exécuter une ou plusieurs actions plusieurs fois de suite jusqu’à
ce que la condition spécifiée soit vérifiée.
Puisque la condition est évaluée après l’exécution du bloc d’actions définies dans la boucle,
alors le bloc d’actions est exécuté au moins une fois.
Donc les actions définies dans la boucle Répéter seront exécutées une ou plusieurs fois. De
plus, il faut qu’au moins une variable de l’expression d’évaluation soit susceptible de
modification à l’intérieur de la boucle pour qu’on puisse en sortir.
Si la condition qui régit la boucle ne prend jamais la valeur Vrai (donc si la condition prend
toujours la valeur Faux), les actions sont répétées indéfiniment. On aurait alors un cas de
"boucle infinie".
Pour éviter ce genre d’erreurs, il faut toujours rechercher la condition de continuité de la
boucle, et exprimer sa proposition contraire.
La structure Tant Que et la structure Répéter se ressemblent. Mais elles ne doivent être
confondues.
En effet :
dans la structure Tant Que, la condition exprimée est la condition de continuité ; tandis
que dans la structure Répéter, la condition exprimée est la condition d’arrêt.
dans la structure Tant Que, la condition est évaluée avant une première exécution du
bloc d’actions définies ; tandis que dans la structure Répéter, la condition est évaluée
après une première exécution du bloc d’actions.
Page 39
Chapitre 4 : Les structures répétitives
dans la structure Tant Que le bloc d’actions définies peut ne pas être exécuté du tout ;
tandis que dans la structure Répéter, le bloc d’actions définies est exécuté au moins une
fois.
Écrire un algorithme qui affiche les entiers naturels de 1 à n, n étant un entier naturel strictement
supérieur à 1, saisi au clavier.
Écrire un algorithme qui permet de résoudre une équation du premier degré, autant de fois que
l’utilisateur le souhaite.
Page 40
Chapitre 4 : Les structures répétitives
Pour < identificateur > ← < valeur initiale > à < valeur finale > [Pas de < incrément >] Faire
< action(s) >
FinPour
< identificateur > est le nom d’une variable de type entier (déclarée au préalable).
< valeur initiale > et < valeur finale > sont des constantes ou des variables ou des
expressions du même type que < identificateur >, donc de type entier
< valeur initiale > et < valeur finale > constituent les bornes de l’intervalle d’entiers
dans lequel < identificateur > va prendre ses valeurs
Pas de < incrément > est une valeur entière positive ou négative prédéfinie ajoutée à
la valeur de < identificateur > à chaque exécution de < action(s) >. On peut simplement
dire Pas ou incrément
< action(s) > peut être une instruction, un bloc d’instructions ou un algorithme.
< identificateur > reçoit la valeur de < valeur initiale >. La valeur de < identificateur > va
progresser en fonction du pas (c’est-à-dire en fonction de l’incrément) jusqu’à atteindre la
valeur de < valeur finale >. C’est la condition de continuité de la boucle Pour.
Chaque fois que < identificateur > change de valeur et progresse, < action(s) > est exécuté.
Exemples :
Page 41
Chapitre 4 : Les structures répétitives
Cependant :
• Si valeur initiale = valeur finale et incrément = 1, alors le bloc d’actions définies sera
exécuté une seule fois.
• Si valeur initiale > valeur finale et incrément > 0, alors le bloc d’actions définies ne
sera pas exécuté.
• Si valeur initiale < valeur finale et incrément < 0, alors le bloc d’actions définies ne
sera pas exécuté.
Pour < identificateur > ← < valeur initiale > à < valeur finale > Faire
< action(s) >
FinPour
Page 42
Chapitre 4 : Les structures répétitives
Écrire un algorithme qui affiche les entiers naturels de 1 à n, n étant un entier naturel strictement
supérieur à 1, saisi au clavier.
Page 43
Chapitre 4 : Les structures répétitives
Selon le problème à résoudre, on peut être amené à imbriquer des structures de contrôle.
En effet, on peut imbriquer :
• les structures conditionnelles entre elles ;
• les structures itératives entre elles ;
• une structure itérative dans une structure conditionnelle ;
• une structure conditionnelle dans une structure itérative ;
Page 44
Chapitre 4 : Les structures répétitives
On utilise une boucle pour répéter un bloc d’instructions. Mais quelle boucle choisir ?
L’objectif ici n’est pas de montrer que "telle boucle est mieux que telle autre" mais plutôt
d’abord de mettre en évidence leurs particularités les unes par rapport aux autres, et ensuite de
montrer comment choisir une boucle selon la situation.
On démontre que les boucles Tant Que, Répéter et Pour sont équivalentes.
En fait, la boucle Pour est une simplification de la boucle Tant Que, tandis que la boucle Répéter
est une "réécriture" de la boucle Pour.
Donc la boucle Tant Que pourrait largement suffire pour la réalisation de toute répétition.
Cependant, selon la situation, une boucle peut être plus adaptée qu’une autre. On
revient alors à la question posée plus haut : quelle boucle choisir ?
Page 45
Chapitre 4 : Les structures répétitives
POUR S’ENTRAÎNER …
Les exercices proposés dans cette partie (et dans les chapitres suivants) requièrent des
connaissances dans divers domaines, notamment en mathématiques, en comptabilité et en
linguistique. Donc quelques recherches seront utiles.
Pour tous les exercices, il est recommandé d’effectuer si nécessaire ou si possible des
contrôles de saisie.
Pour les exercices traitant des chaînes de caractères, on considérera que les caractères
alphabétiques sont minuscules et non accentués.
On admettra qu’un mot est une chaîne de caractères alphabétiques ayant un sens ou non.
Page 46
Chapitre 4 : Les structures répétitives
Énoncé 1 : De la logique
Écrire un algorithme qui établit une facture détaillée en fournissant le nombre d’articles
commandés, le montant total HT, le taux de la remise, le montant de la remise, la TVA (la TVA
est de 18 %), le montant de la TVA, et le net à payer, sachant que la remise est accordée dans
les conditions suivantes :
• 0% pour un prix total HT inférieur à 10000 F
• 5% pour un prix total HT supérieur ou égal à 10000 F et inférieur à 20000 F
• 10% pour un prix total HT supérieur ou égal à 20000 F et inférieur à 50000 F
• 15% pour un prix total HT supérieur ou égal à 50000 F
Pour un client donné, la facturière saisit les prix des produits commandés les uns à la suite des
autres sans savoir d’avance le nombre de prix à saisir. On suppose qu’elle ne commet pas
d’erreur de saisie.
L’unité monétaire est le Franc CFA de la BCEAO.
Page 47
Chapitre 4 : Les structures répétitives
Algorithme SansNom
Var i : entier
nombre, somme : réel
Début
somme ← 0
Pour (i ← 1 à 4) Faire
écrire ("Donnez un nombre : ")
lire (nombre)
somme ← somme + nombre
FinPour
écrire ("La somme est : ", somme)
Fin
2. Écrire un algorithme qui réalise la même chose, en utilisant à la place de la boucle Pour : a)
la boucle Tant Que
b) la boucle Répéter
Écrire un algorithme qui calcule la somme des n premiers entiers naturels. On affichera
uniquement le résultat. (On n’utilisera pas de formule relative au suites numériques.)
Écrire un algorithme qui génère les dix nombres consécutifs d’un entier naturel donné. (On
n’utilisera pas de formule relative au suites numériques.)
Proposer un algorithme qui génère les vingt premiers nombres pairs à partir de 0.
Proposer six algorithmes différents pour calculer la factorielle d’un nombre, à raison de deux
algorithmes par structure de boucle.
Écrire un algorithme qui calcule le produit de deux entiers naturels, sans utiliser l’opérateur de
multiplication.
Page 48
Chapitre 4 : Les structures répétitives
Écrire un algorithme qui calcule xn, x étant un réel et n un entier naturel, sans utiliser l’opérateur
d’élévation à la puissance.
Écrire un algorithme qui détermine le quotient et le reste d’une division entière sans utiliser les
opérateurs division entière et modulo.
À partir de la définition d’un nombre premier, écrire un algorithme qui effectue un test de
primalité sur un entier naturel saisi au clavier. Proposer des améliorations successives.
Écrire un algorithme qui détermine le résultat d’un candidat au test d’entrée au cycle
d’ingénieur de l’INSTI selon les données du tableau ci-dessous :
Page 49
Chapitre 4 : Les structures répétitives
Écrire un algorithme qui détermine les positions d’une lettre dans un mot.
Par exemples : non, rotor, radar, été, kayak, sas, Laval, Anna.
Page 50
Chapitre 5 : Les tableaux
CHAPITRE 5
LES TABLEAUX
Page 51
Chapitre 5 : Les tableaux
Introduction
1. Approche descriptive
Les variables "habituelles" sont des variables simples (ou variables scalaires), tandis que les
"nouvelles" variables font partie des structures de données complexes. La "nouvelle" variable
est le tableau.
Le tableau permet de stocker plusieurs données que l’on peut traiter de manière individuelle ou
de manière collective.
1. Définitions de base
Une ligne d’un tableau est constituée de deux segments horizontaux consécutifs ;
Une colonne d’un tableau est constituée de deux segments verticaux consécutifs ;
L’intersection d’une colonne et d’une ligne est une case ou une cellule ;
Page 52
Chapitre 5 : Les tableaux
• 3 lignes ;
• 6 colonnes ;
• taille : 3 lignes et 6 colonnes notée tableau (3 × 6) ;
• d’où taille = 18 cellules.
Le tableau précédent admet une représentation qui ne tient compte que des cellules :
Un tableau est une structure de données linéaire qui permet de stocker des données de
même type. Chaque donnée est repérée par un ou plusieurs indices qui indiquent la
position de la donnée dans le tableau.
Les données d’un tableau doivent être toutes du même type. C’est ce type commun qui
est attribué au tableau. Donc le type d’un tableau est le type des données qu’il contient.
Un indice est une variable de type entier qui sert à parcourir un tableau et à repérer une
cellule du tableau.
Dans un tableau, on stocke une donnée par cellule. Repérer une donnée revient aussi à
repérer la cellule qui la contient.
Dans un tableau à une dimension, le repérage s’effectue à l’aide d’un seul indice, tandis que
dans un tableau à deux dimensions, le repérage s’effectue à l’aide de deux indices. Le tableau
de l’exemple est un tableau à deux dimensions. Chaque cellule est située à l’intersection d’une
ligne et d’une colonne. Donc la cellule est repérée par deux indices :
un indice ligne et un indice colonne.
Page 53
Chapitre 5 : Les tableaux
− un type ;
− un ou plusieurs indice(s).
1. La déclaration
Avant de déclarer un tableau, il faut d’abord connaître le nombre de données à stocker et leur
type commun. Cette opération permet de préciser son identificateur, son nombre maximal
d’éléments et son type selon la syntaxe :
< nom du tableau > [1 : indice maximal] : tableau de < type de donnée>
ou encore < nom du tableau > [1 .. indice maximal] : tableau de < type de
donnée> < nom du tableau >
[1 : indice maximal]
C’est l’intervalle de valeurs entières strictement positives que prendra la variable représentant
l’indice.
La borne inférieure de cet intervalle vaut toujours 1 à la déclaration du tableau.
La valeur de la borne supérieure (indice maximal) dépend du nombre de données à stocker dans
le tableau. Ce qui signifie que la valeur de l’indice maximal indique le nombre maximal de
données que l’on peut stocker dans un tableau de dimension 1.
Par exemple, si le tableau doit contenir au maximum 15 valeurs, alors indice maximal vaut 15
; d’où la notation [1:15].
Cette notation indique le type commun des données que contiendra le tableau. Toutes les
données d’un tableau doivent être du même type ou de types compatibles. Le tableau est alors
du même type que les données.
Par exemples :
− si toutes les données sont de type entier, alors le tableau doit être de type entier ;
− si certaines des données sont de type entier et d’autres de type réel, alors le tableau doit être
de type réel ;
− si certaines des données sont de type caractère et d’autres de type chaîne de caractères, alors
le tableau doit être de type chaîne de caractères.
Page 54
Chapitre 5 : Les tableaux
2. La saisie
Cette opération consiste à stocker une valeur dans chacune des cellules du tableau. On dit qu’on
saisit le tableau ou qu’on renseigne le tableau. Cette opération se réalise de deux manières :
− soit on adresse directement les cellules, dans un ordre quelconque ;
− soit on saisit le tableau de manière séquentielle (de la première cellule à la dernière).
T [i] ← < valeur > // T[i] désigne la cellule d’indice i, et i varie de 1 à indice maximal
La saisie peut s’effectuer dans un ordre quelconque. Toutefois, il faut veiller à ne pas faire de
"débordement", c’est-à-dire tenter de renseigner une ou plusieurs cellules qui ne font pas partie
du tableau. Par exemple, les cellules T [16] et T [17] n’existent pas dans le tableau T [1:15].
On renseigne le tableau T de manière séquentielle, à l’aide de la boucle Pour car elle est
mieux adaptée à cette opération :
3. L’affichage
Page 55
Chapitre 5 : Les tableaux
écrire (T [i])
Puisque l’affichage peut être sélectif, c’est-à-dire peut porter sur une partie des données du
tableau, alors il faudrait adapter la condition régissant la structure Pour et les instructions
contenues dans la structure Pour.
Avant d’afficher un tableau, il faut d’abord l’avoir saisi.
Il faudra bien sûr éviter les "débordements" en voulant afficher le contenu de cellules ne faisant
pas partie du tableau.
Remarque
On peut utiliser des vecteurs pour effectuer divers travaux tels que :
Page 56
Chapitre 5 : Les tableaux
On recherche un objet qui pourrait être dans l’un des nombreux casiers (ou tiroirs) d’un meuble
disposés les uns après les autres (en ligne ou en colonne).
On ouvre le premier casier, et on y recherche l’objet. S’il y est, on arrête la recherche ; sinon
on continue jusqu’à atteindre le dernier casier.
Il y a deux résultats possibles : soit l’objet y est, soit il n’y est pas.
La méthode rappelle celle utilisée pour rechercher un caractère dans une chaîne de
caractères. La structure Tant Que est appropriée pour cette opération.
Et à propos de chaîne de caractères, une chaîne de caractères est en réalité un tableau
unidimensionnel de type caractère.
Écrire un algorithme qui recherche un pays de la CEDEAO ayant le PIB saisi au clavier.
Analyse et méthode
On a besoin de deux vecteurs de taille 15 chacun. Ils seront mis en correspondance tels que
schématisés ci-dessous :
L’un des tableaux stocke les noms des pays et l’autre stocke leurs PIB. On les renseigne dans
la même boucle avec le même indice.
On recherche le PIB dans le tableau des PIB. S’il y est, on utilise la valeur de son indice pour
afficher le nom du pays correspondant à ce PIB à partir du tableau des noms de pays. On arrête
la recherche dès que l’on trouve un pays.
Écrire un algorithme qui recherche les pays de la CEDEAO ayant le PIB saisi au clavier.
Analyse et méthode
Cet exercice est similaire au précédent à la différence qu’ici on recherche tous les pays ayant
le PIB indiqué. On parcourt alors tout le tableau des PIB. Chaque fois que l’on rencontre une
occurrence du PIB recherché, on affiche le nom du pays correspondant par l’intermédiaire de
la valeur de l’indice de son PIB dans le tableau des PIB.
La structure Pour est la plus appropriée.
Page 57
Chapitre 5 : Les tableaux
Un compteur est nécessaire pour prévoir le cas où le PIB recherché ne figure pas dans le
tableau, et informer l’utilisateur.
Écrire un algorithme qui recherche les pays de la CEDEAO ayant leurs PIB compris dans un
intervalle donné.
Analyse et méthode
Il faut d’abord, définir l’intervalle de PIB en précisant la borne inférieure et la borne supérieure
puis, s’inspirer de la solution de l’exercice précédent.
Il s’agit ici de rechercher la plus petite valeur et la plus grande valeur d’un vecteur.
Écrire un algorithme qui recherche le PIB le plus faible et le PIB le plus élevé de la CEDEAO.
Analyse et méthode
On parcourt le vecteur des PIB pour rechercher les extrémums. Le parcours s’effectue à l’aide
de la boucle Pour. On y met en œuvre deux structures conditionnelles simples, l’une
recherchant le minimum et l’autre le maximum. Parallèlement à cette double recherche, il faut
déterminer, à tout instant, le pays dont le PIB est traité. On a alors besoin d’un indice pays qui
aura pour valeur l’indice de l’extrémum des PIB traité.
Un tri est une opération qui permet d’organiser les éléments d’un ensemble fini de données
selon un ordre déterminé ou selon un ensemble de critères.
Donc un algorithme de tri est un algorithme qui permet d’ordonner un tableau homogène
d’éléments selon un ordre fixé.
Les éléments à trier appartiennent à un ensemble E muni d’une relation d’ordre noté ≤ (ou
≥). Un tableau est ordonné (ou trié) s’il existe une relation d’ordre entre ses éléments. Il
existe deux sortes de tri. On parle de :
Page 58
Chapitre 5 : Les tableaux
Les algorithmes de tri sont nombreux. Trois algorithmes classiques de tri seront étudiés : le tri
par sélection, le tri à bulles et le tri par insertion.
Ce sont des algorithmes de tri en place, c’est-à-dire que le tri s’effectue sans faire intervenir
un autre tableau mais plutôt une variable scalaire comme variable temporaire.
Donc, au départ, on a un tableau non trié, à la fin du traitement, ce tableau est trié.
Chacun de ces algorithmes sera présenté à partir d’un exemple.
Il est recommandé d’appliquer manuellement la méthode. Cela permet de mieux l’appréhender
et de comprendre l’algorithme qui sera proposé, et même d’en présenter des variantes.
Chaque fois que l’on déplace le minimum relatif, on procède à un échange de cellule entre le
minimum relatif et l’élément qui occupe la cellule où l’on désire stocker le minimum. De plus,
au fil des échanges de positions, la partie du tableau où la recherche s’effectue "se réduit" car
on n’effectue plus de recherche de minimum "en arrière".
Exemple : tri croissant par recherche des minima successifs sur le tableau ci-dessous :
Le plus petit élément est dans la cellule 3. On le repositionne en cellule 1, et l’élément de cette
cellule vient occuper la cellule 3 :
Après le premier passage, on considère le tableau à partir de sa deuxième cellule. Le plus petit
élément de cette partie se trouve dans la cellule 4 (du tableau de départ). Il y a échange de
cellule avec l’élément occupant la cellule 2. On obtient :
Page 59
Chapitre 5 : Les tableaux
On considère maintenant les trois dernières cellules. Il y a échange de cellules entre les
éléments des cellules 3 et 5 :
On considère maintenant les deux dernières cellules. Il n’y a pas d’échange de cellules entre
les éléments des cellules 4 et 5, car l’ordre est respecté :
‘
Il reste maintenant la dernière cellule, la cellule 5. L’élément de cette cellule est supérieur ou
égal à tous les éléments qui le précèdent dans le tableau, et qui eux-mêmes sont rangés selon
l’ordre fixé. Il n’y aura alors pas d’échange. Donc le tableau final est :
On peut aussi effectuer un tri croissant par recherche des maxima successifs.
Le principe est le même que précédemment sauf qu’ici :
− on parcourt le tableau de la dernière cellule à la deuxième
− on recherche le maximum et on le stocke dans la dernière cellule du tableau.
Page 60
Chapitre 5 : Les tableaux
On recommence jusqu’à ce qu’il n’y ait plus d’échange. S’il n’y a pas eu d’échange pendant
un parcours, cela signifie que le tableau est trié. On effectue donc des itérations.
Après le premier passage, le plus grand élément sera placé dans la dernière cellule du tableau,
dans la bonne cellule. Pour le passage suivant, on n’effectue pas de comparaison avec le
dernier élément. Ainsi à chaque passage, le nombre de valeurs à comparer diminue de 1.
Pour savoir qu’il y a eu échange ou pas, on utilise une variable booléenne qui changera de
valeur s’il n’y a pas d’échange.
Page 61
Chapitre 5 : Les tableaux
À l’issue de ce passage, le tableau est trié, mais pour le montrer, on effectue un passage de
contrôle. On constate que les éléments sont deux à deux ordonnés, il n’y a alors aucun échange.
On arrête le traitement d’où le résultat : (5, 1, 4, 2, 0) → (0, 1, 2, 4, 5).
echange ← Vrai
TantQue (echange = Vrai)
echange ← Faux
Pour (i ← 1 à n) Faire
Si (T [i] > T [i + 1])
Alors temp ← T [i + i]
T [i + i] ← T [i]
T [i] ← temp
echange ← Vrai
FinSi
FinPour
FinTantQue
Page 62
Chapitre 5 : Les tableaux
On parcourt le tableau du début à la fin en insérant chaque élément rencontré (ou élément
courant) à la bonne position sans écraser l’élément stocké à cette position. Le décalage
s’effectue vers la droite jusqu’à trouver le point d’insertion.
Ainsi, tous les éléments qui précèdent l’élément courant sont triés. Pour insérer l’élément
courant à la bonne place, on le compare à ses précédents, puis on décale les éléments afin
d’effectuer l’insertion.
Au départ, l’élément courant est le deuxième élément de la collection. Pour la suite, l’élément
courant est en gras, et les éléments déjà triés sont soulignés.
Étape 1 : (9 6 1 4 8) → (6 9 1 4 8)
Étape 2 : (6 9 1 4 8) → (1 6 9 4 8)
Étape 3 : (1 6 9 4 8) → (1 4 6 9 8)
Étape 4 : (1 4 6 9 8) → (1 4 6 8 9)
À l’issue de ce passage, le tableau est trié. D’où le résultat : (9, 6, 1, 4, 8) → (1, 4, 6, 8, 9).
Pour (i ← 2 à n) Faire
temp ← T [i] // mémorisation de l’élément courant (élément à insérer)
// décalage des éléments jusqu’à trouver le point d’insertion
j←i+1
TantQue ((j ≥ 1) ET (T [j] > temp)) Faire
T [i + i] ← T [i]
j←j-1
FinTantQue
T [j + i] ← temp // insertion de l’élément courant à sa place
FinPour
Page 63
Chapitre 5 : Les tableaux
Pour (i ← 2 à n) Faire
temp ← T [i]
j←i+1
TantQue ((j ≥ 1) ET (T [j] < temp)) Faire
T [i + i] ← T [i]
j←j-1
FinTantQue
T [j + i] ← temp
FinPour
Si le tableau est ordonné (et de grande taille), cette méthode se révèle inefficace. On la
qualifierait même de méthode bestiale.
Lorsque le tableau est trié, on peut considérablement améliorer la recherche en effectuant une
recherche par dichotomie (ou recherche dichotomique).
la recherche dichotomique
La recherche dichotomique est un procédé itératif au cours duquel, à chaque boucle, on divise
le tableau en deux parties égales ou presque, et on recherche l’élément dans la partie appropriée.
1. rechercher l’objet stocké à l’indice médian du tableau (on obtient l’indice médian du tableau
en effectuant le calcul (borninf + bornsup) DIV 2)
b. l’élément recherché est supérieur à l’objet médian : s’il existe, l’élément recherché
est stocké dans une cellule de la partie droite du tableau. Appliquer de nouveau le
Page 64
Chapitre 5 : Les tableaux
ATTENTION : La recherche par dichotomie n’est applicable que sur un tableau trié.
Le bloc d’instructions ci-dessous permet d’effectuer une recherche dichotomique sur le vecteur
T [1:8] rangé dans l’ordre croissant :
borninf ← 1
bornsup ← 8
trouve ← Faux
écrire ("Donnez l’élément à rechercher : ")
lire (valeur)
Répéter
indmedian ← (borninf + bornsup) DIV 2
Si (T [indmedian] = valeur)
Alors trouve ← Vrai
Sinon Si (valeur > T [indmedian])
Alors borninf ← indmedian + 1
Sinon bornsup ← indmedian - 1
FinSi
FinSi
Jusqu’à ((trouve = Vrai) OU (borninf > bornsup))
Si (trouve = Vrai)
Alors écrire ("L’objet ", valeur, " est au rang ", indmedian)
Sinon écrire ("L’objet ", valeur, " n'est pas dans le tableau")
FinSi
1. La déclaration
< nom du tableau > [1 : indice ligne maximal, 1 : indice colonne maximal] :
tableau de < type de donnée >
Page 65
Chapitre 5 : Les tableaux
ou encore
< nom du tableau > [1 .. indice ligne maximal, 1 .. indice colonne maximal] :
tableau de < type de donnée >
Exemple : On veut créer le tableau M de 3 lignes et 4 colonnes pour y stocker des réels :
− son nombre minimal de lignes est : 1 ;
− son nombre maximal de lignes est : 3, alors indice ligne maximal = 3 ;
− son nombre minimal de colonnes est : 1 ;
− son nombre maximal de colonnes est : 4, alors indice colonne maximal = 4.
Puisque M est son identificateur, et il contiendra des réels, alors on le déclare par l’instruction
M [1:3,1:4] : tableau de réel ou M [1..3,1..4] : tableau de réel.
2. La saisie
Elle est similaire à celle des vecteurs, à la différence qu’ici la cellule est repérée par deux
indices : l’indice ligne et l’indice colonne.
Par exemple :
Soient les variables de type entier i et j respectivement l’indice ligne et l’indice colonne du
tableau M [1:3,1:4] de type réel : i varie de 1 à 3, tandis que j varie de 1 à 4.
La saisie peut s’effectuer dans un ordre quelconque. Mais il faut veiller à ne pas faire de
"débordement", c’est-à-dire à donner des positions de cellules qui ne font pas partie du tableau.
Par exemples : les cellules M [4,2] et M [3,5] n’existent pas dans le dans le tableau M [1:3,1:4].
Pourquoi ?
Page 66
Chapitre 5 : Les tableaux
La boucle principale (boucle extérieure) parcourt le tableau en ligne tandis que la boucle
intérieure parcourt le tableau en colonne.
D’abord i "se positionne" sur la ligne 1 puis "s’y bloque", pendant que sur cette ligne, j parcourt
les colonnes de la première à la dernière. C’est la raison pour laquelle la valeur de i sur la
première ligne ne varie pas tandis que celle de j s’incrémente d’une colonne à une autre.
Ensuite, dès que j atteint la dernière colonne, i passe à la deuxième ligne et "s’y bloque", en
attendant que j parcourt toutes les colonnes à nouveau.
Ainsi de suite jusqu’à ce que i parcourt toutes les lignes.
Voici le bloc d’instructions pour la saisie séquentielle d’un tableau M à deux dimensions :
3. L’affichage
Page 67
Chapitre 5 : Les tableaux
Remarque
Écrire un algorithme qui remplit de réels une matrice carrée d’ordre 3, puis l’affiche.
Analyse et méthode
D’abord, une matrice n’est rien d’autre qu’un tableau de dimension 2 ; elle est donc constituée
de lignes et de colonnes. Ensuite, si le nombre de lignes est égal au nombre de colonnes alors
cette matrice est carrée. Et enfin, l’ordre indique le nombre de lignes (ou de colonnes).
On doit donc d’abord déclarer un tableau de 3 lignes et 3 colonnes de réels, ensuite le remplir
et enfin l’afficher. Il est plus commode de renseigner le tableau de manière séquentielle. On
imbrique alors deux structures Pour.
Algorithme SaisirMatrice_AfficherMatrice
Var T[1:3,1:3] : tableau de réel
i, j : entier
Début
écrire ("Saisie et affichage d’une matrice carrée d’ordre 3")
écrire ("Saisie des éléments…")
Pour (i ← 1 à 3) Faire
Page 68
Chapitre 5 : Les tableaux
Pour (j ← 1 à 3) Faire
écrire ("Donnez l’élément de la ligne ", i, " colonne ", j, " : ")
lire (T [i,j])
FinPour j
FinPour i
écrire ("Saisie terminée !")
écrire ("Vous avez saisi…")
Pour (i ← 1 à 3) Faire
Pour (j ← 1 à 3) Faire
écrire (T [i,j])
FinPour j
FinPour i
Fin
Remarque
Puisque la saisie du tableau s’effectue "ligne par ligne", pour la saisie des éléments de la
matrice, on pourrait aussi écrire :
Pour (i ← 1 à 3) Faire
Écrire un algorithme qui effectue la somme de deux matrices carrées d’ordre 3 de réels.
Analyse et méthode
La somme de deux matrices carrées d’ordre n est une matrice carrée d’ordre n.
Alors, il faut déclarer trois matrices carrées de même taille.
Page 69
Chapitre 5 : Les tableaux
Soient :
A et B, les matrices opérandes, et S la matrice résultat ;
i et j respectivement l’indice ligne et l’indice colonne qui serviront à parcourir chacune
des matrices.
Comment procéder ?
− d’abord renseigner les tableaux A et B (l’un après l’autre !) ;
− ensuite additionner les contenus des cellules de même position puis stocker le résultat à la
même position dans S. On aura par exemple : S [2,3] ← A [2,3] + B [2,3] ;
− et enfin afficher S.
EN RÉSUMÉ…
• Un tableau est une structure de données linéaire qui permet de stocker un ensemble de
données du même type, et de les manipuler collectivement ou individuellement.
• Les tableaux ont de nombreuses applications. En effet, on les utilise notamment pour
réaliser des calculs statistiques (somme, produit, moyennes, écart-type, recherche
d’extremum, tris) et plus généralement en mathématiques (statistiques, analyse, calcul
matriciel, produit scalaire, résolution de systèmes d’équations, géométrie euclidienne,
géométrie de l’espace).
• Selon la dimension d’un tableau, chacune de ses cellules est repérée par un ou plusieurs
indices.
Il existe des tableaux de dimension supérieure ou égale à deux : ce sont les tableaux
multidimensionnels. Dans ces tableaux, toute cellule est repérée par au moins deux
indices.
Exemple : Soit E est un tableau à trois dimensions de tailles respectives 3, 4 et 5. E contient
des réels. On déclare E par l’instruction : E [1:3, 1:4, 1:5] : tableau de réel. Toute cellule de E
est repérée par trois indices.
Toutes les opérations réalisées sur les tableaux unidimensionnels peuvent l’être sur
aussi les tableaux multidimensionnels.
EXERCICES D’ENTRAINEMENT
Page 70
Chapitre 5 : Les tableaux
Fusion de tableaux
Écrire un algorithme qui effectue le produit d’une matrice carrée d’ordre 3 par un vecteur de
taille 3.
Énoncé 7 : Produit de deux matrices quelconques
Page 71
Chapitre 5 : Les tableaux
Situation de gestion
La société immobilière Cases d’Eburnie, dans le cadre de son projet Habitat 2025, met à
la disposition du public 3 modèles de maisons dont la vente est assurée par 4 vendeurs.
Pour la gestion des ventes, on utilise un tableau qui regroupe les informations ci-dessous :
− le nombre de maisons vendues par modèle et par chaque vendeur ;
− le total de maisons vendues par modèle ;
− le prix de vente de chaque modèle de maison ;
− le chiffre d’affaires (CA) réalisé sur chaque modèle de maison ;
Page 72
Chapitre 6 : Les sous-algorithmes
CHAPITRE 6
LES SOUS-ALGORITHMES
Page 73
Chapitre 6 : Les sous-algorithmes
1. Exemple introductif
Solution
Algorithme MultiTaches
Var a, b, c, min, max, delta, sol1, sol2 : réel
Début
écrire ("Un peu de maths") écrire
("Saisie des nombres") écrire ("Donnez le
premier nombre : ")
lire (a)
écrire ("Donnez le deuxième nombre : ")
lire (b)
écrire ("Donnez le troisième nombre : ")
lire (c)
écrire ("Résultats des différents traitements")
écrire ("Recherche du minimum des nombres", a, ",", b, " et ", c)
min ← a
Si b < min
Alors min ← b
FinSi
Si c < min
Alors min ← c
FinSi
écrire ("Le minimum est ", min)
écrire ("Recherche du maximum des nombres", a, ",", b, " et ", c)
max ← a
Page 74
Chapitre 6 : Les sous-algorithmes
Si b > max
Alors max ← b
FinSi
Si c > max
Alors max ← c
FinSi
écrire ("Le maximum est ", max)
écrire ("Résolution de l’équation ", a, "x + ", b, " = 0")
Si (a = 0)
Alors Si (b = 0)
Alors écrire ("L’ensemble des solutions est R")
Sinon écrire ("L’ensemble des solutions est l’ensemble vide")
FinSi
Sinon écrire ("La solution est ", (-b/a))
FinSi
écrire ("Recherche des racines de l’équation ", a, "x² + ", b, "x + ", c, " = 0")
Si (a = 0)
Alors Si (b = 0)
Alors Si (c = 0)
Alors écrire ("Infinité de solutions")
Sinon écrire ("Pas de solution")
FinSi
Sinon écrire ("Une solution unique : ", -c/b)
FinSi
Sinon delta ← b*b – 4*a*c
Si (delta < 0)
Alors écrire ("Pas de solution")
Sinon Si (delta = 0)
Alors écrire ("Une solution unique : ", -b/(2*a))
Sinon écrire ("Deux solutions distinctes")
écrire ("Première solution : ", (-b - delta^0.5) / (2*a))
écrire ("Seconde solution : ", (-b + delta^0.5) / (2*a))
FinSi
FinSi
FinSi
Fin
Page 75
Chapitre 6 : Les sous-algorithmes
On écrit un bloc d’une ou plusieurs instructions pour réaliser une tâche précise (par exemples :
rechercher les racines d’une équation, afficher un menu, calculer le carré d’un nombre). Ce
bloc d’instructions effectue donc un traitement particulier, et constitue un module.
Un algorithme peut alors regrouper plusieurs modules. S’il est écrit d’un seul tenant, il pourrait
être difficile à comprendre, dès qu’il dépasse (ou même avoisine) une ou deux pages. Il serait
alors intéressant de le décomposer en modules.
Algorithme EssaiAlgoModulaire
Var nbre1, nbre2, nbre3, min, max, delta, sol1, sol2 : réel
Début
écrire ("Un peu de maths")
écrire ("Saisie des nombres à traiter")
écrire ("Donnez le premier nombre : ")
lire (nbre1)
écrire ("Donnez le deuxième nombre : ")
lire (nbre2)
écrire ("Donnez le troisième nombre : ")
lire (nbre3)
Page 76
Chapitre 6 : Les sous-algorithmes
Pour chaque unité logique de traitement, on écrit les instructions qui lui permettent de réaliser
la tâche pour laquelle elle a été créée. On obtient ainsi les différents modules dont l’assemblage
aboutit à l’algorithme final.
Cet algorithme final est court, lisible et compréhensible.
Il est plus facile de corriger ou de modifier un algorithme modulaire. En effet, on sait exactement
à quels endroits (dans l’algorithme final ou dans l’un des modules) il faut apporter les
corrections ou les modifications.
Page 77
Chapitre 6 : Les sous-algorithmes
Une variable déclarée dans l’algorithme principal est une variable globale. Elle
peut être utilisée dans l’algorithme principal et dans tout sous-algorithme de
l’algorithme principal.
Une variable déclarée dans un sous-algorithme est une variable locale. Elle ne
peut être utilisée que dans ce sous-algorithme.
Un paramètre effectif (ou paramètre réel) est une variable contenant une valeur
pour laquelle un sous-algorithme s’exécute.
Un paramètre formel est une variable qui reçoit la valeur du paramètre effectif
transmise à l’appel d’un sous-algorithme.
Page 78
Chapitre 6 : Les sous-algorithmes
• ensuite spécifier :
− les sous-algorithmes associés aux sous-problèmes ;
− l’algorithme principal ;
− les variables globales ;
− les variables locales ;
− les constantes
Page 79
Chapitre 6 : Les sous-algorithmes
1. Définition
Une procédure est un sous-algorithme auquel est associée une liste de paramètres. Cette
liste de paramètres peut être vide.
Procédure <nom de la procédure> (liste des paramètres formels avec leurs types respectifs)
La description (ou écriture ou définition) d’une procédure se fait hors des limites de
l’algorithme appelant selon la syntaxe générale ci-dessous :
Procédure < nomProcédure > (liste des paramètres formels : type des paramètres) Const
< identificateurs des constantes > ← < valeurs des constantes > Var
< identificateurs des variables locales > : < types des variables locales >
Début Fin
< instruction(s) ou action(s) >
Dans l’en-tête d’une procédure, on indique obligatoirement les types des paramètres.
L’appel d’une procédure est l’exécution de cette procédure par un algorithme appelant comme
si ce dernier exécutait une instruction.
On appelle une procédure par son nom, et cet appel s’effectue dans le corps de l’algorithme
appelant selon la syntaxe suivante :
Dans le corps de l’algorithme appelant, le nom d’une procédure doit être toujours souligné.
L’appel d’une procédure déclenche immédiatement l’exécution des instructions de cette
procédure. Ce qui signifie que si la procédure n’a pas été décrite préalablement, son appel ne
déclenchera aucun traitement.
De plus, lors de son appel, la procédure doit recevoir tous les paramètres dont elle a besoin.
Page 80
Chapitre 6 : Les sous-algorithmes
5. Le passage de paramètres
Lorsqu’un algorithme appelle une procédure, il lui transmet des paramètres : on dit qu’il y a
passage de paramètres (ou transmission de paramètres).
L’utilisation d’une procédure nécessite la connaissance obligatoire de l’ordre des paramètres
formels au lieu de la connaissance de leurs noms.
Il y a deux points de vue pour le passage de paramètres : celui de l’algorithme appelant et celui
de la procédure. En effet :
• à l’appel de la procédure :
− d’abord, la liste des paramètres effectifs est mise en correspondance (ou en
synchronisation) avec la liste des paramètres formels ;
− ensuite, la valeur stockée dans chaque paramètre effectif est copiée dans le
paramètre formel lui correspondant.
La mise en correspondance des paramètres a un double rôle :
− vérifier qu’il y a autant de paramètres effectifs que de paramètres formels ;
− vérifier que tout paramètre effectif est du même type que le paramètre formel avec
lequel il est mis en relation.
• Les résultats obtenus par une procédure sont exploitables par l’algorithme
appelant par l’intermédiaire des variables globales.
6. Applications
Page 81
Chapitre 6 : Les sous-algorithmes
Analyse et méthode
On sait que rechercher les racines d’un polynôme du second degré conduit :
− soit à résoudre une équation du second degré (si le premier coefficient du polynôme est
non nul) ;
− soit à résoudre une équation du premier degré (si le premier coefficient du polynôme est
nul).
On a alors besoin d’un autre sous-algorithme qui aura pour tâche d’appeler secondDegre ou
premierDegre selon la valeur du premier coefficient. Soit rechercherRacines ce
sousalgorithme.
L’algorithme principal récupère de l’utilisateur trois nombres qu’il va transmettre à chacun des
sous-algorithmes.
Le sous-algorithme premierDegre a pour rôle de résoudre une équation du premier degré. Les
coefficients de l’équation doivent lui être fournis par l’algorithme principal ou par le
sousalgorithme rechercherRacines. Ces coefficients lui sont transmis via ses paramètres
formels. Puisque le sous-algorithme premierDegre reçoit deux nombres réels, alors il a besoin
de deux paramètres formels de type réel.
D’où son en-entête complet : Procédure premierDegre (p : réel, q : réel).
Le sous-algorithme secondDegre a pour rôle de résoudre une équation du second degré. Les
coefficients de l’équation doivent lui être fournis par le sous-algorithme rechercheRacines. Ces
coefficients lui sont transmis via ses paramètres formels. Puisque le sous-algorithme
Page 82
Chapitre 6 : Les sous-algorithmes
secondDegre reçoit trois nombres réels, alors il a besoin de trois paramètres formels de type
réel. D’où son en-entête complet : Procédure secondDegre (p : réel, q : réel, r : réel).
L’algorithme principal récupère de l’utilisateur trois nombres qu’il transmet à chacun des
sousalgorithmes. Ces nombres sont stockés dans des variables déclarées dans l’algorithme
principal.
Ces variables sont donc des variables globales.
Les variables nbre1, nbre2 et nbre3 sont alors des variables globales de type réel.
Il est plus intéressant de déclarer les variables min, max, delta, sol1 et sol2 dans les procédures
où elles seront nécessaires. Ce sont alors des variables locales.
Algorithme AlgoModulaire //
déclaration des procédures
Procédure minimum (x : réel, y : réel, z : réel)
maximum (x : réel, y : réel, z : réel)
premierDegre (p : réel, q : réel) secondDegre
(p : réel, q : réel, r : réel) rechercherRacines
(e : réel, f : réel, g : réel)
// déclaration des variables globales
Var nbre1, nbre2, nbre3 : réel Début
écrire ("Un peu de maths") écrire
("Saisie des nombres…")
écrire ("Donnez le premier nombre : ")
lire (nbre1)
écrire ("Donnez le deuxième nombre : ")
lire (nbre2)
écrire ("Donnez le troisième nombre : ")
lire (nbre3)
écrire ("Résultats des différents traitements")
Page 83
Chapitre 6 : Les sous-algorithmes
Page 84
Chapitre 6 : Les sous-algorithmes
FinSi
Sinon écrire ("La solution est ", (-q/p))
FinSi
Fin
Remarques
Page 85
Chapitre 6 : Les sous-algorithmes
nbre1 et e soient du même type, nbre2 et f soient du même type, et, nbre3
et g soient du même type ;
la valeur stockée dans nbre1 soit copiée dans e, la valeur stockée dans
nbre2 soit copiée dans f, et, la valeur stockée dans nbre3 soit copiée dans g.
On ne déclare pas les paramètres formels qui permettent de recevoir les contenus respectifs
des paramètres effectifs. Mais leurs types respectifs doivent être obligatoirement indiqués
dans l’en-tête de la procédure.
Écrire un algorithme qui, à partir de la saisie d’un mot, détermine, selon le choix de l’utilisateur
:
− son nombre de voyelles ;
− ou son anagramme renversée.
Analyse et méthode
Des variables pourront être déclarées dans les procédures si cela est nécessaire. Ces variables
sont des variables locales.
Page 86
Chapitre 6 : Les sous-algorithmes
Soit g un nombre réel et n un nombre entier naturel, proposer un algorithme qui calcule g × n!
Analyse et méthode
En résumé …
Page 87
Chapitre 6 : Les sous-algorithmes
1. Définition
Une fonction est une procédure particulière qui génère un seul résultat.
Elle possède deux propriétés fondamentales :
le résultat généré est directement exploitable dans une instruction ;
la fonction est elle-même le résultat généré.
Fonction < nomFonction > (< liste des paramètres formels > avec leurs types respectifs) : type du résultat
La description (ou écriture ou définition) d’une fonction se fait hors des limites de
l’algorithme appelant selon la syntaxe générale ci-dessous :
Le résultat de la tâche de la fonction est stocké dans la variable r. Ce résultat est transmis à
l’algorithme appelant par l’instruction retourner (r), retourner étant une primitive. On dit
que r est la valeur de retour. La fonction étant elle-même le résultat, alors elle est du type
de r. Le type du résultat est le type de la valeur de retour.
Le résultat est une valeur de type simple (entier, réel, caractère, chaînes de caractères,
booléen).
une instruction
simple − affichage ; − ou
affectation.
Page 88
Chapitre 6 : Les sous-algorithmes
Cependant avec les fonctions, puisque la fonction retourne un seul résultat et qu’elle est
ellemême cette valeur de retour, alors on n’a pas besoin de variable globale dédiée au retour
du résultat.
6. Applications
Exercice d’application 1
Écrire un algorithme qui calcule puis affiche le carré et le cube de tout nombre saisi au
clavier. Par exemple : on saisit 2, l’algorithme affiche 4 et 8.
Analyse et méthode
Les fonctions carre et cube reçoivent chacune un nombre réel en paramètre et retournent
chacune un nombre réel. Ces fonctions sont donc de type réel.
D’où leurs en-têtes complets :
Fonction carre (x : réel) : réel et Fonction cube (x : réel) : réel
Page 89
Chapitre 6 : Les sous-algorithmes
Algorithme CarreEtCube
Fonction carre (x : réel) : réel
cube (x : réel) : réel
Var nbre : réel
Début
écrire ("Calcul du carré et du cube d’un nombre")
écrire ("Donnez un nombre : ")
lire (nbre)
écrire ("Le carré de", nbre, " est : ", carre (nbre), " et son cube est : " cube (nbre))
Fin
Autre possibilité
Dans l’algorithme précédent, la fonction Carre est appelée deux fois sur le même nombre. On
peut améliorer cet algorithme en utilisant la fonction Carre une seule fois :
Algorithme CarreEtCube2
Fonction carre (x : réel) : réel
Var nbre, temp : réel
Début
écrire ("Calculer le carré et le cube d’un nombre")
écrire ("Donnez un nombre : ")
lire (nbre)
temp ← carre (nbre)
écrire ("Le carré de", nbre, " est : ", temp, " et son cube est : ", nbre*temp)
Fin
Page 90
Chapitre 6 : Les sous-algorithmes
Analyse et méthode
L’opération nécessite l’utilisation d’un vecteur pour récupérer les nombres à traiter. On
utilisera la fonction rechercherMini pour rechercher le minimum, et la fonction
rechercherMaxi pour rechercher le maximum. Ces fonctions reçoivent chacune en paramètre
un vecteur de type réel, puis elles retournent chacun un nombre. Puisqu’elles retournent un
nombre de type réel alors elles sont de type réel. D’où leurs en-têtes respectifs : Fonction
rechercherMini (V [1:10] : tableau de réel) : réel et Fonction rechercherMaxi (V [1:10] :
tableau de réel) : réel.
Analyse et méthode
Page 91
Chapitre 6 : Les sous-algorithmes
1. Exemple introductif
En mathématiques, il existe deux méthodes pour calculer la factorielle d’un entier naturel n.
Si n = 0 ou n = 1, alors n! = 1
Sinon n! = n × (n -1) × (n -2) × … × 2 × 1 = 1 × 2 × … × (n - 2) × (n - 1) × n.
Ainsi : 5! = 5 × 4 × 3 × 2 × 1 = 1 × 2 × 3 × 4 × 5 = 120.
Les algorithmes mettant en œuvre cette méthode utilisent des boucles. Ce sont des
algorithmes itératifs.
Si n = 0 alors n! = 1
Sinon n! = n × (n - 1)!
Or : (n-1)! = (n-1) × (n-2)! avec (n-2)! = (n-2) × (n-3)! et ainsi de suite jusqu’à 0!
Donc :
Calculer la factorielle d’un entier naturel revient à multiplier cet entier naturel par la
factorielle de son précédent : on utilise une factorielle pour calculer une factorielle.
Ainsi : 5! = 5 × 4!
= 5 × (4 × 3!)
= 5 × [4 × (3 × 2!)]
= 5 × [4 × [3 × (2 × 1!)]]
= 5 × [4 × [3 × [2 × (1 × 0!)]]]
= 5 × [4 × [3 × [2 × (1 × 1)]]]
=5×4×3×2×1
5! = 120
Chaque étape demande le calcul d’une autre factorielle. On doit alors écrire un algorithme de
calcul de factorielle qui va s’appeler lui-même : c’est un algorithme récursif.
Page 92
Chapitre 6 : Les sous-algorithmes
2. Définitions
3. L’intérêt de la récursivité
La récursivité est un puissant outil algorithmique (et mathématique où elle est désignée par le
terme récurrence) qui permet de décomposer un problème en plusieurs problèmes de même
nature mais sur des données plus petites.
Elle est très adaptée à la résolution de certains problèmes n’appartenant pas forcément au
domaine des mathématiques (par exemples : la recherche d’un élément dans un tableau trié, le
jeu des Tours de Hanoï).
Page 93
Chapitre 6 : Les sous-algorithmes
Remarque
Le terme algorithme récursif fait référence aux sous-algorithmes récursifs, c’est-à-dire aux
procédures récursives et fonctions récursives. Toutefois, dans la suite du livre, on ne traitera
que des fonctions récursives, ces dernières étant plus utilisées que les procédures récursives.
Écrire une fonction récursive est délicat. Il faut suivre rigoureusement certaines règles :
Le problème doit être décomposable en problèmes de même nature sur des données plus
petites.
Il faut déterminer la (ou les) condition d’arrêt (ou cas de base) afin de définir le (les) cas pour
lequel la fonction ne s’appelle pas elle-même. Si on ne définit pas la (les) condition(s) d’arrêt,
la fonction ne terminera pas, c’est-à-dire que la fonction s’appellera indéfiniment. Une
condition d’arrêt provoque l’arrêt des appels récursifs.
Il faut déterminer la (les) condition(s) de continuité (ou cas inductif) afin de définir le (les) cas
pour lequel la fonction s’appelle elle-même.
Une condition de continuité provoque un appel récursif.
Dans le corps de la fonction récursive, on écrit l’instruction (ou les instructions) contenant le
(les) cas de base avant celle(s) contenant le (les) cas inductif(s).
Chaque appel récursif doit "se rapprocher" d’un cas de base de sorte à favoriser la
terminaison de la fonction.
Techniquement, on utilise la fonction que l’on n’a pas encore écrite en supposant qu’elle
donne déjà un résultat. Une fonction récursive se compose de deux parties :
− la (les) condition(s) d’arrêts des appels récursifs : dans cette partie les valeurs à
déterminer sont directement connues ;
− un (des) appel(s) récursif(s).
Page 94
Chapitre 6 : Les sous-algorithmes
Fonction frecursiv (liste des paramètres formels avec leurs types) : type de la valeur de retour
Début
Si (condition d’arrêt)
Alors retourner (r) // valeur de retour de la condition d’arrêt
Sinon retourner (frecursiv (liste des nouveaux paramètres))
FinSi
Fin
L’instruction contenant l’appel récursif peut se présenter sous deux formes telles que :
• la fonction récursive retourne, sans aucun autre calcul, la valeur obtenue par
son appel récursif. On parle alors de récursivité terminale.
• la fonction récursive retourne, après un autre calcul, la valeur obtenue par son
appel récursif. On parle alors de récursivité non terminale.
Exemple : l’appel récursif de la fonction de calcul de la factorielle d’un nombre.
7. Applications
Écrire une fonction qui calcule la factorielle d’un entier naturel n selon la formule de
récurrence n! = n × (n-1)! sachant que 0! = 1.
Analyse et méthode
Donc : la fonction peut être écrite sous forme récursive avec pour cas de base : n = 0, et pour
cas inductif : n ≥ 1.
Page 95
Chapitre 6 : Les sous-algorithmes
La fonction récursive retourne la valeur obtenue par son appel récursif après un autre calcul
(n*factorielle (n - 1)). Cette fonction est alors une fonction récursive non terminale.
Écrire une fonction qui calcule le terme de la suite Fn de Fibonacci pour le nombre n sachant
que, n étant un entier naturel :
si n = 0 ou n = 1 alors Fn = n
si n > 1 alors Fn = Fn – 1 + Fn –2.
Étant donné les entiers naturels 𝑚𝑚 et 𝑛𝑛, on définit la fonction d’Ackermann 𝐴𝐴(𝑚𝑚, 𝑛𝑛)
par :
𝐴𝐴(𝑚𝑚, 𝑛𝑛)=𝐴𝑚𝑚− 1; 𝐴𝐴(𝑚𝑚 ; 𝑛𝑛− 1) 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑚𝑚 > 0 𝑒𝑒𝑒𝑒 𝑛𝑛 > 0
𝐴𝐴(0, 𝑛𝑛) = 𝑛𝑛 + 1 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑛𝑛 > 0
𝐴𝐴(𝑚𝑚, 0) = 𝐴𝐴(𝑚𝑚− 1 ; 1) 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑚𝑚 > 0
On suppose que l’on ne connait que la parité du nombre 0 (0 est un nombre pair). Alors pour
tester la parité de tout entier naturel n, on utilise les fonctions pair et impair telles que définies
ci-dessous :
Page 96
Chapitre 6 : Les sous-algorithmes
Page 97
Chapitre 6 : Les sous-algorithmes
CHOIX DU SOUS-ALGORITHME
On utilisera :
Pour s’entrainer…
Écrire un algorithme qui affiche le plus grand d’un ensemble de 10 nombres s’il est pair.
Page 98
Chapitre 6 : Les sous-algorithmes
Soit les fonctions numériques 𝑓𝑓, 𝑔𝑔 et ℎ définies sur l’intervalle 𝐷𝐷 = ]−∞ ; 1/2] ∪ [1 ;
+∞[
par 𝑓𝑓(𝑥𝑥) = 2𝑥𝑥2 − 3𝑥𝑥 + 1, 𝑔𝑔(𝑥𝑥) = √2𝑥𝑥2 − 3𝑥𝑥 + 1 et ℎ(𝑥𝑥) = 𝑓𝑓(𝑥𝑥) + 𝑔𝑔(𝑥𝑥).
x étant un réel non nul et k un entier relatif non nul, on veut calculer xk. Écrire
un algorithme qui effectue ce calcul.
Écrire un algorithme qui affiche les nombres premiers d’un intervalle d’entiers naturels,
l’intervalle étant défini par l’utilisateur.
Écrire un algorithme qui, à la saisie d’un nombre premier, d’abord génère le nombre de
Mersenne correspondant, et ensuite vérifie si le nombre de Mersenne obtenu est aussi premier.
Page 99
Chapitre 6 : Les sous-algorithmes
Indications
L’anagramme renversée d’un mot est le mot (ayant un sens ou non) obtenu par
renversement de l’ordre des lettres de ce mot.
Par exemples : L’anagramme renversée de tracé est écart.
Celle de nacre est ercan.
Un mot palindrome est un mot qui garde le même sens lorsqu’il est lu de
gauche à droite ou de droite à gauche. Par exemples : non, sas, radar.
Page 100