SIMAC1121 - Algorithmique - Supp1)
SIMAC1121 - Algorithmique - Supp1)
Licence 1
LSIMAC1121 - Algorithmique
Juin 2021
©
+221 76 600 79 40
[email protected]
Préliminaires
Préliminaires
1 - Organisation pédagogique
➢ Pôle : Sciences, Technologies et Numérique
➢ Domaine : Sciences et Technologies
➢ Mention : Sciences Informatiques et Mathématiques de la Cybersécurité
➢ Spécialité :
➢ Cycle : Licence
➢ Niveau : 1
➢ Semestre : 1
2 - Unité d’enseignement
➢ Code : LSIMAC112
➢ Intitulé : Algorithmique et Programmation 1
➢ Crédit : 6
3 - Elément constitutif
➢ Code : LSIMAC1121
➢ Intitulé : Algorithmique
➢ Poids de l’EC au sein de l’UE : 50%
➢ Statut : Obligatoire
➢ Nombre de séquences : 6
➢ Nombre d’objectifs généraux : 12
➢ Nombre d’objectifs spécifiques : 23
➢ Durée : 3 semaines
➢ Version : 1.0
➢ Date de création ou de mise à jour : Juin 2021
4 - Charge de travail
➢ Volume horaire total : 60 heures
➢ Apprentissage supervisé : 36 heures
➢ Travail Personnel de l’Etudiant : 24 heures
➢ Tutorat : 20 heures
➢ Durée apprentissage par semaine :
5 - Modalités
➢ Spatiale : A distance
➢ Temporelle : Mixte (synchrone et asynchrone)
➢ Collaborative : Travail individuel
6 - Objectifs généraux
➢ Connaitre la notion d’algorithmique
➢ Connaitre les étapes de résolution informatique d’un problème
➢ Comprendre la structure générale d’un algorithme
➢ Connaître les différents types élémentaires (prédéfinis ou de base) de données
➢ Savoir déclarer les constantes et variables
➢ Connaître les instructions d’entrée et sortie
➢ Comprendre l’utilisation des structures de contrôle
➢ Comprendre l’utilisation des structures itératives
➢ Savoir manipuler les données dans un tableau
➢ Savoir trier les données contenues dans un tableau
➢ Comprendre l’intérêt du tri des données
➢ Savoir décomposer ou modulariser un algorithme
7 - Mots-clés
Algorithme, type de données, variable, constante, structure alternative, structure
itérative, tableau, enregistrement, tri des données, module, procédure, fonction, paramètre,
argument, récursivité.
8 - Prérequis
➢ Réaliser les opérations arithmétiques
➢ Réaliser les opérations logiques
➢ Evaluer les opérations de comparaison
➢ Décrire un système informatique
9 - Test d’entrée
Voir fichier joint des travaux dirigés
10 - Mots-clés
Algorithme, type de données, variable, constante, structure alternative, structure
itérative, tableau, enregistrement, tri des données, module, procédure, fonction, paramètre,
argument, récursivité.
11 - Références Bibliographiques
[1] Christophe Dabancourt, Apprendre à programmer : Algorithmes et conception objet,
Edition Eyrolles, 2008, https://international.scholarvox.com/reader/docid/40001066/page/1
12 - Déroulement de l’apprentissage
Séquences pédagogiques Objectifs pédagogiques
(%) Seuil Durée
N° Titre Durée Code Intitulé
Validation (Heure)
O11 Décrire la notion d’algorithmique 75 1
6 heures
de tri dans un
4 O42 Ecrire des algorithmes de tri 60 32
tableau de
dimension 1
O43 Analyser l’intérêt du tri des données 70 36
Les
5
enregistrements
O52 Utiliser un enregistrement 60 60
3 jours 6 heures
Identifier les paramètres d'une fonction,
Les algorithmes O62 60 24
leurs catégories et portées
6 procéduraux ou
Différencier les modes de passage d’un
modulaires O63 60 24
paramètre à un module
O64 Ecrire des modules récursifs 40 12
6 séquences 21 478
23 objectifs spécifiques
pédagogiques jours heures
14 - Consignes de travail
➢ Faites le Test d’entrée ; en principe vous devez avoir un score de 80% pour pouvoir
continuer mais cette contrainte n’est pas prise en compte.
➢ Le cours est organisé par objectifs qui s’afficheront dès que vous aurez atteint l’objectif
courant
➢ Au sein du cours, vous avez des questions posées sous forme de Test ; il faudra aller
dans le forum pour y répondre
➢ Dans chaque objectif, il faut d’abord lire le cours, ensuite la vidéo et enfin les exercices
➢ Le tout premier exercice de chaque objectif est un Test de connaissance auquel votre
note doit être égale à au moins à 80%. Vous la possibilité de reprendre le test jusqu’à
obtenir les 80% sinon vous ne pouvez pas progresser dans votre apprentissage
➢ Les autres exercices sont des exercices de production classiquement appelé Travaux
Dirigés. Vous devez déposer votre solution pour progresser
➢ Tous les exercices ne sont pas obligatoires et le système vous donnera progressivement
les conditions d’accès à un exercices. Je vous recommande de faire le maximum !
➢ Vous aurez des séances de travail synchrone avec un tuteur pour des explications en
direct
Préliminaires _________________________________________________________ i
1 - Organisation pédagogique _______________________________________________________i
2 - Unité d’enseignement __________________________________________________________i
3 - Elément constitutif _____________________________________________________________i
4 - Charge de travail ______________________________________________________________i
5 - Modalités i
6 - Objectifs généraux ____________________________________________________________ ii
7 - Mots-clés ii
8 - Prérequis ii
9 - Test d’entrée ________________________________________________________________ ii
10 - Mots-clés ii
11 - Références Bibliographiques ___________________________________________________ ii
12 - Déroulement de l’apprentissage ________________________________________________ iii
13 - Graphe de précédences entre les objectifs ________________________________________ iv
14 - Consignes de travail __________________________________________________________ iv
15 - Table des matières ___________________________________________________________ v
Séquence 1 : La notion
d’algorithme
1 - Problématique
De par sa définition, l’informatique est la science de traitement automatique de
l’information par l’ordinateur. Or de base, l’ordinateur n’est qu’un amas de composants
(électroniques ou mécaniques) démuni d’une capacité de traitement de l’information. Pour que
l’ordinateur en soit capable, il faut y installer des logiciels (programmes) pour la réalisation de
différents traitements (opérations ou travaux). En fait l’ordinateur ne sait faire que ce qu’on lui
a appris. Son apprentissage consiste à lui installer autant de logiciels que de travaux que vous
voulez qu’il réalise. Par exemple, mon ordinateur n’est pas capable de faire un montage vidéo
car je ne le lui ai pas appris ou en d’autres termes car je n’ai pas installé un logiciel de montage
vidéo. Par contre mon ordinateur sait faire du traitement de texte puisqu’il est doté du logiciel
Microsoft Word.
Jusqu’à présent, lorsque vous avez besoin des logiciels pour réaliser des tâches
particulières, vous les achetez, téléchargez ou copiez chez des tiers (amis, parents, …) que vous
installez dans votre ordinateur. Vous êtes-vous déjà posés les questions suivantes :
1 - Comment produire des logiciels ?
2 - Puis-je produire mon propre logiciel ?
3 - Que contiennent les logiciels ?
4 - Comment fonctionnent les logiciels ?
2 - Définitions
Un algorithme est la spécification précise et non ambiguë d’une séquence d’étapes,
formée d'un nombre fini d'opérations, pouvant être exécutée de façon automatique par un
ordinateur.
Un algorithme est une suite finie d’instructions ordonnées permettant de résoudre un
problème précis.
Un algorithme est une suite de règles opératoires à appliquer dans un ordre déterminé
à un nombre fini de données afin d’effectuer un calcul numérique en un nombre fini d’étapes.
Un algorithme est un ensemble de règles opératoires dont l’application permet de
résoudre un problème donné au moyen d’un nombre fini d’opérations.
L’algorithmique est la science qui étudie les algorithmes.
L’algorithmique est l’étude de la résolution de problèmes par la mise en œuvre des
suites d’opérations élémentaires selon un processus défini aboutissant à une solution.
3 - Propriétés
Un algorithme doit :
➢ avoir un nombre fini d’étapes ;
➢ avoir un nombre fini d’opérations par étape ;
➢ se terminer après un nombre fini d’opérations ;
➢ fournir un résultat ;
➢ avoir chacune des opérations définie rigoureusement, non ambiguë et effective c’est-
à-dire réalisable par une machine ;
➢ être déterministe c’est-à-dire appliquer sur les mêmes données, il produit toujours la
même suite d’opérations et fournit donc toujours le même résultat ;
➢ être en générale indépendant du langage de programmation à utiliser plus tard
4 - Complexité
L’exécution d’un algorithme sur un ordinateur consomme des ressources :
➢ en temps de calcul : complexité temporelle
➢ en espace-mémoire occupé : complexité spatiale
Un algorithme "hors du possible" a une complexité temporelle et/ou spatiale qui rend
son exécution impossible.
Exemple : Jeu d’échec par recherche exhaustive de tous les coups possibles
On a 1019 possibilités Si chaque possibilité est calculée en 1 milliseconde alors il faudra
plus de 300 millions d’années pour rechercher le meilleur coup.
Algorithme nom_algorithme ;
Début
Instruction(s) ;
Fin.
2 - Le langage algorithmique
L’un des premiers langages fut l’organigramme (algorigramme ou logigramme) qui est
une représentation graphique avec des formes (rectangle, losange, point, flèche, …) des
différentes actions à mener pour obtenir la solution aux problèmes posés. L’organigramme a
été abandonnée car elle n’est pas pratique pour de grands algorithmes (organigramme trop
gigantesque). De plus, l’organigramme favorise la programmation non structurée qui est un
type de programmation non recommandé.
Le langage algorithme utilisé généralement est une série de conventions appelée
« pseudo-code » qui ressemble à un langage de programmation à la différence que la plupart
des spécificités (syntaxe) des langages de programmation y sont épurées. Le langage sera appris
au fur et à mesure que nous progresserons dans le cours. Je tiens à signaler d’un enseignant ou
d’un ouvrage à un autre, le langage algorithmique peut différer légèrement. C’est normal car
l’algorithme est écrit pour formaliser l’écriture des instructions la solution au problème posé et
non destiné à être exécuté par un ordinateur.
NB : En général, les enseignants enseignent l’algorithme avec des syntaxes proches du
langage de programmation qui sera utilisé.
Séquence 2 : Les
éléments d’un algorithme
Pour produire un algorithme résolvant un problème, il faut en général des objets. Par
exemple pour écrire un algorithme permettant de calculer la surface d’un rectangle, il faut 3
objets dont le premier contiendra la longueur, le deuxième contiendra la largeur et le troisième
contiendra la surface. Chaque objet appartient un type bien précis. Il existe plusieurs types
élémentaires de données. Un type élémentaire est un type de base qui est différent d’un type
complexe qui est obtenu de la composition des types élémentaires et/ou des types complexes.
1 - Le type booléen
Un booléen appartient à un ensemble contenant que 2 valeurs possibles : VRAI et
FAUX.
Les opérations réalisables sur des valeurs de tels types sont des opérations logiques dont
les opérateurs sont OU, ET, NON, …
OU VRAI FAUX ET VRAI FAUX NON
VRAI VRAI VRAI VRAI VRAI FAUX VRAI FAUX
FAUX VRAI FAUX FAUX FAUX FAUX FAUX VRAI
Table 1 : Table logique de Table 2 : Table logique de Table 3 : Table logique
l’opérateur OU l’opérateur ET de l’opérateur NON
Ce type est généralement utilisé pour évaluer les conditions. Par exemple, pour calculer
la racine carrée d’un nombre dans l’ensemble des réels, il faut d’abord s’assurer que le nombre
est positif ; donc le calcul sera possible si la condition « Est-ce le nombre est positif ? » à la
valeur de vérité VRAI.
2 - Le type numérique
Ce type comporte 2 sous-types à savoir les entiers et les réels :
➢ Un entier appartient à l’ensemble des entiers relatifs (ℤ) qu’il ne faut pas confondre
avec l’ensemble des entiers naturels (ℕ).
➢ Un réel appartient à l’ensemble des nombres réels (ℝ).
Quelques opérations réalisables sur des valeurs de tels types sont les opérations
arithmétiques et trigonométriques.
3 - Le type alphanumérique
Ce type comporte 2 sous-types à savoir les caractères et les chaînes de caractères :
➢ Un caractère est soit une lettre (a, b, …, z, A, B, …, Z), un signe de ponctuation (., ;, /,
\, ?, !, …), un espace, un caractère spécial ($, €, #, @, &, §, £ …), un chiffre (0, 1, …, 9)
et autres contenue entre simple côtes ('). Par exemple, le caractère '1' ou le caractère
'p' ou le caractère 'ç'.
➢ Une chaîne de caractères est une succession de caractères contenue entre simples
côtes ('). Par exemple, la chaîne 'algorithmique 1'. En algorithmique, nous
supposerons que la chaîne peut avoir une longueur infinie ce qui n’est pas vrai dans la
réalité. La longueur maximale de la chaîne sera définie dans un cours de
programmation en fonction du langage utilisé.
Quelques opérations réalisables sur des valeurs de tels types sont la concaténation, le
calcul de la longueur d’une chaîne de caractères, l’insertion, la suppression, la modification, la
position, le nombre d’occurrences d’une sous-chaîne dans une chaîne.
Un caractère est représenté dans l’ordinateur par son code ASCII1 (American Standard
Code for Information Interchange) qui est le codage des caractères.
Pour représenter un caractère vide ou une chaîne de caractères vide, il ne faut rien mettre
entre les côtes ('').
1
http://www.table-ascii.com/
1 - Notion d’objet
L’algorithme manipule des objets pour aboutir à la solution au problème. Ces objets
représentent d’une part des données du problème et d’autre part, les données de la solution.
Tout objet est caractérisé par :
➢ Son identificateur est une suite de caractères alphanumériques commençant
obligatoirement par une lettre ou le caractère blanc souligné ou tiret-bas ou caractère de
soulignement (_). Le choix de l’identificateur ne dépend que de l’algorithmicien
(programmeur) mais il est fortement recommandé de choisir un identificateur en rapport
avec la sémantique de ce qu’il représente. Par exemple pour définir un identificateur
devant contenir l’âge des étudiants, il est préférable d’utiliser l’identificateur
age_etudiant qu’un identificateur qui ne veut rien dire du tout comme X ou Y.
➢ Son type qui détermine l’ensemble des valeurs possibles.
➢ Sa valeur représente le contenu et est une constante appartenant à l’ensemble de valeurs
du type. On verra plus loin que la valeur d’un objet peut être un objet mais
indirectement, ça sera toujours une constante.
NB : Un objet de type élémentaire possède à tout moment une et une seule valeur.
1 - L’affectation
L’affection est une opération qui consiste à attribuer une valeur (contenu) à une variable
(conteneur). Son opérateur est le signe utilisé ainsi :
identificateur valeur ;
Exemple : Pour affecter la valeur 10 à la variable A, il faut écrire A 10 ;
Pour que l’affectation soit possible, il faut que la valeur ou la variable affectée soit de
même type ou le type de la valeur soit inclut dans le type de la variable (Exemple Entier et réel
ou caractère et chaîne de caractères).
A la place de la valeur, il est possible d’affecter une autre variable ou une constante ou
une expression (arithmétique, trigonométrique, …) sous réserve de la compatibilité des types.
Après affectation, la variable ayant reçu l’affection contiendra la valeur de la variable ou de la
constante ou le résultat de l’expression affectée.
Exemple :
A 8 ; La valeur A vaut la valeur 8
B A ; La valeur de B vaut 8 car B a reçu la valeur contenue dans A
C 15 ; La valeur C vaut la valeur 15
D C + B ; La valeur de vaut 23
A D * 2 ; A perd la valeur 8 pour la nouvelle qui est 46
5 - Autres opérations
La concaténation dont l’opérateur est &, permet de coller 2 chaînes de caractères.
Exemple : 'Université' & 'Publique' donnera 'UniversitéPublique'
A
6.2 - La lecture des données
La lecture est l’opération qui permet à l’ordinateur de prendre les données via le clavier ;
ainsi l’utilisateur entre les données dans l’ordinateur. Son opérateur est lire() s’utilisant ainsi :
Lire(A) ; à condition que A soit une variable
La lecture d’une variable A peut-être matérialisée comme l’affectation à la variable A,
ce qui vient d’un utilisateur.
A
La lecture des données est une action bloquante jusqu’à ce que l’utilisateur saisisse la
donnée et la valide en appuyant sur le bouton « entrée ou Enter » du clavier.
1 - Notion d’instruction
Une instruction est une commande (action à exécuter) qu’on passe à l’ordinateur dont
l’exécution produira un résultat.
En algorithmique, chaque instruction est terminée par un point-virgule à l’exception de
quelques qui seront précisées au et à mesure qu’on les verra.
Exemples
Instruction de déclaration de la variable Université comme chaîne de caractères
Variable Universite : chaine ;
Instruction d’affection de la chaîne de caractères UVS à la variable Université
Universite 'UVS' ;
Instruction de lecture du nom d’une universté
Lire(Universite) ;
Instruction de calcul et d’affectation dans la variable S, la surface d’un cercle de rayon
9
S 3.14 * 9 * 9 ;
Instruction d’affichage de la surface d’un cercle de rayon 9
Ecrire('La surface du cercle de rayon 9 vaut ', S) ;
3 - Notion de commentaire
Quand vous lisez un livre, il arrive souvent que vous y fassiez des annotations à côté de
certains paragraphes. Ces annotations sont vos propres commentaires qui vous aideront à mieux
comprendre ce paragraphe ou à faire des liens avec d’autres paragraphes du même livre ou d’un
autre livre. Tout comme dans un livre, votre algorithme peut contenir des commentaires.
Un commentaire est une annotation que vous insérez dans votre algorithme pour faciliter
sa lecture et/ou sa compréhension.
Un commentaire doit être compris entre les accolades et peut être sur une ligne ou
plusieurs lignes.
Exemple : Algorithme d’addition de 2 entiers avec des commentaires
Algorithme Addition ; {Nom de l’algorithme}
Variable Nombre1, Nombre2, Somme : entier ; {Déclaration des variables}
Debut
Ecrire('Calcul de la somme de 2 entiers') ;
{Lecture des données}
Ecrire('Entrer le premier nombre') ;
Lire(Nombre1) ;
Ecrire('Entrer le second nombre') ;
Lire(Nombre2) ;
Somme Nombre1 + Nombre2 ; {Réalisation de l’opération
d’addition}
Ecrire('La somme des 2 nombres entiers vaut ', Sommes) ; {Affichage
du résultat}
Fin.
Dans l’algorithme ci-dessus, les commentaires sont en couleur rouge et permettent de
comprendre ce que j’ai fait à chaque étape. Il y a beaucoup de commentaires, juste pour vous
montrer comment insérer des commentaires et par conséquent, vous n’êtes pas tenus d’y mettre
autant de commentaire. Tout comme lorsque vous lisez un livre, les commentaires ne dépendent
que de vous !
Dans la vie, les tâches (actions) à réaliser ne se font pas de façon linéaire car certaines
sont soumises à des conditions. De même, dans la solution algorithmique d’un problème,
certaines instructions seront réalisées si des conditions sont satisfaites.
Exemple : Mauvais algorithme de la division de 2 entiers naturels
Algorithme Division ;
Variable Dividende, Diviseur : entier ;
Quotient : reel ;
Debut
Ecrire('Calcul du quotient de 2 entiers') ;
Ecrire('Entrer le Dividende') ;
Lire(Dividende) ;
Ecrire('Entrer le Diviseur') ;
Lire(Diviseur) ;
Quotient Dividende / Diviseur ; {Problème ! Le quotient n’est pas
toujours calculable }
Ecrire('Le quotient de ', Dividende, ,' sur ', Diviseur ', vaut ', Quotient) ;
Fin.
Cet algorithme ne produira pas de résultat si le dénominateur est nul. De ce fait, il fallait
réaliser la division en tenant compte de la condition de nullité du dénominateur.
Etant donné que chaque algorithme produit un résultat, quel résultat sera
produit si le diviseur est nul ?
Il existe 2 structures conditionnelles permettant de faire des contrôles.
1 - La structure conditionnelle « SI »
La structure de contrôle « SI » permet de teste une condition (booléenne) et si la
condition est respectée, les instructions qui suivent sont exécutées. Au cas où la condition n’est
pas respectée (fausse), les instructions qui suivent le « Sinon » seront exécuter.
Syntaxe
Si condition Alors
Instruction(s) ;
Sinon
Instruction(s) ;
FinSi ;
Exemple : Bon algorithme de la division de 2 entiers naturels
Algorithme Division ;
Variable Dividende, Diviseur : entier ;
Quotient : reel ;
Debut
Ecrire('Calcul du quotient de 2 entiers') ;
Ecrire('Entrer le dividende') ;
Lire(Dividende) ;
Ecrire('Entrer le diviseur ') ;
Lire(Diviseur) ;
Si Diviseur <> 0 Alors
Quotient Dividende / Diviseur ;
Ecrire('Le quotient de ', Dividende, ,' sur ', Diviseur', vaut ',
Quotient) ;
Sinon
Ecrire('Erreur ! La division n’est pas possible car le diviseur est
nul') ;
FinSi ;
Fin.
S’il y’a plusieurs conditions à combiner (avec des opérateurs logiques OU, ET et NON),
il est recommandé d’utiliser les parenthèses pour mieux formuler votre condition finale.
Attention : Il ne faut jamais mettre un point-virgule après « Alors » et « Sinon ».
Il est possible de ne pas avoir la partie « Sinon » en fonction de la solution au problème.
Exemple : Algorithme permettant de calculer et d’afficher la valeur absolue d’un
nombre
Algorithme ValeurAbsolue ;
Variable Nombre, Resultat : reel ;
Debut
Ecrire('Calcul de la valeur absolue d’un nombre') ;
Ecrire('Entrer le nombre') ;
Lire(Nombre) ;
Resultat Nombre ;
Si Nombre < 0 Alors
Resultat Resultat * (-1) ;
FinSi ;
Ecrire('La valeur absolue de ', Nombre, ' = ', Resultat) ;
Fin.
Syntaxe
Selon Que variable vaut
Cas Valeur_1 :
Instruction ;
Cas Valeur_2 :
Instruction ;
…
Cas Valeur_N :
Instruction ;
Sinon
Instruction ;
FinSelonQue ;
Exemple : Algorithme de lecture d’un d’entier naturel inférieur à 10 et affichage en lettre
Algorithme Chiffre_Vers_Lettres ;
Variable Nombre : entier ;
Debut
Ecrire('Ecriture en lettres d’un entier compris entre 0 et 9') ;
Ecrire('Entrer le nombre entier') ;
Lire(Nombre) ;
Selon que Nombre vaut
Cas 0 : Ecrire('zéro') ;
Cas 1 : Ecrire('un') ;
Cas 2 : Ecrire('deux') ;
Cas 3 : Ecrire('trois') ;
Cas 4 : Ecrire('quatre') ;
Cas 5 : Ecrire('cinq') ;
Cas 6 : Ecrire('six') ;
Cas 7 : Ecrire('sept') ;
Cas 8 : Ecrire('huit') ;
Cas 9 : Ecrire('neuf') ;
Sinon Ecrire('Le nombre saisi n’est pas un chiffre') ;
FinSelonQue ;
Fin.
Si dans un cas, il faut plusieurs instructions, il faut mettre un bloc d’instructions.
La partie « Sinon » peut être omise si elle n’est pas nécessaire.
Exemple : Lecture d’un entier ; si le nombre est positif et inférieur à 10 alors afficher en
lettres. S’il est positif et supérieur à 9 alors afficher le reste de la division par 9. S’il est négatif
alors afficher sa valeur absolue.
Algorithme Imbrication_strucures_conditonnelles ;
Variable Nombre, Resultat : entier ;
Debut
Ecrire('Entrer le nombre entier') ;
Lire(Nombre) ;
Si Nombre >=0 Alors
Si Nombre < 10 Alors
Selon que Nombre vaut
Cas 0 : Ecrire('zéro') ;
Cas 1 : Ecrire('un') ;
Cas 2 : Ecrire('deux') ;
Cas 3 : Ecrire('trois') ;
Cas 4 : Ecrire('quatre') ;
Cas 5 : Ecrire('cinq') ;
Cas 6 : Ecrire('six') ;
Cas 7 : Ecrire('sept') ;
Cas 8 : Ecrire('huit') ;
Cas 9 : Ecrire('neuf') ;
FinSelonQue ;
Sinon
Resultat = Nombre % 9 ;
Ecrire('Le reste de la division par 9 de ', Nombre, ' = ',
Resultat) ;
FinSi ;
Sinon
{Il est possible d’afficher un résultat sans le stocker dans une
variable}
Ecrire('La valeur absolue de ', Nombre, ' = ', -1*Nombre) ;
FinSi ;
Fin.
Lors de la résolution d’un problème, il existe souvent des actions (instructions) qu’il
faut répéter un certain nombre de fois pour garantir la solution. Lors de la répétition, soit on sait
à l’avance le nombre de répétitions (itérations), soit on connait la ou les conditions de poursuite
ou d’arrêt de l’itération.
En algorithmique, il existe des structures itératives ou répétitives classiquement
appelées boucles pour réaliser la répétition des instructions.
1 - La boucle « Pour »
La boucle « Pour » est utilisée lorsqu’on connait à l’avance le nombre d’itérations à
faire. Par exemple, dans un problème de lecture de 100 nombres et affichage de leur moyenne,
on connait exactement le nombre de fois qu’on va lire le nombre, c’est 100 !
Syntaxe
Pour compteur Valeur_initiale à Valeur_finale faire
Instructions() ;
FinPour ;
A chaque itération, le compteur est incrémenté (ajouté) de 1.
Exemple : Algorithme de lecture, calcul et affichage de la moyenne de 100 entiers
Algorithme Moyenne_de_100_entiers ;
Variable Nombre, Compteur : entier ;
Moyenne : réel ; {La variable moyenne contiendra le résultat}
Debut
Moyenne 0 ; {Initialisation de la variable à 0 car 0 est l’élément
neutre de l’addition}
Pour compteur 1 à 100 faire
Ecrire('Entrer un nombre entier') ;
Lire(Nombre) ;
Moyenne Moyenne + Nombre ; {Addition des nombres lues
dans la variable Moyenne pour avoir la somme}
FinPour ;
Moyenne Moyenne /100 ; {Division de la somme des nombres lues
par 100 pour avoir la moyenne}
Ecrire('La moyenne des 100 nombres lus ', ' = ', Moyenne) ;
Fin.
Vous avez dû remarquer que nous n’avons pas déclarer 100 variables pour résoudre le
problème. Si certains pensent qu’ils peuvent déclarer 100 variables, que feront-ils lorsqu’il
s’agira des milliers voire millions de données ?
Syntaxe
Repeter
Instructions() ;
Jusqu’à condition ;
Exemple : Algorithme de lecture des nombres jusqu’à lecture d’un nombre négatif
Algorithme Lecture_suite_nombres_positifs ;
Variable Nombre : réel ; {Pour être général, il faut déclarer le nombre
comme un réel et non un entier}
Debut
Repeter
Ecrire('Entrer un nombre') ;
Lire(Nombre) ;
Jusqu’à Nombre < 0 ;
Fin.
Il est possible d’imbriquer n’importe quelle boucle dans n’importe quelle autre. De plus,
un algorithme écrit avec la boucle « Pour », peut être réécrit par avec la boucle « Tant Que » et
« Repeter … Jusqu’à » mais l’inverse est impossible. Pourquoi ?
Un algorithme écrit avec la boucle « Repeter … Jusqu’à » peut être réécrit avec la boucle
« Tant Que » et inversement.
Séquence 3 : La gestion
des données dans un
tableau
1 - Nécessité
Imaginez-vous un algorithme devant stocker les notes des étudiants puis faire des
opérations (moyenne, rang, classement, …). Comment feriez-vous s’il y a 500 étudiants ? Il est
presque impossible de déclarer 500 variables ! Si certains pensent qu’ils sont capables de faire
cet effort, que feront-ils lorsqu’il s’agira d’un problème avec des milliers voire des millions de
variables ?
Or les variables que nous avons manipulées jusqu’à présent ne peuvent contenir qu’une
valeur à la fois. Il est donc nécessaire d’avoir une variable pouvant contenir plusieurs valeurs à
la fois. Ce type de variable s’appelle tableau.
2 - Définition
Un tableau est une structure de données (type de données) permettant de stocker
plusieurs valeurs de même type de façon contiguë dans une seule variable.
Un tableau est caractérisé par :
➢ Sa borne inférieure : indice minimal ou numéro minimal du tableau
➢ Sa borne supérieure : indice maximal ou numéro maximal du tableau
➢ Sa dimension : nombre d’indices permettant d’accéder à l’une des valeurs du tableau
➢ Son type de données : type de données des valeurs devant être contenues dans le tableau
La taille du tableau est le nombre maximal de valeurs que le tableau peut contenir à la
fois et est obtenue selon la formule suivante :
Taille tableau = Borne supérieure – Borne inférieure +1
Bien qu’il soit possible de déclarer un tableau de taille 1, cela n’est pas pertinent.
3 - Déclaration
Exemple
Variable V1 : Tableau[1…90] de entier ;
V2 : Tableau[0...57] de reel ;
V3 : Tableau[-23...68] de chaine ;
3.2 - Tableau de dimension 2
Syntaxe
Variable NomVariable : Tableau[BorneInf1...BorneSup1, BorneInf2...BorneSup2] de TypeDonnees ;
Taille d’un tableau de dimension 2
Taille = (BorneSup1– BorneInf 1+1) x (BorneSup2– BorneInf2 +1)
Exemple
Variable M1 : Tableau[1...90, 1…60] de entier ;
M2 : Tableau[0...10, -7...65] de reel ;
M3 : Tableau[1...90, 1...60] de caractere ;
Donnez les déclarations d’une matrice carrée, d’une matrice uniligne et une
matrice unicolonne
3.3 - Tableau de dimension 3 ou plus
Syntaxe
Variable NomVariable : Tableau[BorneInf1 ... BorneSup1, BorneInf2 ... BorneSup2,
BorneInf3 ... BorneSup3] de TypeDonnees {Tableau de dimension 3}
Taille d’un tableau de dimension 2
Taille = (BorneSup1– BorneInf 1+1) x (BorneSup2– BorneInf2 +1) x (BorneSup3– BorneInf3 +1)
Exemple
Variable T : Tableau[1...20, 1...6, 1...35] de caractere ; {Tableau de dimension 3}
Q : Tableau[0…9, -7...5, 19...34, -11...-4] de reel ; {Tableau de dimension 4}
C : Tableau[-16…9, 21...56, -1...1, 0...17, 13...68] de booleen ; {Tableau de dimension 5}
3.4 - Déclaration de type de données
La déclaration d’un tableau est relativement longue. Pour éviter de répéter à tout
moment cette longue suite de caractères lors de la déclaration, il est possible de déclarer (créer)
un nouveau type de données basé sur le tableau.
La déclaration (création) d’un nouveau type de données (structure de données) se fait
avec le mot clé type selon la syntaxe suivante :
Type NomType = Tableau[BorneInf…BorneSup] de TypeDonnees ;
Parcourir un tableau revient à passer dans ses cases (toutes ou quelques-unes en fonction
de ce qu’on veut). Pour parcourir un tableau, même si sa taille est relativement faible, il faut
utiliser une boucle.
1 - Parcours en lecture
Le parcours en lecture consiste à lire des données et les mettre dans les différentes cases
du tableau.
Algorithme Lecture_Tableau_Diension_1 ;
Variable T = Tableau[31...89] de reel ;
Nombre : reel ;
i :entier ;
Debut
Ecrire('Lecture ou saisie des données dans le tableau') ;
Pour i 31 à 89 faire
Ecrire('Entrer un nombre réel') ;
Lire(Nombre) ;
T[i] Nombre ;
{Il est possible de combiner la lecture et l’affectation en une seule
instruction Lire(T[i])}
FinPour ;
Fin.
2 - Parcours en écriture
Le parcours en écriture consiste à afficher à l’écran les données contenues dans un
tableau.
Algorithme Affichage_Tableau_Diension_1 ;
Constante BorneInf = 23, BorneSup = 247
Type Vecteur = Tableau[BorneInf ... BorneSup] de reel ;
Variable V : Vecteur ;
Nombre : reel ;
i :entier ;
Debut
Ecrire('Affichage des données du tableau') ;
Pour i BorneInf à BorneSup faire
Nombre V[i] ;
Ecrire('La valeur à la position ', i, ' vaut ', Nombre) ;
{Il est possible de combiner l’affectation et l’affichage en une
seule instruction Ecrire(V[i])}
FinPour ;
Fin.
Debut
Ecrire('Recherche d’une valeur dans le tableau') ;
{On suppose que le tableau contient déjà des valeurs sinon, il faudra
les lire}
Ecrire('Donner la valeur à chercher') ;
Lire(ValeurCherchee) ;
Trouver Faux ; {Normal car on n’a pas trouvé puisqu’on n’a pas
encore commencé la recherche}
Debut
Ecrire('Comptage du nombre d’occurrences d’une valeur dans le
tableau') ;
{On suppose que le tableau contient déjà des valeurs sinon, il faudra
les lire}
Ecrire('Donner la valeur à compter ses occurrences') ;
Lire(Valeur) ;
Occurrence 0 ; {0 est l’élément neutre de l’addition. De plus on a
pas encore trouvé une occurrence}
Les vraies valeurs à considérer sont 4, 0, -9, et 5 contenues dans les cases de 1 à 4. Les
cases de 5 à 10 sont considérées comme vides
2.2 - Technique du tableau à « trou »
Dans cette technique, il est question de stocker dans les cases vides une valeur
particulière qui appartient au domaine de valeurs mais pas au domaine de définition. Cette
valeur particulière est appelée Trou et permet de repérer toutes les case vides.
Exemples
➢ Si nous avons un tableau d’âges des étudiants à gérer, nous pouvons choisir zéro (0)
comme trou car aucun étudiant ne peut avoir un âge nul.
25 0 0 35 0 0 23 63 0 0
1 2 3 4 5 6 7 8 9 10
Le tableau ci-dessus contient 4 valeurs et 6 cases vides
➢ Si nous manipulons un tableau de noms d’unités d’enseignement, nous pouvons choisir
la chaîne '+++' comme trou car nous sommes sûrs qu’aucune unité d’enseignement
n’aura ce nom.
Donnez d’autres exemples où le tableau peut ne pas être plein et préciser la
valeur du trou
Algorithme Recherche_Valeur_Dans_Tableau_Diension_1_Non_Plein ;
Constante N = 250 {Taille du tableau }
Type Vecteur = Tableau[1 ... N] de reel ;
Variable V : Vecteur ;
ValeurCherchee : reel ;
I, Taille :entier ;
Trouver :booleen ;
Debut
Ecrire('Recherche d’une valeur dans le tableau') ;
{On suppose que Taille a une valeur qui représente le nombre
d’éléments dans le tableau}
Ecrire('Donner la valeur à chercher') ;
Lire(ValeurCherchee) ;
Trouver Faux ;
Algorithme Recherche_Valeur_Dans_Tableau_Diension_1_Non_Plein ;
Constante N = 250 {Taille du tableau }
Type Vecteur = Tableau[1 ... N] de reel ;
Variable V : Vecteur ;
ValeurCherchee, Trou : reel ; {Dans cet algorithme, le Trou n’a
aucune importance}
i :entier ;
Trouver :booleen ;
Debut
Ecrire('Recherche d’une valeur dans le tableau') ;
{On suppose que Taille a une valeur qui représente le nombre
d’éléments dans le tableau}
Ecrire('Donner la valeur à chercher') ;
Lire(ValeurCherchee) ;
Trouver Faux ;
Algorithme Insertion_Valeur_Dans_Tableau_Diension_1_Non_Plein ;
Constante N = 250 {Taille du tableau }
Type Vecteur = Tableau[1 ... N] de reel ;
Variable V : Vecteur ;
Valeur : reel ;
i, Taille :entier ;
Debut
Ecrire('Insertion d’une valeur dans le tableau') ;
{On suppose que Taille a une valeur qui représente le nombre
d’éléments dans le tableau}
Si Taille = N Alors
Ecrire('Le tableau est plein !') ;
Sinon
Ecrire('Entrer la valeur à insérer') ;
Lire(Valeur') ;
Taille Taille + 1 ; {Augmentation du nombre de valeurs du
tableau}
V[Taille] Valeur ;
FinSi ;
Fin.
5.2 - Technique du tableau à « trou »
Il faut chercher le premier trou et y insérer la valeur.
Algorithme Insertion_Valeur_Dans_Tableau_Diension_1_Non_Plein ;
Constante N = 250 {Taille du tableau }
Type Vecteur = Tableau[1 ... N] de reel ;
Variable V : Vecteur ;
Valeur, Trou : reel ; {La valeur du Trou est définie en fonction du
problème}
i :entier ;
Trouver : booleen ;
Debut
Ecrire('Insertion d’une valeur dans le tableau') ;
{Recherche de la première case vide dans le tableau}
Trouver Faux ;
i1;
Tant Que (Non Trouver) ET (i <= N) faire
Si V[i] = Trou Alors
Trouver Vrai ;
Sinon
i i+1 ;
FinSi ;
FinTantQue ;
Si Trouver = Vrai Alors
Ecrire('Donner la valeur à insérer') ;
Lire(Valeur) ;
V[i] Valeur ;
Sinon
Ecrire('Le tableau est plein !') ;
FinSi ;
Fin.
Algorithme Suppression_Valeur_Dans_Tableau_Diension_1_Non_Plein ;
Constante N = 250 {Taille du tableau }
Type Vecteur = Tableau[1 ... N] de reel ;
Variable V : Vecteur ;
Valeur : reel ;
i, j, Taille :entier ;
Trouver : booleen ;
Debut
Ecrire('Suppression d’une valeur dans le tableau') ;
{On suppose que Taille a une valeur qui représente le nombre
d’éléments dans le tableau}
Si Taille > 0 Alors {La suppression n’a un sens que si le tableau est
non vide}
Ecrire('Entre la valeur à supprimer') ;
Lire(Valeur') ;
{Recherche de la valeur à supprimer}
Trouver Faux ;
i1;
Tant Que (Trouver = Faux) ET (i<=Taille) faire
Si V[i] = Valeur Alors
Trouver Vrai ;
Sinon
i i+1 ;
FinSi ;
FinTantQue ;
Si Trouver Alors
{La valeur existe et se trouve à la position i. Il faut décaler
la valeur de la position i+1 à la positon i ; ensuite décaler
celle de la position i+2 à la position i+1 ; ainsi de suite
jusqu’à la case Taille}
Pour j i à Taille-1 faire
V[j] V[j+1] ;
FinPour ;
Taille Taille – 1 ; {Diminution de la Taille du tableau}
FinSi ;
FinSi ;
Fin.
6.2 - Technique du tableau à « trou »
Il faut rechercher l’élément à supprimer dans le tableau. S’il existe il faut insérer la
valeur du Trou à sa position.
Algorithme Suppression_Valeur_Dans_Tableau_Diension_1_Non_Plein ;
Constante N = 250 {Taille du tableau }
Type Vecteur = Tableau[1 ... N] de reel ;
Variable V : Vecteur ;
Valeur : reel ;
Trou : reel ;
i, j : entier ;
Trouver : booleen ;
Debut
Ecrire('Suppression d’une valeur dans le tableau') ;
{On suppose que les cases vides du tableau contiennent la valeur du
Trou}
Ecrire('Entre la valeur à supprimer') ;
Lire(Valeur') ;
{Recherche de la valeur à supprimer}
Trouver Faux ;
i1;
Tant Que (Trouver = Faux) ET (i<=N) faire
Si V[i] = Valeur Alors
Trouver Vrai ;
Sinon
i i+1 ;
FinSi ;
FinTantQue ;
Si Trouver Alors
{La valeur existe et se trouve à la position i. Il faut insérer à la
position i la valeur du trou}
V[i] Trou ; {Marquage de la case i comme vide}
FinSi ;
Fin.
Le parcours des tableaux de dimension 2 se fait ligne par ligne ou colonne par colonne.
Algorithme Affichage_Tableau_Diension_2 ;
Constante Ligne = 19, Colonne = 21; {Nombre de ligne et colonnes du tableau}
Type Matrice = Tableau[1 … Ligne, 1 … Colonne] de reel ;
Variable M : Matrice;
Nombre : reel ;
i, j :entier ; {i permet de parcourir les colonnes et j permet de parcourir les
lignes}
Debut
Ecrire('Affichage des données du tableau') ;
Pour i 1 à Colonne faire
Pour j 1 à Ligne faire
Ecrire('Valeur de la ligne', i, ' et de la colonne ', j) ;
Nombre M[j, i] ;
Ecrire(Nombre) ;
{Il est possible de combiner l’affectation et l’affichage en une seule
instruction Ecrire(M[j, i])}
FinPour ;
FinPour ;
Fin.
Séquence 4 : Les
algorithmes de tri dans un
tableau de dimension 1
Le tri est une opération qui consiste à ordonner les données selon un ordre voulu. Cela
implique qu’il existe une relation d’ordre entre les éléments à trier.
Les relations d’ordre sont :
➢ L’égalité : =
➢ L’infériorité stricte :<
➢ L’infériorité au sens large : <=
➢ La supériorité stricte : >
➢ La supériorité au sens large : >=
➢ La différence : <>
Les différents algorithmes ci-dessous trieront les données du tableau dans l’ordre
croissant. Il vous reviendra de les adapter s’il faut trier dans l’ordre décroissant.
3 - Le tri à Bulles
Le principe consiste à parcourir le tableau de la gauche vers la droite en comparant deux
éléments consécutifs ; si celui de gauche est plus grand que celui de droite (T[i] < T[i+1]) alors
on les permute. Cela revient à faire remonter le plus grand élément à la fin du tableau (position
n). On reprend la remontée du plus grand élément jusqu’à l’avant dernière position (n-1) du
tableau. On reprend le processus jusqu’à la position (n-2) du tableau. Ainsi les éléments du
tableau des positions n-2, n-1 et n sont triés dans le tableau. Le processus sera repris jusqu’à la
position 1.
Algorithme Tri_Bulles;
Constante N = 100;
Type Vecteur = Tableau[1 … N] de caractere;
Variable
T : Vecteur;
i, position : entier;
tampon : caractere;
continuer : booleen;
Debut
position N-1;
Repeter
continuer Faux;
Pour i 1 à position faire
Si T[i] > T[i+1] Alors
Tampon T[i] ;
T[i] T[i+1] ;
T[i+1] tampon ;
continuer Vrai;
FinSi ;
FinPour;
position position -1;
Jusqu’a continuer = Faux;
Fin.
Quand nous devons chercher une donnée dans un tableau, on doit parcourir le tableau
du début à la fin dans l’espoir de retrouver ce que nous cherchons. Mais si les données étaient
triées alors plus besoin de parcourir entièrement le tableau car si la donnée cherchée est par
exemple une valeur forte, il sera intéressant de la chercher à la fin du tableau et non à partir
début. Cela nous permet de réduire considérablement le temps de recherche.
1 - La recherche dichotomique
La recherche dichotomique consiste à diviser le tableau en 2 parties égales (si la taille
du tableau est impaire, l’une des parties aura une place de plus que l’autre).
Si la valeur recherchée est celle contenue dans la case au milieu du tableau alors on
arrête la recherche puisqu’on l’a déjà trouvé. Sinon si elle est inférieure à celle valeur du milieu,
il faut la rechercher dans la partie gauche du tableau. Si elle est plutôt supérieure à la valeur du
milieu, il faut la chercher dans la partie droite.
Algorithme Recherche_Dichotomique;
Constante N = 100;
Type Vecteur = Tableau[1 … n] de chaine ;
Variable
V: Vecteur;
Val :chaine ; {val est la valeur à rechercher dans le tableau}
debut, fin, milieu : entier;
Trouver : booleen
Debut
Ecrire('Entrer la valeur à rechercher') ;
Lire(Val) ;
Trouver faux ;
debut 1 ;
fin N ;
Repeter
Milieu (debut + fin) div 2 ; {div est l’opérateur de la division
entière}
Si V[milieu] = Val Alors
Trouver vrai ;
Sinon
Si Val < V[milieu] Alors
fin milieu – 1 ;
Sinon
debut milieu + 1;
FinSi ;
FinSi ;
Jusqu’a (Trouver = vrai) OU (debut > fin) ;
2 - La recherche trichotomique
Ici, il est question de diviser le vecteur en trois parties et de rechercher dans la partie la
plus probable où la valeur peut se trouver.
Séquence 5 : Les
enregistrements
1 - Nécessité
Soit un programme où il est question de sauvegarder (stocker dans des variables) les
informations sur un étudiant. Pour simplifier, nous nous intéressons aux caractéristiques
suivantes d’un étudiant : nom, prénom, âge, sexe, niveau et filière d’études. Pour stocker donc
un étudiant, nous aurons besoin six (06) variables correspondant à ses six caractéristiques :
➢ 3 variables de type chaîne de caractères pour le nom, prénom et filière d’études ;
➢ 2 variables de type entier pour l’âge et le niveau d’études ;
➢ 1 variable de type caractère pour le sexe.
La difficulté vient du fait que d’une part pour déclarer un étudiant, il faut beaucoup de
variables (proportionnelles aux caractéristiques). Heureusement qu’il existe les tableaux
permettant de stocker plusieurs valeurs à la fois mais hélas, ces valeurs doivent être de même
type ; ce qui n’est pas le cas pour un étudiant. Il semble nécessaire de créer autant de variables
que de caractéristiques pour chaque étudiant. Imaginez-vous juste un algorithme avec 5
étudiants ; on aura donc au moins 30 (5x6) variables à gérer ! De plus, il est possible de se
tromper lors de la manipulation des variables et associer par exemple le nom d’un étudiant au
prénom d’un autre.
Pour résoudre ces problèmes, il serait intéressant d’avoir une structure permettant
d’encapsuler (englober) toutes les caractéristiques en un seul bloc indivisible. En algorithmique,
cette structure existe et s’appelle les enregistrements.
2 - Définition
Un enregistrement est une structure de données composée de caractéristiques pouvant
être de type différent.
Un enregistrement est utilisé si et seulement si l’information a au moins deux (02)
caractéristiques.
Exemple
e1.age 25 ; {Affectation d’une valeur à un champ d’enregistrement}
Lire(e1.nom) ; {Lecture d’un champ d’enregistrement}
Ecrire(e1.prenom) ; {Affichage d’un champ d’enregistrement}
e1.niveau e2.niveau {Affectation d’une valeur à un champ provenant du
même champ d’une autre variable}
Lors de la manipulation des enregistrements, vous devez le faire champ par champ car :
➢ même si les champs sont de même type, leur manipulation groupée (non champ par
champ) peut être sémantiquement incorrecte. Par exemple l’instruction e1 < e2 n’a pas
de sens car c’est à vous de programmer la comparaison de 2 étudiants en fonction des
critères bien définis.
Par contre, il est possible d’affecter à une variable de type enregistrement une autre
variable de même type.
Au lieu d’écrire :
e1.nom e2.nom ;
e1.prenom e2.prenom ;
e1.age e2.age ;
e1.niveau e2.niveau ;
e1.sexe e2.sexe ;
e1.filiere e2.filiere ;
On peut écrire :
e1 e2 ;
1.2 - Accès par l’instruction « Avec … Faire »
L’accès par l’instruction Avec … Faire nous permet d’éviter de préfixer le champ par
le nom de la variable.
2 - Enregistrement d’enregistrements
Un enregistrement d’enregistrements est un enregistrement où au moins l’une de ses
caractéristiques est de type enregistrement. Rien n’empêche qu’une sous-caractéristique soit
aussi de type enregistrement.
Dans l’exemple de l’étudiant, au lieu de prendre en compte son âge, il est plus judicieux
de prendre en compte sa date de naissance. La date est un type composé de jour, mois et année.
Dans ce cas, le type Etudiant sera un enregistrement d’enregistrements et sera défini comme ci-
dessous.
Type
Date = Enregistrement
jour :entier;
mois :entier;{peut être déclaré comme une chaine}
annee :entier;
Fin ;
Etudiant = Enregistrement
nom :chaine ;
prenom : chaine ;
DateNaissance : Date ;
sexe :caractere ;
niveau :entier ;
filiere : chaine ;
Fin ;
Debut
{Lecture d’un étudiant avec un accès en utilisant l’instruction Avec}
Avec E Faire
Ecrire('Lecture des données d’un étudiant') ;
Ecrire('Entrer le nom : ') ;
Lire(nom) ;
Ecrire(' Entrer le prénom : ') ;
Lire(prenom) ;
Ecrire(Entrer le jour de naissance : '') ;
Lire(DateNaissance.jour) ;
Ecrire(' Entrer le mois de naissance : ') ;
Lire(DateNaissance.mois) ;
Ecrire(' Entrer l’année de naissance : ') ;
Lire(DateNaissance.annee) ;
Ecrire(' Entrer le sexe :') ;
Lire(sexe) ;
Ecrire(' Entrer le niveau d’études : ') ;
Lire(niveau) ;
Ecrire(' Entrer la filière : ') ;
Lire(filiere) ;
FinAvec ;
Séquence 6 : Les
algorithmes procéduraux
ou modulaires
1 - Problématique
Jusqu’à présent, nous avons écrit nos algorithmes en un seul bloc. Dans certains
algorithmes, certaines parties se répètent ou sont très proches à l’exception généralement des
données manipulées. Ces parties peuvent être regroupées en un bloc clairement identifié pour
faciliter d’une part la visibilité de l’algorithme et d’autre part pour faciliter sa maintenance
(correction des bugs ou amélioration de la performance). L’idée est de n’écrire ce bloc qu’une
seule fois dans l’algorithme et chaque fois qu’on en a besoin, on l’appelle seulement.
En exemple, écrivons un algorithme résolvant 2 équations du second degré.
L’algorithme se présentera comme suit :
Le bloc en bleu représente la
{Résolution de la première équation}
lecture des coefficients et s’écrit en au
Lecture des coefficients
moins 6 instructions. Il en est de même du
Calcul du discriminant
bloc en jaune. Or les instructions dans
Calcul et affichage des solutions chacun des blocs bleus sont identiques à
2 - Définition
Un module est une suite finie d’instructions ordonnée à laquelle on attribue un nom et
une liste de paramètres qui peut éventuellement être vide.
➢ La réutilisabilité : un module peut être réutilisé dans un autre algorithme car il permet
de résoudre un sous-problème précis. Donc un module peut être utilisé dans tous les
algorithmes où ce sous-problème est identifié.
Module NomDuModule ;
Variable
variable1 : type1 ;
…
variableP : typeP ;
Début
instruction1 ;
instruction2 ;
…
instructionN ;
Fin ;
Un module contient :
➢ une partie de déclaration des variables qui contient la liste des variables et leur type.
Ces variables sont dites locales au module. En général, il n’est pas conseiller de déclarer
de nouveau type dans le module sauf si dans l’algorithme, ce type ne sera utilisé que par
ce module. Cette partie peut être vide et au cas où elle ne l’est pas, elle est introduite par
le mot clé « type » pour les nouveaux types et le mot clé « variable » pour les variables
locales.
➢ Module permettant de calculer le salaire d’un employé est une fonction car après le
calcul, il faut retourner la valeur du salaire pour une utilisation ultérieure. Par contre si
on demande un module de calcul et d’affiche du salaire d’un employé, il s’agira d’une
procédure car le résultat (salaire) est affiché et non retourné pour une quelconque
utilisation.
➢ Module pour le tri des données est une procédure car après le tri, on ne renvoie pas
les données triées et le commanditaire du tri verra que le travail est bel et bien fait.
➢ Module de calcul de la moyenne ou somme des valeurs d’un ensemble est une fonction
car il faudra retourner la valeur de la moyenne ou de la somme.
Donnez des exemples de modules et justifiez s’ils sont des procédures ou des
fonctions
4.1 - Structure d’une procédure
Bien qu’une procédure ne revoie pas de résultat, cela ne veut pas dire qu’elle ne produit
pas un résultat.
Procedure NomProcedure ;
Variable
variable1 : type1 ;
…
variableP : typeP ;
Début
instruction1 ;
instruction2 ;
…
instructionN ;
Fin ;
Exemple : Procédure permettant de lire le nom d’une personne et de lui dire bonjour
Procedure Salutation ;
Variable
nom : chaine de caractères ;
Début
ecrire(‘Veuillez saisir votre nom : ‘) ;
lire(nom) ;
ecrire(‘Bonjour ‘, nom) ;
Fin ;
Le résultat de cette procédure est de prodiguer un message de salutation mais elle ne
renvoie pas de valeur même pas le nom lu, mais l’affiche.
NomFonction resultat ;
Fin ;
Pour renvoyer un résultat, on doit affecter le résultat au nom de la fonction. Cela veut
dire que dans la liste des variables locales, il faut absolument une variable qui doit contenir le
résultat obtenu par combinaison des opérateurs arithmétiques ou logiques des variables locales
ou globales.
Fonction CalculAge : entier ; Fonction CalculAge : entier ;
Variable Variable
annee_en_cours, annee_naissance : entier ; annee_en_cours, annee_naissance, age :
Debut entier ;
ecrire(‘Programme de calcul d’âge’) ; Debut
ecrire(‘Donner l’année courante :’) ; ecrire(‘Programme de calcul d’âge’) ;
lire(annee_en_cours) ; ecrire(‘Donner l’année courante :’) ;
ecrire(‘Donner votre année de naissance’) ; read(annee_en_cours) ;
lire(annee_naissance) ; lire(‘Donner votre année de naissance’) ;
lire(annee_naissance) ;
CalculAgeannee_en_cours – annee_naisance ; ageannee_en_cours – annee_naisance ;
Fin ; CalculAge age ;
Fin ;
Fonction sans variable contenant le résultat. Fonction avec variable contenant le
Ici, le résultat est renvoyé sans besoin d’être résultat. Ici, le résultat est d’abord stocké
stocké dans une variable résultat dans la variable age avant d’être renvoyé
Intégrons à présent la procédure Salutation et la fonction CalculAge dans un algorithme.
Algorithme Salutation_et_Calcul_Age;
CalculAge age ;
Fin;
1 - Problématique
Jusqu’à présent, tous les modules écrits ne sont pas paramétrés ! Cela veut dire que ces
modules ont tout le nécessaire pour réaliser leur tâche sans intervention de celui qui l’exécute.
Or si nous prenons la fonction CalculAge écrite précédemment, celui qui vous demande de
calculer son âge ne sera pas présent lorsque vous le ferez or dans la fonction CalculAge, il y a
une instruction qui lui demande de saisir son année de naissance. Que faire ?
Avant de commencer l’exécution de la fonction ou de la procédure, l’algorithmicien doit
s’assurer qu’il dispose tout le nécessaire pour le faire. La question qu’il faut se poser pour
trouver les paramètres d’une fonction ou procédure est la suivante : De quoi ai-je besoin de
celui qui passe la commande de la fonction ou procédure pour la réaliser ?
Dans notre exemple, si vous voulez que je calcule votre âge, j’ai absolument besoin
que vous me donniez votre date de naissance (pour simplifier dans l’exemple, nous avons
demandé seulement l’année de naissance). Ce n’est pas à vous de donner à l’algorithmicien
l’année courante. Cette date de naissance est appelée paramètre pour la fonction CalculAge car
la valeur de retour de la fonction dépend de la valeur du paramètre. Dans le cas d’une procédure
le résultat produit dépendra de la valeur du paramètre.
2 - Définition de paramètre
Un paramètre est une variable mise à l’entrée d’un module dont sa valeur conditionne
le résultat que produira ce module.
Lorsqu’un module (procédure ou fonction) contient au moins un paramètre, il est dit
paramétré.
La syntaxe d’un module paramétré est la suivante :
Module NomModule(parametre1 : type1, .parametre2 : type2, .…, parametreN : typeN)
Nous avons vu précédemment qu’un module est écrit soit comme une procédure soit
comme une fonction.
La syntaxe d’une fonction paramétrée est la suivante :
Fonction NomFonction(type1 parametre1, …, typeN parametreN) : typeValeurDeRetour
La syntaxe d’une procédure paramétrée est la suivante :
➢ Elle est déclarée dans un module (fonction ou procédure) : variable locale au module.
➢ Elle est déclarée juste avant le début d’algorithme principal : variable locale à
l’algorithme principal.
➢ Elle est un paramètre d’un module : un paramètre d’un module est une variable locale
à ce module.
5.2 - Les variables globales
Une variable a une portée globale (variable globale) lorsqu’elle est déclarée hors d’un
module et avant ce module. Ainsi, on peut avoir des variables qui sont globales à certains
modules mais non accessibles aux autres.
Exemple
Algorithme Portée_des_variables;
VARIABLE A : entier;
Procedure Procedure1;
Variable x : entier;
Debut
...
Fin;
VARIABLE B : entier;
VARIABLE C : entier;
VARIABLE D : entier;
Procedure Procedure2;
Debut
...
Fin;
VARIABLE E : entier;
Seuil de validation : 80% Titre : Module de lecture des données dans un tableau
Objectifs visés : O63(40%)
Seuil de validation : 80% Titre : Module d’affichage des données d’un tableau
Objectifs visés : O63(40%)
Seuil de validation : 80% Titre : Module de lecture des données d’un étudiant
Objectifs visés : O63(40%)
Seuil de validation : 80% Titre : Module d’affichage des données d’un étudiant
Objectifs visés : O63(40%)
Seuil de validation : 80% Titre : Module de tri des données d’un tableau Objectifs
visés : O63(40%)
Seuil de validation : 80% Titre : Module d’affichage du calcul du minorant et
majorant de 4 nombres Objectifs visés : O63(40%)
Seuil de validation : 80% Titre : Module d’initialisation d’un tableau avec une
valeur particulière Objectifs visés : O63(40%)
1 - Définition
Un algorithme est dit récursif si dans son exécution, il s’appelle lui-même (récursivité
directe) ou s’il appelle un autre algorithme qui l’appelle (récursivité indirecte).
Un algorithme récursif doit obéit aux règles suivantes :
• il doit exister des critères pour lesquels la récursivité (les auto-appels) doit
s’arrêter
• chaque fois que l’algorithme s’appelle (directement ou indirectement), il doit
être plus proche de ses critères d’arrêt.
Une procédure ou fonction est dite récursive si elle contient dans sa définition un appel
à elle-même (récursivité directe) ou si elle contient dans sa définition un appel de procédure ou
de fonction qui appelle à son tour (ou à plus tard) la procédure ou la fonction initiale (récursivité
indirecte).
Chaque appel de procédure ou de fonction entraîne une allocation d’espaces pour les
variables locales et les paramètres. La récursivité entraine donc un empilement d’espaces
mémoires et ce n’est qu’à la fin de chaque appel de la procédure ou fonction que les
emplacements mémoires commenceront à être dépilés et libérés.
2 - Quelques exemples
2.1 - Le Calcul factoriel
La factorielle est une fonction mathématique définit dans l’ensemble des entiers naturels
tel que pour tout entier naturel non nul, n ! = n x (n-1) x (n-2) x … x 2 x 1 et si n=0 alors 0 ! =
1.
Mathématiquement la définition récursive de la factorielle est : n ! = n x (n-1) !
Algorithmiquement, factorielle peut être écrite sous forme de fonction récursive en se
calquant sur les propriétés mathématiques de factorielle. Evidemment, la récursivité s’arrêtera
lorsque n vaudra 0.