Introduction à l'Algorithmique 1ère Année
Introduction à l'Algorithmique 1ère Année
Sousse
Cours
CH I : INTRODUCTION A L’ALGORITHMIQUE
L’ALG
3. Exemple
On va donner l’algorithme permettant de trouver le PGCD (Plus
(Plus Grand Commun
Diviseur)) de deux entiers naturels a et b.
Début
données de a et b
si (a,b) premiers entre eux alors pgcd(a,b) = 1
• sinon
- décomposer a en facteurs premiers
- décomposer b en facteurs premiers
• pgcd(a,b) = produit des facteurs premiers communs à a et b, avec les
exposants les moins forts.
Fin
Algorithmique & Structures de Données 1 Ch 1 : Introduction à l’algorithmique
Début
lire(a,b)
a et b
oui non
premiers
entre
eux ?
pgcd(a,b)=1 décomposer a
décomposer b
Fin
calculer P =
produit des facteurs
premiers communs à a et
b avec les exposants les
moins forts.
pgcd(a,b) = P
Fin
4. La codification
La codification est l’objet de l’étape e) décrite au paragraphe 1). Une fois l’algorithme,
réalisant le traitement, est déterminé, la codification consiste à adapter cet algorithme à la
machine utilisée, c’est à dire la traduction dans un langage donné, compréhensible par cette
dernière.
ISSAT 2
Algorithmique & Structures de Données 1 Ch 1 : Introduction à l’algorithmique
En effet, la majorité des ordinateurs ne sont pas en mesure d’exécuter directement les
algorithmes sous leur forme littérale, d’ou la nécessité de les codifier dans un langage
approprié, appelé langage de programmation.
5. La compilation
C’est la transformation en langage machine d'un programme écrit en langage évolué :
JAVA, C, COBOL, BASIC, FORTRAN, ....
Il existe deux types de langages :
Les langages de programmation de haut niveau, ou langages évolués. Ce sont des
langages dont l’utilisation ne nécessite pas la connaissance des caractéristiques
physiques de l’ordinateur sur lequel le programme va être exécuté.
Citons chronologiquement les plus connus :
• FORTRAN crée par IBM en 1956
• COBOL (1960)
• BASIC (1965)
• PASCAL (1969)
• Le langage C
• ADA,
• Java, etc...
Les langages d’assemblage ou assembleur. Ce sont des langages pour lesquels
chaque instruction correspond à un une instruction-machine. Ces langages sont
spécifiques d’un ordinateur donné, et leur utilisation nécessite une bonne
connaissance des caractéristiques de la machine.
6. Conclusion
Nous résumons la démarche nécessaire pour la résolution d’un problème donné par le
schéma suivant :
COMPILATION
INCORRECTS
EXECUTION Programme en
Résultats langage machine
CORRECTS
FIN
ISSAT 3
Algorithmique & Structures de Données 1 Ch 1 : Introduction à l’algorithmique
Exemple :
Ecrire une méthode claire permettant de résoudre l’équation du second degré dans IR
2
(ax + bx +c = 0). Etudiez tous les cas possibles (a=0, etc.) et représenter la solution sous
forme d’un organigramme.
Lecture de (a,b,c)
non non
impossible x = -c/b
d = b*b – 4*a*c
infinité
de
solutions
fin fin
x1 = (-b - sqrt(d))/(2*a) oui
x2 = (-b +sqrt(d))/(2*a) d >= 0
fin
non
fin
ISSAT 4
Algorithmique & Structures de Données 1 Ch 2 : Les données et structure d’un algorithme
1. Introduction
Un ordinateur manipule des objets. Chaque objet a besoin de trois qualificatifs pour sa
définition.
ISSAT 5
Algorithmique & Structures de Données 1 Ch 2 : Les données et structure d’un algorithme
ISSAT 6
Algorithmique & Structures de Données 1 Ch 2 : Les données et structure d’un algorithme
• < : inférieur à
• > : supérieur à
• <= : inférieur ou égal à
• >= : supérieur ou égal à
La priorité des opérateurs logiques est : NOT – AND – OR, cet ordre peut être modifié par
l’utilisation de parenthèses.
ISSAT 7
Algorithmique & Structures de Données 1 Ch 2 : Les données et structure d’un algorithme
ISSAT 8
Algorithmique & Structures de Données 1 Ch 2 : Les données et structure d’un algorithme
3. Les opérateurs
Dans un algorithme, on utilise des opérateurs pour construire des formules.
Opérateurs arithmétiques Opérateurs relationnels Opérateurs logiques
* : la multiplication, < : strictement inférieur à, ET, OU, NON.
/ : la division, <= : inférieur ou égal à,
+ : l'addition, > : strictement supérieur à,
- : la soustraction. >= : supérieur ou égal à,
= : égal à,
<> : différent de.
Une formule est une suite d'objets séparés par des opérateurs.
4. Les prédicats
Lorsque le résultat d'évaluation d'une formule est de type booléen (vrai ou faux), cette
formule est alors appelée prédicat. En programmation, plusieurs opérations sont dépendantes
de l'évaluation d'une condition, c'est à dire de la valeur d'un prédicat.
Pour composer un algorithme, nous aurons souvent à exprimer des prédicats qui seront
par la suite évalués au moment de l'exécution. Pour écrire un prédicat, nous écrirons très
souvent une comparaison entre deux valeurs de même type. Une telle comparaison est appelée
prédicat élémentaire. Lorsque le prédicat élémentaire ne suffit pas pour exprimer une
situation, nous utilisons des prédicats composés à partir de prédicats élémentaires par l'emploi
de connecteurs logiques.
Exemples :
Si X et Y sont deux variables numériques de valeurs respectives 5 et 10, nous aurons :
Il est parfois nécessaire d'utiliser des parenthèses dans l'expression d'un prédicat
composé. Les expressions entre parenthèses sont alors évaluées en premier.
5. Hiérarchie entre les opérateurs
Nous présentons dans le tableau ci-dessous la hiérarchie entre les différents opérateurs.
En effet, c'est la priorité d'évaluation dans l'ordre décroissant (du plus prioritaire au moins
prioritaire) :
Opérateur Intitulé
() les parenthèses
NON() la négation
*, / la multiplication et la division
+, - l'addition et la soustraction
<, <=, >, >=, =, <> les opérateurs relationnels
ET ET logique
OU OU logique
ISSAT 9
Algorithmique & Structures de Données 1 Ch 2 : Les données et structure d’un algorithme
Dans l'évaluation d'une expression sans parenthèses, les opérations sont effectuées par
ordre de priorité. Les opérations de même priorité sont effectuées de la gauche vers la droite.
Ainsi, pour effectuer B + C/D – E*F, on calcule d'abord C/D puis E*F. Nous pouvons
évidemment modifier les priorités en utilisant des parenthèses. Dans l'expression B + C/(D-E),
nous calculerons d'abord D-E.
Opérateurs arithmétiques Opérateurs arithmétiques
* : la multiplication, * : la multiplication,
/ : la division, / : la division,
+ : l'addition, + : l'addition,
- : la soustraction. - : la soustraction.
Opérateurs relationnels Opérateurs logiques
< : strictement inférieur à, ET, OU, NON.
<= : inférieur ou égal à,
> : strictement supérieur à,
>= : supérieur ou égal à,
= : égal à,
<> : différent de.
Hiérarchie entre les opérateurs
Opérateur Intitulé
() les parenthèses
NON() la négation
*, / la multiplication et la division
+, - l'addition et la soustraction
<, <=, >, >=, =, <> les opérateurs relationnels
ET ET logique
OU OU logique
ISSAT 10
Algorithmique & Structures de Données 1 Ch 2 : Les données et structure d’un algorithme
7. Les déclarations
Pi = 3,14159
ch = “calcul” affectation de constantes
C = 'R'
test = TRUE
a, b, c : entier ⇔ a : entier
b : entier
c : entier
x, y, z : réel déclaration de variables
n, v : booléen
mot : chaîne
c : caractère
ISSAT 11
Algorithmique & Structures de Données 1 Ch 2 : Les données et structure d’un algorithme
ISSAT 12
Algorithmique & Structures de Données 1 Ch 2 : Les données et structure d’un algorithme
Remarque : Nous pouvons afficher directement le résultat des opérations sans passer par les
variables Somme, Produit et Moyenne. Ce qui donne une seconde version de l’algorithme
(calculs_v2) plus compacte et plus optimisée :
Algorithme calculs_v2
Variable
nb1, nb2, nb3 : réel
Début
(* saisie des trois nombres *)
écrire ('entrez les trois nombres')
lire (nb1, nb2, nb3)
ISSAT 13
Algorithmique & Structures de Données 1 Ch 3 : Les structures conditionnelles et répétitives
si condition alors
suite d'instructions
finsi
Où :
condition : expression logique ayant pour valeur Vrai ou Faux.
Si la condition est vraie, la suite d'instructions est effectuée, si elle est fausse on ne fait rien.
1.1.2. L’instruction conditionnelle SI à deux choix
Une instruction conditionnelle à deux choix à la forme (ou la syntaxe) suivante :
si condition alors
suite d'instructions 1
sinon
suite d'instructions 2
finsi
Si la condition est vraie, la suite d'instructions 1 est effectuée, si elle est fausse c'est la suite
d'instructions 2 qui est effectuée.
Notons que les deux suites d'instructions peuvent comporter à leur tour des instructions
d'itération ou encore d'autres instructions conditionnelles.
Remarques :
Les règles suivantes doivent être toujours respectées dans un schéma conditionnel :
- A chaque si doit correspondre un finsi
- Un finsi revient au dernier si qui n’a pas de finsi
Exemple :
1) Reprendre l’exemple de l’organigramme vu au chapitre 1, et traduisez cet organigramme en un
algorithme en utilisant les instructions conditionnelles SI.
2) Ecrire un algorithme qui permet d’afficher à l’écran le classement, dans l’ordre croissant, de
deux réels quelconques, saisis au clavier par l’utilisateur.
Indication : les deux nombres sont lus dans les variables Inf et Sup. Ensuite, si Inf n’est pas la plus
petite valeur, on échange les deux valeurs pour avoir Inf < Sup.
Solutions :
Algorithme Exemple1
Variable
a, b, c : réel (* les coefficients de l'équation *)
x1, x2 : réel (* les racines si elles existent *)
d : réel (* le discriminant *)
Début
écrire(‘’entrez les 3 coefficients : ‘’)
ISSAT 14
Algorithmique & Structures de Données 1 Ch 3 : Les structures conditionnelles et répétitives
lire(a,b,c)
si a <> 0
alors
d ← -b – 4*a*c
si d >= 0
alors
x1 ← (-b + sqrt(d) ) / (2*a)
x2 ← (-b - sqrt(d) ) / (2*a)
écrire(‘’deux solutions réelles : x1 = ‘’, x1, ‘’et x2 = ‘’, x2)
sinon
écrire(‘’pas de solutions réelles‘’)
finsi
sinon
si b <> 0
alors
x1 ← -c/b
écrire(‘’une solution : ‘’, x1)
sinon
si c <> 0
alors
écrire(‘’équation impossible’’)
sinon
écrire(‘’tout réel est solution’’)
finsi
finsi
finsi
Fin
Algorithme Exemple2
Variable
Inf, Sup : réel (* les 2 nombres à classer *)
aux : réel (* une variable auxiliaire *)
Début
écrire(‘’entrez un premier nombre : ‘’)
lire(Inf)
écrire(‘’entrez un deuxième nombre : ‘’)
lire(Sup)
si Inf > Sup
alors (* échange des 2 valeurs *)
aux ← Inf
Inf ← Sup
Sup ← aux
finsi
écrire(‘’Le classement est : ’’, Inf, ‘’et’’, Sup)
Fin
1.2. L’instruction conditionnelle à choix multiple (selon)
Une généralisation supplémentaire de l'instruction if est l'instruction à choix multiple ou
sélective selon. Cette dernière se trouve implémentée dans beaucoup de langages de programmation
évolués. Elle est fréquemment utilisée en programmation s'il faut faire le choix entre plus de deux
alternatives.
Une instruction conditionnelle à choix multiple à la forme suivante :
ISSAT 15
Algorithmique & Structures de Données 1 Ch 3 : Les structures conditionnelles et répétitives
ISSAT 16
Algorithmique & Structures de Données 1 Ch 3 : Les structures conditionnelles et répétitives
Cette structure permet de répéter <A> un nombre connu de fois, d’où l’appellation boucle
fixe.
- si vi < vf : le mode de variation, lorsqu’il n’est pas précisé, suppose implicitement une
augmentation de 1 entre deux valeurs successives.
- si vi > vf : parcours décroissant de la variable v de pas –1.
Exercice :
i =100
1) Ecrire un algorithme permettant de calculer la somme S définie par : S = ∑ 1
i =1 i
2) Ecrire un algorithme permettant d’afficher les nombres paires dans les 100 premiers entiers
naturelles.
2.2. La boucle Répéter
Contrairement à la boucle « Pour », le nombre d’itérations dans la boucle « Répéter » n’est
pas prédéterminé. Sa syntaxe est la suivante :
répéter
<A>
jusqu’à <C>
Où :
A : action ou séquence d’actions à répéter.
C : condition logique (ou prédicat), servant de contrôle de l’itération.
Cette structure permet de répéter <A> jusqu’à ce que la condition <C> soit vraie. <C>
exprime la condition qui fait sortir le processeur de l’itération. La condition n’est testée qu’après
une première exécution de <A>. <A> est donc exécutée au moins une fois.
Exemple :
lire (a)
répéter
b a DIV 3
a a DIV 2
jusqu'à b < 2
écrire (a, b)
ISSAT 17
Algorithmique & Structures de Données 1 Ch 3 : Les structures conditionnelles et répétitives
a b b<2
18 - -
9 6 faux
4 3 faux
2 1 vrai
Et la boucle se termine. Donc, a = 2 et b = 1.
2.3. La boucle Tant que faire
La syntaxe de la boucle « tant que » est la suivante :
Cette structure permet de répéter <A> tant que la condition <C> est satisfaite. La condition
<C> est testée avant l’exécution de <A>. <A> peut alors ne jamais être exécutée.
Exemple :
lire (a)
b5
tant que b >= 2 faire
b a DIV 3
a a DIV 2
fintantque
écrire (a, b)
a b b >= 2
18 5 vrai
9 6 vrai
4 3 vrai
2 1 faux
Et la boucle se termine. Donc, a = 2 et b = 1.
ISSAT 18
Algorithmique & Structures de Données 1 Ch 3 : Les structures conditionnelles et répétitives
Remarque :
Dans le corps d’une boucle, on peut avoir une ou plusieurs autres boucles. L’imbrication des
boucles doit suivre les règles suivantes :
ISSAT 19
Algorithmique & Structures de Données 1 Ch 4 : Les tableaux
CH IV : LES TABLEAUX
L'objet de ce chapitre est l'étude de quelques outils permettant de mieux structurer les
informations (ou les données). Un objet structuré (ou structure de données) est un groupe d'objets
que l'on considère comme un tout et auquel on peut, par exemple, donner un nom collectif.
1. Tableaux simples (à une dimension)
1.1. Définition
Un tableau à une dimension, appelé aussi vecteur, est une structure de données formée de
données de même type pouvant être accédé avec un indice. Il nous permet de manipuler plusieurs
valeurs en utilisant un seul nom de variable.
Pour définir un tableau, il faut préciser :
L'identificateur du tableau (son nom),
Le type des indices (entier),
Le type des éléments du tableau (composants).
1.2. Notations et déclarations
Un tableau T est déclaré de la façon suivante :
Avec :
Nom : nom du tableau (caractère ou chaîne de caractère).
Type : le type des éléments du tableau.
Nous prendrons souvent min = 1 et max désignera alors le nombre des éléments du tableau,
qu'on appelle également longueur ou taille du tableau.
Exemple :
Moyenne : tableau [1..30] de réel
Absence : tableau [1..30] d’entier
Dans un tableau :
Tous les composants sont de même type.
Les indices des éléments d'un tableau peuvent varier dans n'importe quel intervalle
d'entiers naturels.
Le type des indices est entier.
Le nombre des composants est défini à la déclaration du tableau et ne change plus par la
suite.
Lors de la déclaration, le tableau est crée, mais les composants n'ont encore aucune valeur;
on dit qu'ils ne sont pas initialisés.
1.3. Identification d'un élément du tableau
D'une façon générale, T[i] identifie l'élément de position i dans le tableau T. Cela traduit
l'accès direct aux éléments du tableau. Il faut que : min< i <max.
Exemple :
Moyenne[13] = 13.40
Absence[27] = 4
1.4. Opérations sur les éléments d’un tableau
Nous pouvons effectuer sur les éléments d'un tableau toutes les opérations définies sur ceux-
ci, comme l'addition, la multiplication, la division, etc.
Exemples
1. Calculs divers :
ISSAT 20
Algorithmique & Structures de Données 1 Ch 4 : Les tableaux
Remarques :
- Ce tableau serait déclaré de la manière suivante :
Variable Tab : tableau [1..15] d’entier
- Le nom d'un tableau n'est jamais utilisé seul. Dans toutes les instructions (lecture,
écriture, calcul, test, etc.), il est toujours suivi d'un indice entouré de crochets.
2. Lecture d'un tableau :
Pour lire les éléments d’un tableau T, de taille N, on procède généralement de la façon ci-
dessous :
Début
……….
lire(N) /* lire la taille du tableau */
pour i de 1 à N faire /* lire les éléments du tableau */
lire ( T[i] )
finpour
……….
Fin
3. Ecriture d'un tableau :
Pour écrire (c’est à dire afficher) les éléments d’un tableau T, de taille N, on procède
généralement de la façon ci-dessous :
Début
……….
lire(N) /* lire la taille du tableau */
……….
pour i de 1 à N faire /* afficher les éléments du tableau */
écrire ( T[i] )
finpour
……….
Fin
2. Tableaux à deux dimensions
2.1. Définition
Si un traitement utilise plusieurs tableaux à une dimension, subissant le même traitement, on
utilise souvent un seul tableau à deux dimensions (ou matrice). Chaque élément du tableau est alors
identifié par deux indices : l’un désignant la ligne et l’autre la colonne.
2.2. Déclaration
Un tableau T à deux dimensions est déclaré de la façon suivante :
ISSAT 21
Algorithmique & Structures de Données 1 Ch 4 : Les tableaux
Avec :
Nom : nom du tableau (caractère ou chaîne de caractère).
Type : le type des éléments du tableau.
max1 – min1 + 1 = nombre d’éléments d’une ligne.
max2 – min2 + 1 = nombre d’éléments d’une colonne.
2.3. Exemple
colonne
ligne
1 2 3 4 5
1 a c x f n
2 ? ] & % Q
ISSAT 22
Algorithmique et Structures de Données Ch 5 : Les sous-programmes
Pour être lisible et efficace, un algorithme ne doit pas être excessivement long. D’autre part,
nous rappelons qu’une action au sein d’un algorithme peut-être elle-même un algorithme. Sa
description doit être faite en dehors des limites de l’algorithme qui l’utilise, en respectant les règles
syntaxiques habituelles.
On peut alors décrire un algorithme sous une forme modulaire, afin de structurer son
architecture d’une manière claire. On peut également vouloir définir un sous-programme (ou un
module) lorsque le même type de traitement doit être répété plusieurs fois, à différents endroits du
programme.
Le module (ou de sous-programme), est décris qu’une seule fois et on effectue un appel pour
chaque demande d’exécution dans l’algorithme principal.
Nous parlerons alors d’algorithme appelant et d’algorithme appelé. L’appelant est celui qui
contient l’appel à un sous-programme (ou module) défini séparément, qui est lui-même l’appelé.
Appelant Appelé
Les variables déclarées dans l’algorithme principal appelant sont appelées des variables
globales. L’appelé peut déclarer ses propres variables qu’il est le seul à utiliser. Dans ce cas, nous
parlerons de variables locales.
Il y a deux parties dans la définition d'un sous-programme :
- La spécification (QUOI ou nom du sous-programme).
- La réalisation (COMMENT ou regroupement d'actions).
ISSAT 23
Algorithmique et Structures de Données Ch 5 : Les sous-programmes
2. Les procédures
2.1. Définition
Un module auquel sont associés un nom et une liste de paramètres formels est appelé action
paramétrée ou procédure. Pour utiliser cette procédure, il faut lui fournir une liste de paramètres
réels (ou effectifs).
PROCEDURE < nom_procédure > (< liste des paramètres formels >)
(* Les déclarations *)
Début
(* Les instructions de la procédure *)
Fin
- Un paramètre formel est une variable choisie comme paramètre à la définition d’un algorithme
(ou d’une procédure).
- Un paramètre effectif (ou réel) est une valeur utilisée dans un appel d’une procédure à la place
d’un paramètre formel.
- A l’exécution d’un appel, la correspondance entre un paramètre effectif et un paramètre formel
est définie par la position : le premier paramètre effectif correspond au premier paramètre
formel, le deuxième au deuxième, etc.
- Chaque appel doit comprendre autant de paramètres effectifs que la définition de la procédure
comporte de paramètres formels.
- Chaque paramètre effectif doit être du même type que le paramètre formel correspondant.
- Lors de l’exécution d’un appel, l’algorithme appelant travaille directement sur les paramètres
effectifs à la place des paramètres formels.
2.4. Exemple
Nous constatons que l’action de classement de 2 nombres sera répétée 3 fois dans
l’algorithme demandé. Pour cela, il est évident que l’écriture d’un module indépendant, permettant
ISSAT 24
Algorithmique et Structures de Données Ch 5 : Les sous-programmes
Algorithme Classer_3réels
variable
n1, n2, n3 : réel
Début
écrire (‘’Saisir les 3 réels à classer’’)
lire(n1, n2, n3)
Classer_2réels(n1, n2)
Classer_2réels(n2, n3)
Classer_2réels(n1, n2)
écrire (‘’Le classement est : ‘’, n1 , n2 , n3)
Fin
ISSAT 25
Algorithmique et Structures de Données Ch 5 : Les sous-programmes
- La valeur que retourne la fonction (le résultat) est déterminée par une ou plusieurs instructions
retour (affectation d’une valeur au nom de la fonction).
- Une fonction peut retourner une valeur booléenne (vrai ou faux). Elle est alors appelée
prédicat.
3.3. Appel d’une fonction
L’appel d’une fonction est contenu dans une instruction :
A nom_fonction (< paramètres effectifs >)
si nom_fonction (< paramètres effectifs >) > valeur alors < action >
tantque nom_fonction (< paramètres effectifs >) = valeur faire < action >
Lors de l’utilisation d’une fonction, le système vérifie la comptabilité des types de variables traitées,
ainsi que le type du résultat retourné par la fonction.
3.4. Exemples
a. Ecrire une fonction, qui permet de déterminer si une personne est majeure à partir de son âge.
On suppose que l’âge de majorité est 18 ans.
FONCTION majeur (âge : entier) : booléen
début
si âge >= 18 alors
majeur vrai
sinon
majeur faux
finsi
fin
Une autre version, beaucoup plus simple, et tout aussi correcte, strictement équivalente à la
précédente serait :
FONCTION majeur_2 (âge : entier) : booléen
début
majeur_2 (âge >= 18)
fin
b. Ecrire une fonction qui retourne vrai, si et seulement si les 3 entiers a, b et c (qui sont les
paramètres de cette fonction) peuvent être les mesures des côtés d’un triangle rectangle.
FONCTION triangle_rectangle (a, b, c : entier) : booléen
début
triangle_rectangle (a*a = b*b + c*c) OU (b*b = a*a + c*c) OU (c*c = a*a + b*b)
fin
3.5. Les variables globales et locales
3.5.1. Variables Globales
Une variable globale est une variable déclarée en entête de l’algorithme, c’est à dire dans le
programme principal, ou appelant. Dans ce cas, elle est accessible dans tout l’algorithme, y compris
les sous-programmes.
3.5.2. Variables locales
Par contre, une variable locale est une variable déclarée à l’intérieure d’une procédure. Dans ce cas,
elle ne peut être utilisée (ou connue) que par le sous-programme où elle a été déclarée.
3.5.3. Remarques
- Les variables locales sont des outils nécessaires à un sous-programme, que lui seul utilise pour
effectuer ses tâches.
- Les variables locales résident dans une zone mémoire appelée « la pile » et n’existent que
pendant la durée de l’exécution du sous-programme. Au retour dans le programme principal (ou
appelant), la pile est vidée.
ISSAT 26
Algorithmique et Structures de Données Ch 5 : Les sous-programmes
- Si dans un algorithme, une variable locale a le même identificateur qu’une variable globale, alors
il s’agit pour le compilateur de deux variables différentes. De ce fait, les modifications de l’une
n’ont aucune conséquence sur l’autre.
- Un paramètre formel est toujours une variable locale et ne peut être utilisé en dehors de la
procédure où il est défini. Par contre, un paramètre effectif peut être une variable globale.
3.5.4. Exemple
L’exemple ci-dessous illustre l’utilisation des différentes variables dans un algorithme :
Variables
ALGORITHME Prog_principal Globales
VARIABLE
A, B : entier
Variables
Locales
Début
(* Instructions de prog_principal *)
Fin
Les deux variables locales Y de proc1 et Y de proc2 ne sont accessibles que dans leurs
procédures respectives.
Un sous-programme peut appeler un sous-programme qui le précède ou s’auto appeler.
proc1 ne peut appeler que proc1, tandis que proc2 peut appeler proc1 et proc2.
A RETENIR :
Un sous-programme connaît :
- Ses propres objets : variables, constantes, type, etc. (variables locales).
- Ses paramètres formels (des données transmises par l'appelant).
- Les variables globales qui ne sont pas redéfinies dans sa partie déclaration.
- Tous les sous-programmes définis avant lui.
- Lui-même.
ISSAT 27
Algorithmique et Structures de Données Ch 5 : Les sous-programmes
PROCEDURE ERR
Début
écrire(‘’Vous vous êtes trompé ; recommencez’’)
Fin
PROCEDURE Lignes_Etoiles
Variable i : entier
Début
pour i de 1 à 80 faire
écrire(‘’*’’)
finpour
Fin
Lors de l’appel de la procédure ERR, le message « Vous vous êtes trompé ; recommencez »
sera affiché à l’écran. L’appel de la procédure Lignes_Etoiles provoquera le tracé à l’écran d’une
ligne de 80 étoiles.
4.2. Procédure avec paramètres d’appel
Une procédure a souvent besoin d’avoir des informations pour exécuter sa tâche. Lors de la
définition de la procédure, il est possible de choisir entre deux modes de passage (ou la
transmission) des paramètres : le passage par valeur et le passage par adresse.
4.2.1. Passage par valeur
Lors de l’appel d’une procédure, un emplacement dans la PILE est réservé pour chaque
paramètre formel. De même, un emplacement mémoire (SEGMENT DE DONNEES) est également
réservé pour chaque paramètre réel lors de la déclaration.
Pendant l’appel de la procédure, les valeurs des paramètres réels sont copiées dans les
paramètres formels. Ainsi, l’exécution des instructions de la procédure se fait avec les valeurs des
paramètres formels. Ainsi toute modification des paramètres formels ne peut affecter en aucun
cas celles des paramètres réels.
Les valeurs des paramètres réels sont connues avant le début de l’exécution de la procédure
et jouent le rôle uniquement d’entrées de la procédure.
Pour spécifier, dans une procédure, qu’il s’agit du mode « passage par valeur », il suffit
d’écrire simplement les noms des paramètres formels.
ISSAT 28
Algorithmique et Structures de Données Ch 5 : Les sous-programmes
Exemple :
Algorithme passage_par_valeur
variable r : entier
PROCEDURE ajouter ( k : entier ) (* k : paramètre formel *)
Début
écrire(‘’valeur de k = ’’, k)
k k+1
écrire(‘’résultat dans la procédure = ’’, k )
Fin
Début (* programme principal *)
r 20 (* initialisation de r *)
ajouter ( r ) (* appel de la procédure "ajouter" par passage de la valeur 20 *)
écrire(‘’résultat dans l’algorithme = ’’, r )
Fin
4.2.2. Passage par adresse (ou variable)
La différence principale entre le passage de paramètres par valeur et le passage de
paramètres par adresse est que pour ce dernier mode un emplacement mémoire est réservé pour le
paramètre formel et le paramètre réel correspondant. Dans ce cas, le paramètre formel utilise
directement l’emplacement mémoire du paramètre réel. Par conséquent, toute modification du
paramètre formel entraîne la même modification du paramètre réel correspondant.
Pour spécifier, dans une procédure, qu’il s’agit du mode « passage par adresse », il suffit de
mettre devant le nom du paramètre formel la mention « variable ».
Exemple :
Algorithme passage_par_variable
variable r : entier
PROCEDURE ajouter ( variable k : entier) (* k : paramètre formel *)
Début
écrire(‘’valeur de k = ’’, k)
k k+1
écrire(‘’résultat dans la procédure = ’’, k)
Fin
Début (* programme principal *)
r 20 (* initialisation de r *)
ajouter ( r ) (* r est appelé paramètre effectif ; r et k forment un alias *)
écrire(‘’résultat dans l’algorithme = ’’, r)
Fin
Rq :
- Une fonction renvoie une seule valeur au programme principal, alors qu’une procédure ne
retourne rien au programme principal. Par contre, une procédure avec passage d’adresse peut
retourner plusieurs valeurs.
- Toute fonction peut être alors convertie en procédure, mais l’inverse n’est pas vrai.
ISSAT 29
Algorithmique et Structures de Données Ch 6 : Algorithmes de recherche et tri
L’ordre des conditions est significatif car le compteur i peut atteindre la valeur n et T[n] n’existe
pas.
La version sentinelle
La technique sentinelle consiste à ajouter l’élément x à la fin du tableau. De cette façon, il est sûr
que x sera trouvé.
Fonction recherche_sequentielle_sentinelle(T :Tab ;n,x :entier) :entier
Variable
i:entier
début
i←1
T[n+1] ←x
Tantque(T[i]<>x)faire
i←i+1
Fin Tantque
si(i=(n+1)) alors
recherche_sequentielle_sentinelle←i
sinon
recherche_sequentielle_sentinelle← −
finSi
Fin
ISSAT 30
Algorithmique et Structures de Données Ch 6 : Algorithmes de recherche et tri
2. Les tris
Les algorithmes de tri servent principalement à ordonner les données, mais ils participent aussi à la
conception d’autres algorithmes, comme les recherches, en organisant préalablement les données.
2.1. Le tri par sélection
C’est l’un des tris les plus simples à mettre en œuvre. Il s’inspire d’une méthode empirique qui
consiste à rechercher la plus petite valeur et à l’inverser avec la première position, puis à rechercher
la deuxième plus petite valeur et à l’inverser avec la deuxième position, et ainsi de suite.
L’inversion de deux valeurs est souvent employée dans les algorithmes de tri.
Le tri par sélection est basé sur deux boucles POUR imbriquées. La première boucle parcourt la
liste des valeurs du début à la fin. La deuxième boucle recherche la plus petite valeur de la position
courante (compteur de la première boucle), à la fin du tableau, puis l’inverse avec la position
courante. La partie gauche de la liste est triée au fur et à mesure de l’avancement de la première
boucle. La figure 1 présente les étapes du tri, lorsque la boucle principale pointe sur la troisième
case du tableau tab.
ISSAT 31
Algorithmique et Structures de Données Ch 6 : Algorithmes de recherche et tri
Boucle principale
Figure 1
Tri Sélection. Boucle recherchant la plus petite valeur
1 2 3 4 5 6 7
tab 3 4 78 45 5 9
Partie triée
k
1 3
78
1 2 3 4 5 6 7
tab 3 4 78 45 5 9
1 2 3 4 5 6 7
tab 3 4 5 45 78 9
Partie triée
Ce tri minimise le déplacement des données. Chaque valeur minimale sélectionnée est placée
directement à sa position finale, ce qui en fait un algorithme de choix dans le traitement de données
volumineuses, et donc coûteuses en termes de déplacements.
La réalisation du tri sélection passe par les sous traitements suivants :
Enoncé :
Ecrire une fonction permettant de chercher le plus petit entier dans un tableau T contenant N entier.
Solution :
Fonction minimum (T :Tab ; n :entier) :entier
variable
j,min :entier
début
min←T[1];
Pour j de 2 à n faire
si(T[j]<min) alors
min←T[j]
finSi
FinPour
minimum← min;
Fin
Enoncé :
Modifier la fonction précédente pour qu’elle retourne l’indice du plus petit entier dans un tableau T
contenant N entiers.
ISSAT 32
Algorithmique et Structures de Données Ch 6 : Algorithmes de recherche et tri
Solution:
Fonction indice_minimum (T :Tab ;n :entier) :entier
variable
j,indice_min :entier
Début
indice_min←1
Pour j de 2 à n faire
si(T[j]<T[indice_min]) alors
indice_min←j
finSi
FinPour
indice_minimum ← indice_min
Fin
Tri Sélection :
Algorithme Tri_Sélection :
Procédure Tri_Selection(var T :Tab ;n :entier)
variable
i,m,j,inter:entier
début
Pour i de 1 à n-1 faire
m←i
Pour j de i+1 à n faire
si(T[j]<T[m])alors
m←j
finSi
FinPour
si(m<>i)alors
inter←T[i]
T[i] ←T[m]
T[m] ←inter
finSi
FinPour
Fin
1 2 3 4 5 6 7
tab 3 4 5 78 45
Dans le cas du tri sur place (dans un seul tableau de données), une première boucle POUR parcourt
chaque élément du tableau, et l’insère à sa place dans la partie gauche du tableau. Pour effectuer
cette insertion, on conserve la valeur indiquée par le compteur de la boucle principale (étape 1),
puis on effectue une boucle de décalage des cases précédentes d’une case vers la droite, tant que la
ISSAT 34
Algorithmique et Structures de Données Ch 6 : Algorithmes de recherche et tri
valeur à insérer est plus petite que la valeur précédente (étape 2). Quand cette boucle interne
s’arrête, la valeur d’insertion a trouvé sa position. Il suffit de la copier dans la case libérée (étape 3).
La figure 3 présente ce traitement.
Boucle principale
Figure 3
Tri Insertion. 1 2 3 4 5 6 7
Etape 1 tab 3 4 45 78 5
Partie triée
5 val
Boucle de décalage
1 2 3 4 5 6 7
Etape 2 tab 3 4 45 78 5
1 2 3 4 5 6 7
Etape 3 tab 3 4 45 45 78
5 val
1 2 3 4 5 6 7
Etape 4 tab 3 4 5 45 78
Partie triée
Il effectue un peu moins de comparaisons que le précédent mais plus d’échanges, ce qui peut être
pénalisant avec des données volumineuses. La performance de cet algorithme s’améliore nettement
avec des données globalement triées.
Nous présentons dans ce qui suit les sous traitements nécessaires afin de pouvoir comprendre le
principe du tri insertion
Enoncé :
Ecrire une procédure permettant d’insérer un entier X dans un tableau T contenant N entiers
ordonnés dans l’ordre croissant tout en conservant l’ordre.
ISSAT 35
Algorithmique et Structures de Données Ch 6 : Algorithmes de recherche et tri
Solution :
Procédure Inserer_Element(var T :Tab ; n,x :entier)
variable
j : entier
Début
j←n
Tantque (j>=1 et T[j]>x)faire
T[j+1] ← T[j]
j←j-1
finTantque
T[j+1] ←x
Fin
Lors de l’élaboration de cet algorithme on peut laisser la condition (j>=1) à déduire après un
tournage à la main (exemple : 5 10 12 14 et X=2). Le débordement du compteur j nécessite la
condition j>=1 pour limiter la décrémentation du j. Après avoir déduit la manque de cette
condition on peut l’ajouter de cette façon (while (T[j]>x && j>=1)) et on refait le tournage
à la main avec le même exemple. On comprend bien que l’ordre des conditions est significatif de
plus les opérations logiques « et » et « ou » sont progressives c'est-à-dire lorsqu’on a plusieurs
conditions liées avec l’opération « et » il suffit qu’une condition est fausse donc toute l’expression
sera évaluée à faux et ce n’est pas la peine d’évaluer les conditions restantes et c’est le même pour
l’opération « ou » il suffit qu’une condition sera évaluée à vrai alors toute l’expression sera vrai.
On arrive maintenant au Tri Insertion :
L’idée de ce tri consiste à supposer qu’un tableau contenant un seul élément est un tableau trié.
Donc lorsque on a une suite de a1…aN avec N le nombre d’éléments présents dans le tableau, le
singleton a1 est un tableau trié. On insère a2 dans le tableau trié qui contient a1 on obtient donc un
tableau qui contient deux éléments triés, après on passe à insérer a3, etc...
Ce qui vérifie la première boucle
ISSAT 36
Algorithmique et Structures de Données Ch 6 : Algorithmes de recherche et tri
ISSAT 37
Algorithmique et Structures de Données Ch 6 : Algorithmes de recherche et tri
boucle interne est à nouveau déroulée sur la partie gauche du tableau, moins une case, et le
processus recommence.
Partie triée
Boucle interne
1 2 3 4 5 6 7 8
tab 9 5 12 45 4 3 41 78
Partie triée
Boucle principale
1 2 3 4 5 6 7 8
tab 5 9 12 4 3 41 45 78
Partie triée
Quand on peut constater que le tableau est trié ?
Le tableau est devenue trié si on parcourt le tableau et on n’effectue aucune permutation c'est-à-dire
on a toujours T[i] < T [i+1].
On passe à la question suivante : Est-ce qu’on sait après combien d’itérations le tableau deviendra
trié ?
La réponse est : Non
On conclue donc qu’on ne doit pas utiliser la boucle pour. Il reste don à choisir entre la boucle
« Tant que » et « répéter…jusqu’à ».
La question suivante : Est-ce qu’on peut déduire que le tableau est trié sans effectuer aucune
comparaison ?
La réponse : On doit au minimum parcourir le tableau une seule fois avant de tester si le tableau est
trié ou non. Alors nous devons utiliser la boucle « répéter…jusqu’à »
On élabore maintenant le Tri A Bulles :
ISSAT 38
Algorithmique et Structures de Données Ch 6 : Algorithmes de recherche et tri
Algorithme Tri_A_Bulles :