Académique Documents
Professionnel Documents
Culture Documents
Algorithmique
• Algorithmique
Une fois l'algorithme est écrit (avec n'importe quelle langues : français, anglais,
arabe, etc.), il sera transformé, après avoir choisi un langage de programmation,
en un programme code source qui sera compilé (traduit) et exécuté par
l'ordinateur.
• Données : Entrées-Sorties
Données
Traitements Données
Algorithme (Instructions) Intermédiaires
Données + Instructions
Algorithme
Données + Instructions
Une donnée représente une information liée à un élément du problème traité par
l’algorithme.
Sert à stocker la valeur d’une donnée.
Variable Désigne en fait un emplacement mémoire
dont le contenu peut changer au cours d’un
programme
Données
• Données : Identificateur
Chaque donnée (Variable ou Constante) manipulée par un algorithme est
désignées par un nom unique appelé IDENTIFICATEUR.
Identificateur : est soumis à quelques règles qui varient selon le langage, mais en
général:
Un nom doit commencer par une lettre alphabétique
exemple valide: A1 exemple invalide: 1A
doit être constitué uniquement de lettres, de chiffres et du soulignement _
(Eviter les caractères de ponctuation et les espaces)
valides: ENSA2019, ENSA_2019 invalides: ENSA 2019, ENSA;2019
doit être différent des mots réservés du langage (par exemple en Java: int,
float, else, switch, case, default, for, main, return, …)
La longueur du nom doit être inférieure à la taille maximale spécifiée par le
langage utilisé
• Données : Identificateur
Conseil: pour la lisibilité du code choisir des noms significatifs qui décrivent les
données manipulées
exemples: TotalVentes2004, Prix_TTC, Prix_HT
Remarque :
Même l’algorithme lui-même possède un nom unique (identificateur)
Un identificateur est affecté à un seul objet . On peut jamais utiliser le même
identificateur pour deux variables ou constantes différentes .
toute variable utilisée dans un programme doit avoir fait l’objet d’une
déclaration préalable
En pseudo-code, on va adopter la forme suivante pour la déclaration de
variables
Variables liste d'identificateurs : type
• Exemple:
Variables i, j,k : entier
x, y : réel
OK: booléen
ch1, ch2 : chaîne de caractères
• Types d’instructions
Pour les entrées , on utilise l’instruction de lecture.
Pour les sorties, on utilise l’instructions d’écriture.
Pour les traitements, plusieurs Instructions :
L’instruction d’affectation
L’instruction de tests (conditionnelles )
Les instructions de boucles (de répétition)
Les instructions de sauts (ou de branchements)
Remarques
Les instructions des entrées de sorties et d’affectation sont séquentielles. Leurs
exécution permet automatiquement de passer à l’instruction suivante
Les instructions de tests de boucles et sauts ne sont pas séquentielles
L'écriture permet d'afficher des résultats (valeur fixe, valeur d’une variable ou
une valeur calculé) à l'écran (ou de les écrire dans un fichier)
– Conseil: Avant de lire une variable, il est fortement conseillé d’écrire des
messages à l’écran, afin de prévenir l’utilisateur de ce qu’il doit frapper
Exemple 2: Ecrire un algorithme qui vous demande de saisir votre nom puis
votre prénom et qui affiche ensuite votre nom complet
Algorithme AffichageNomComplet
variables Nom, Prenom, Nom_Complet : chaîne de caractères
Début
écrire("entrez votre nom")
lire(Nom)
écrire("entrez votre prénom")
lire(Prenom)
Nom_Complet ← Nom & Prenom
écrire("Votre nom complet est : ", Nom_Complet)
Fin
• L’instruction d’affectation
L’affectation consiste à attribuer une valeur à une variable (ça consiste en fait à remplir
où à modifier le contenu d'une zone mémoire)
En pseudo-code, l'affectation se note avec le signe ←
Var← e: attribue la valeur de e à la variable Var
• Ex valides: i ←1 j ←i k ←i+j
x ←10.3 OK ←FAUX ch1 ←"SMI"
ch2 ←ch1 x ←4 x ←j
(voir la déclaration des variables dans le transparent précédent)
• non valides: i ←10.3 OK ←"2AP" j ←x
09/06/2019 Oussama ELHAJJAMY 20
Notion d'Algorithme et de Programme
• L’instruction d’affectation
Quelques remarques
• Beaucoup de langages de programmation (C/C++, Java, …) utilisent le signe
égal = pour l’affectation ←. Attention aux confusions:
• Certains langages donnent des valeurs par défaut aux variables déclarées. Pour
éviter tout problème il est préférable d'initialiser les variables déclarées
09/06/2019 Oussama ELHAJJAMY 21
Notion d'Algorithme et de Programme
• L’instruction d’affectation
Exemple 1:
Donnez les valeurs des variables A, B et C après exécution des instructions
suivantes ?
Variables A, B, C: Entier
Début
A←3
B←7
A←B
B ← A+5
C←A+B
C←B–A
Fin
• L’instruction d’affectation
Exemple 2:
Donnez les valeurs des variables A et B après exécution des instructions
suivantes ?
Variables A, B : Entier
Début
A←1
B←2
A←B
B←A
Fin
Les deux dernières instructions permettent-elles d’échanger les valeurs de A et B ?
• L’instruction d’affectation
• Expressions et opérateurs
Une expression peut être une valeur, une variable ou une opération constituée
de variables reliées par des opérateurs
exemples: 1, b, a*2, a+ 3*b-c, …
– ^ : (élévation à la puissance)
– * , / (multiplication, division)
– % (modulo)
– + , - (addition, soustraction)
exemple: 2+3*7 vaut 23
En cas de besoin (ou de doute), on utilise les parenthèses pour indiquer les
opérations à effectuer en priorité
exemple: (2 + 3) * 7 vaut 35
La partie Sinon n'est pas obligatoire, quand elle n'existe pas et que la condition est
fausse, aucun traitement n'est réalisé
Si condition alors
instruction ou suite d'instructions1
Finsi
• Conditions composées
• Conditions composées
C1 C2 C1 ET C2 C1 C2 C1 OU C2
VRAI VRAI VRAI VRAI VRAI VRAI
VRAI FAUX FAUX VRAI FAUX VRAI
FAUX VRAI FAUX FAUX VRAI VRAI
FAUX FAUX FAUX FAUX FAUX FAUX
C1 C2 C1 XOR C2 C1 NON C1
VRAI VRAI FAUX VRAI FAUX
VRAI FAUX VRAI FAUX VRAI
FAUX VRAI VRAI
FAUX FAUX FAUX
• Tests imbriqués
Les tests peuvent avoir un degré quelconque d'imbrications
Si condition1 alors
Si condition2 alors
instructionsA
Sinon
instructionsB
Finsi
Sinon
Si condition3 alors
instructionsC
Finsi
Finsi
• Tests imbriqués
Exemple (version 1) :
Algorithme test_Nombre
Variable n : entier
Début
Ecrire ("entrez un nombre : ")
Lire (n)
Si (n < 0) alors
Ecrire ("Ce nombre est négatif")
Sinon
Si (n = 0) alors
Ecrire ("Ce nombre est nul")
Sinon
Ecrire ("Ce nombre est positif")
Finsi
Finsi
Fin
09/06/2019 Oussama ELHAJJAMY 35
Notion d'Algorithme et de Programme
• Tests imbriqués
Exemple (version 2) :
Algorithme test_Nombre
Variable n : entier
Début Remarque : dans la version 2 on fait trois
Ecrire ("entrez un nombre : ") tests systématiquement alors que dans la
Lire (n) version 1, si le nombre est négatif on ne
Si (n < 0) alors fait qu'un seul test
Ecrire ("Ce nombre est négatif")
Finsi
Si (n = 0) alors
Ecrire ("Ce nombre est nul") Conseil : utiliser les tests imbriqués pour
Finsi limiter le nombre de tests et placer
Si (n > 0) alors d'abord les conditions les plus probables
Ecrire ("Ce nombre est positif")
Finsi
Fin
Algorithme Exemple1
Début
Ecrire(1)
Ecrire(2)
Ecrire(3)
Ecrire(4)
Ecrire(5)
Fin
Faux
Remarque : le nombre d'itérations dans une boucle Pour est connu avant le début
de la boucle
Compteur est une variable de type entier (ou caractère). Elle doit être déclarée
Pas est un entier qui peut être positif ou négatif. Pas peut ne pas être mentionné,
car par défaut sa valeur est égal à 1. Dans ce cas, le nombre d'itérations est égal à
finale - initiale+ 1
Initiale et finale peuvent être des valeurs, des variables définies avant le début de
la boucle ou des expressions de même type que compteur
Dans toute formule mathématique qui utilise un ou plusieurs indices. Comme par
exemple les sommes, les vecteurs, les matrices … .
Exemple :
S = 1/2 + 2/3 + 3/4 + ……… + n/(n+1)
T[1] 1*2 T[2] 2*3 T[1] 3*4 T[1] 4*5
En générale, si le nombre d’itérations (de répétitions) est connu (par exemple Nb).
On peut utiliser la boucle Pour.
FinTantQue
Faux
Le nombre d'itérations dans une boucle TantQue n'est pas connu au moment
d'entrée dans la boucle. Il dépend de l'évolution de la valeur de condition
Une des instructions du corps de la boucle doit absolument changer la valeur de
condition de vrai à faux (après un certain nombre d'itérations), sinon le
programme tourne infiniment
Attention aux boucles infinies
Exemple de boucle infinie :
i←2
TantQue (i > 0) Faire
i ← i+1 (attention aux erreurs de frappe : + au lieu de -)
FinTantQue
Dans tous les cas où la boucle Pour est appliquée, nous pouvons utiliser la
boucle TantQue.
Si la boucle dépend d’une condition compliquée (expression booléenne avec
opérateurs logiques par exemple : a <> 0 et b <= n).
Il faut s’assurer de l’initialisation de la condition et s’assurer qu’il y a une
instruction qui rend la condition fausse après un certain nombre d’itérations.
instructions
FinPour
peut être remplacé par : compteur ← initiale
(cas d'un pas positif) TantQue compteur <= finale
instructions
compteur ← compteur+pas
FinTantQue
• Boucles imbriquées
Les instructions d'une boucle peuvent être des instructions itératives. Dans ce cas,
on aboutit à des boucles imbriquées
Exemple: Exécution
Pour i allant de 1 à 5 Faire OX
Pour j allant de 1 à i OOX
écrire("O") OOOX
FinPour OOOOX
écrire("X") OOOOOX
FinPour
instructions
Répéter
instructions
Faux
Jusqu'à condition condition
Vrai
L’instruction de boucle Répéter permet de répéter l’exécution d’une bloc
d’instructions. A chaque itération une expression booléenne (condition) est
réévaluée :
Si l’expression est True, donc on arrête la boucle et on exécute l’instruction qui
vient après Répéter.
Si l’expression est False, on continue la boucle en exécutant l’itération suivante.
Dans tous les cas où la boucle Pour est appliquée, nous pouvons utiliser la
boucle Répéter.
Si la boucle dépend d’une condition compliquée (expression booléenne avec
opérateur logiques par exemple: a<>0 et b<=n).
En général, si la première itération est réalisée sans condition. On peut utiliser
l’instruction Répéter au lieu de l’instruction TantQue.
• Exemple introductif
Supposons qu'on veut conserver les notes d'une classe de 200 étudiants pour
extraire quelques informations. Par exemple : le nombre d'étudiants ayant une
note supérieure à 10.
Le seul moyen dont nous disposons actuellement consiste à déclarer 200
variables, par exemple N1, …, N200. Après 200 instructions lire, on doit écrire 200
instructions Si pour faire le calcul.
nbre ← 0
Si (N1 >10) alors nbre ←nbre+1 FinSi
….
Si (N200>10) alors nbre ←nbre+1 FinSi
c'est lourd à écrire
Heureusement, les langages de programmation offrent la possibilité de rassembler toutes
ces variables dans une seule structure de donnée appelée tableau
• Définition
• Définition
1 2 3 n 49 50
T = t1 t2 t3 ………. tn …….. t49 t50
Remarques :
• La variable i (le compteur de la boucle pour) sert comme indice pour accéder
au ième , élément du tableau T.
• Le premier élément est T[1], le deuxième élément est T[2], … et le ième élément
est T[i].
• Pour i allant de 1 à n faire lire(T[i]) permet la lecture des cases T[1], T[2], … et
T[n].
lire(n,m)
Pour i allant de 1 à n faire
Pour j allant de 1 à m faire
lire (A[i][j])
FinPour
FinPour
Recherche séquentielle
Recherche dichotomique
Exemples :
Recherche d’un nom dans une liste de noms.
Recherche d’un nombre dans une liste de nombres.
Avantages :
Très simple à réaliser.
Le tri de la liste n’est pas obligatoire.
Inconvénients :
Pour des listes trop importantes la recherche devient trop lente.
• Si la valeur cherché est 20 alors les indices inf, sup et milieu vont évoluer
comme suit :
Inf 1 5 6
Sup 9 9 6
milieu 5 7 6
• Si la valeur cherché est 10 alors les indices inf, sup et milieu vont évoluer
comme suit :
Inf 1 1 3
Sup 9 4 4
milieu 5 2 3
Avantages :
Très rapide surtout pour les listes trop importantes.
Inconvénients :
La liste doit être triée.
Étape 3: 1 3 4 7 9
09/06/2019 Oussama ELHAJJAMY 89
Les tableaux
1 2 3 4 5 6
3 18 26 12 90 40
TEMP
Partie Partie pas
12
triée i=4 encore triée
Position
d’insertion
1 2 3 4 5 6
3 18 18 26 90 40
TEMP
Partie Partie pas
12
triée i=4 encore triée
1 2 3 4 5 6
3 12 18 26 90 40
TEMP
Partie Partie pas
12
triée i=4 encore triée
Dans le pire des cas le nombre de comparaisons "Tantque Tab[j-1] > Tmp faire"
est une valeur qui ne dépend que de la longueur i de la partie (a1, a2, ... , ai)
déjà rangée. Il y a donc au pire i comparaisons pour chaque i variant de 2 à n :
La complexité au pire en nombre de comparaison est donc égale à la somme
des n termes suivants (i = 2, i = 3,.... i = n)
C = 2 + 3 + 4 +...+ n = n(n+1)/2 -1 comparaisons au maximum. (c'est la somme
des n premiers entiers moins 1).
La complexité au pire en nombre de comparaison est de de l'ordre de n², que
l'on écrit O(n²).
• Tri rapide
Principe : Le tri rapide est un tri récursif basé sur l'approche "diviser pour régner",
(consiste à décomposer un problème d'une taille donnée à des sous problèmes
similaires mais de taille inférieure faciles à résoudre)
Description du tri rapide :
1. On considère un élément du tableau qu'on appelle pivot.
2. On partitionne le tableau en 2 sous tableaux : les éléments inférieurs ou
égaux à pivot et les éléments supérieurs à pivot. on peut placer ainsi la valeur
du pivot à sa place définitive entre les deux sous tableaux.
3. On répète récursivement ce partitionnement sur chacun des sous tableaux
crées jusqu'à ce qu'ils soient réduits à un à un seul élément.
• Tri rapide
Procédure TriRapide(tableau T : réel par adresse, p,r: entier par valeur)
variable q: entier
Si p <r alors
Partition(T,p,r,q)
TriRapide(T,p,q-1)
TriRapide(T,q+1,r)
FinSi
Fin Procédure
A chaque étape de récursivité on partitionne un tableau T[p..r] en deux sous
tableaux T[p..q-1] et T[q+1..r] tel que chaque élément de T[p..q-1] soit inférieur
ou égal à chaque élément de A[q+1..r] . L'indice q est calculé pendant la
procédure de partitionnement
• Tri rapide
Procédure Partition(tableau T : réel par adresse, p,r: entier par valeur,
q: entier par adresse )
Variables i, j: entier
pivot: réel
pivot← T[p], i←p+1, j ← r
TantQue (i<=j)
TantQue (i<=r et T[i] <=pivot) i ← i+1 FinTantQue
TantQue (j>=p et T[j] >pivot ) j ← j-1 FinTantQue
Si i <j alors
Echanger(T[i], T[j]), i ← i+1, j ← j-1
FinSi
FinTantQue
Echanger(T[j], T[p])
q←j
Fin Procédure
09/06/2019 Oussama ELHAJJAMY 99
Les tableaux
• Tri rapide
• Exemple introductif
{Calculer n!}
Cn k = n! / (k! * (n-k)!)
nf 1
Algorithme Calcule_Combinaison Pour i allant de 2 à n faire
Variables n, k, c : entier nf nf*i
nf, kf, nkf : entier Fin Pour
Début
{Entrées} {Calculer k!}
Lire (n, k) kf 1
{Traitement} Pour i allant de 2 à k faire
{trt 1} kf kf*i
{trt 2} Fin Pour
{trt 3}
{Calculer (n-k)!}
c nf/(kf*nkf)
nkf 1
{Sorties}
Pour i allant de 2 à (n-k) faire
Ecrire (c)
nkf nkf*i
Fin
Fin Pour
• Exemple introductif
Problèmes :
Presque le même code a été répété 3 fois : Calcul du factoriel (Les données
uniquement qui changent)
{Calculer n!} {Calculer k!} {Calculer (n-k)!}
nf 1 kf 1 nkf 1
Pour i allant de 2 à n faire Pour i allant de 2 à k faire Pour i allant de 2 à (n-k) faire
nf nf*i kf kf*i nkf nkf*i
Fin Pour Fin Pour Fin Pour
Comment écrire le code du factoriel une seule fois et l’exécuter autant de fois
qu’on veut ?
Solution : Sous-Programme
• Sous-Programme :
• Sous-Programme :
Données d’Entrées
(Paramètres)
Défini dans un programme
plus grand (Souvent c’est
le programme principal)
Sous-Programme Déclaration
Appel
Les procédures
Les fonctions
Données de sorties
(Paramètres)
Entête
Nom du programme (identificateur).
Déclaration
Programme
Constantes, Types, Variables, Etiquètes
Principal
Entête
Nom, paramètres (formels).
Déclaration
Sous-Programme Constantes, Types, Variables, Etiquètes, Sous-
programmes (à éviter)
• Appel à un sous-Programme :
Programme
Principal Sous-
Données Programme
-Constante Données
-Variables -Paramètres
Instructions -Constante
Instruction1 -Variables
Instruction2 Instructions
Instruction3 Instruction1
……. Instruction2
……. …….
Instruction N-i …….
……. Instruction M
Instruction N
• Appel à un sous-Programme :
Programme
Principal Sous-
Données Programme
-Constante Données Données
-Variables Globales -Paramètres
Paramètre et
Instructions -Constante Données Locales
Instruction1 -Variables
Instruction2 Instructions
Instruction3 Instruction1
……. Instruction2
……. …….
Appel à SP …….
……. Instruction M
Instruction N
• Appel à un Sous-Programme :
Remarque
Lors d’appel à un sous-programme, c’est possible de transmettre des données :
paramètres en entrée.
• Appel à un Sous-Programme :
Remarques :
Les sous-programme possède éventuellement des données locales.
• Fonctions: Déclaration
L'appel à une fonction, se fait dans le programme principale ou dans une autre
fonction par une instruction indiquant le nom de la fonction :
• Fonctions
Remarques
Eviter de faire les lectures (et éventuellement) les écritures à l’intérieur d’une
fonction.
• Fonctions: Exemples
• Procédure: Déclaration
Dans certains cas, on peut avoir besoin de répéter une tache dans plusieurs
endroits du programme, mais que dans cette tache on ne calcule pas de résultats
ou qu'on calcule plusieurs résultats à la fois.
Dans ces cas on ne peut pas utiliser une fonction, on utilise une procédure.
Une procédure est un sous-programme semblable à une fonction mais qui ne
retourne rien.
Une procédure s'écrit en dehors du programme principal sous la forme :
Procédure nom_procédure (paramètres et leurs types)
Instructions constituant le corps de la procédure
FinProcédure
• Remarque : une procédure peut ne pas avoir de paramètres.
L'appel d'une procédure, se fait dans le programme principale ou dans une autre
procédure par une instruction indiquant le nom de la procédure :
Remarques :
contrairement à l'appel d'une fonction, on ne peut pas affecter la procédure
appelée ou l'utiliser dans une expression. L'appel d'une procédure est une
instruction autonome.
Chaque paramètre effectif doit être du même type (ou type homogène) que le
paramètre formel correspondant.
Les paramètres placés dans l'appel d'une procédure sont appelés paramètres
effectifs. ils contiennent les valeurs pour effectuer le traitement.
Algorithme Test_incrementer1
variables n, m : entier
Début
n←3
m←3
incrementer1(n, m) résultat :
écrire (" n= ", n, " et m= ", m) n=3 et m=4
Fin
Remarque : l'instruction x ← x+1 n'a pas de sens avec un passage par valeur
Une variable locale n'est connue qu'à l'intérieur du module ou elle a été
définie. Elle est créée à l'appel du module et détruite à la fin de son exécution
Une variable globale est connue par l'ensemble des modules et le programme
principale. Elle est définie durant toute l’application et peut être utilisée et
modifiée par les différents modules du programme
Conseil : Il faut utiliser autant que possible des variables locales plutôt que des
variables globales. Ceci permet d'économiser la mémoire et d'assurer
l'indépendance de la procédure ou de la fonction
• Fonctions récursives
• Fonctions récursives
• Fonctions récursives
• Procédures récursives
Une procédure récursive qui permet d'afficher la valeur binaire d'un entier n