Académique Documents
Professionnel Documents
Culture Documents
2
Plan du cours
1. Présentation
2. Langage de description
3. Les structures Conditionnelles
4. Les boucles
5. Fonctions et Procédures
6. La Récursivité
7. Les Tableaux
8. Les Méthodes de Tri
9. Complexité des Algorithmes
3
Objectifs du cours
Ce cours a pour but de résoudre des
problématiques données, tout en définissant
et en additionnant des critères qui
permettront d’obtenir des résultats répondant
justement à ces problématiques.
1. Présentation
Présentation informelle
Considérons les étapes qui interviennent dans la résolution problème quelconque :
1. concevoir une procédure qui une à fois appliquée amènera à une solution du
problème ;
2. résoudre effectivement le problème en appliquant cette méthode.
Le résultat du premier point sera nommé un algorithme. Quant au deuxième point,
c'est-à-dire la mise en pratique de l'algorithme, nous l'appellerons un processus.
Ces notions sont très répandues dans la vie courante. Un algorithme peut par exemple
y prendre la forme :
d'une recette de cuisine,
d'un mode d'emploi,
d'une notice de montage,
d'une partition musicale,
d'un texte de loi,
d'un itinéraire routier.
Dans le cas particulier de l'informatique, une étape supplémentaire vient se glisser
entre la conception de l'algorithme et sa réalisation à travers un processus :
l'algorithme doit être rendu compréhensible par la machine que nous allons utiliser
pour résoudre effectivement le problème.
Le résultat de la traduction de l'algorithme dans un langage connu de la
machine est appelé un programme.
Rapide historique
C'est un mathématicien perse du 8ème siècle, Al-Khawarizmi, qui a donné son
nom à la notion d'algorithme. Son besoin était de traduire un livre de
mathématiques venu d'Inde pour que les résultats et les méthodes exposés
dans ce livre se répandent dans le monde arabe puis en Europe. Les résultats
devaient donc être compréhensibles par tout autre mathématicien et les
méthodes applicables, sans ambiguïté.
En particulier, ce livre utilisait une numérotation de position, ainsi que le
chiffre zéro que ce type de représentation des nombres rend nécessaire. Par
ailleurs, le titre de ce livre devait être repris pour désigner une branche des
mathématiques, l'algèbre.
Si l'origine du mot algorithme est très ancienne, la notion même d'algorithme
l'est plus encore : on la sait présente chez les babyloniens, 1800 ans avant JC.
Une tablette assyrienne provenant de la bibliothèque d'Assurbanipal et datée de -640
expose une recette pour obtenir des pigments bleus (notons que pour avoir un
algorithme satisfaisant, il faudrait préciser ici les temps de cuisson !) :
tu ajouteras à un mana de bon tersitu un tiers de mana de verre sirsu broyé, un
tiers de mana de sable, cinq kisal de craie,
tu broieras encore,
tu le recueilleras dans un moule, en le fermant avec un moule réplique,
tu le placeras dans les ouvreaux du four,
il rougeoira et uknû merku en sortira.
En résumé, il doit être bien clair que cette notion d'algorithme dépasse, de loin,
l'informatique et les ordinateurs. Nécessite un vocabulaire partagé, des opérations de
base maîtrisées par tous et de la précision.
2. Langage de description
Premiers éléments
Instructions de sorties
On se donne une instruction Écrire pour afficher du texte, ainsi
qu'une instruction ALaLigne pour poursuivre l'affichage à la
ligne suivante.
Patron d'un algorithme
Le patron général est le suivant :
Algorithme NomAlgorithme
Début
... actions
Fin
La première ligne, appelée profil donne essentiellement le nom
de l'algorithme. On trouve ensuite un délimiteur de début puis
les différentes actions composant l'algorithme et enfin un
délimiteur de fin.
Ainsi, l'algorithme suivant est valide :
Algorithme Bonjour
Début
Écrire('Hello world !!!')
ALaLigne
Fin
21
Notions Fondamentales (1/2)
Quelles sont les quantités des trois seaux que Asmae a reçues?
22
Notions Fondamentales (2/2)
• Notion d’algorithme : si les huis phrases sont bien exécutée par Karim, alors l’histoire
est un algorithme
• Notion d’instruction : chacune de huis phrases est une instruction (un ordre)
• Notion de valeur : { 0, 3, 5, 6, 8, 10 }
• Notion de mémoire : elle est matérialisée par les seaux qui « mémorisent » les
quantités de liquide
• Notion de variable : une variable est un emplacement mémoire, ici on a trois
variables (le seau en plastique, le seau en bois et le seau en fer)
• Notion d’environnement : c’est l’ensemble des objet, informations, personnes qui on
une existence hors de l’histoire mais qui interviennent dans son déroulement.
• Notion des valeurs d’entrée et de sortie : c’est les valeurs que le processeur reçoit de
l’environnement et celles qu’il donne à l’environnement durant l’exucution. Valeurs
en entrée :{6, 10} Valeurs en sortie = {0, 3, 8}
23
Notion de variable
• Dans les langages de programmation une variable sert à stocker la
valeur d’une donnée
• Règle : Les variables doivent être déclarées avant d’être utilisées, elle
doivent être caractérisées par :
• un nom (Identificateur)
• un type (entier, réel, caractère, chaîne de caractères, …)
24
Choix des identificateurs (1)
Le choix des noms de variables est soumis à quelques règles qui varient
selon le langage, mais en général:
• doit être différent des mots réservés du langage (par exemple en Java: int,
float, else, switch, case, default, for, main, return, …)
26
Types des variables
Le type d’une variable détermine l’ensemble des valeurs qu’elle peut prendre, les types
offerts par la plus part des langages sont:
• Type numérique (entier ou réel)
• Byte (codé sur 1octet): de 0 à 255
• Entier court (codé sur 2 octets) : -32 768 à 32 767
• Entier long (codé sur 4 ou 8 octets)
• Réel simple précision (codé sur 4 octets)
• Réel double précision (codé sur 8 octets)
• Type logique ou booléen: deux valeurs VRAI ou FAUX
27
Déclaration des variables
• Rappel: 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
• 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 ←"SMI" j ←x
29
Quelques remarques
• Beaucoup de langages de programmation (C/C++, Java, …) utilisent le signe
égal = pour l’affectation ←. Attention aux confusions:
• l'affectation n'est pas commutative : A=B est différente de B=A
• l'affectation est différente d'une équation mathématique :
• 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
30
Exercices simples sur l'affectation (1)
Variables A, B, C: Entier
Début
A←3
B←7
A←B
B ← A+5
C←A+B
C←B–A
Fin
31
Exercices simples sur l'affectation (2)
Variables A, B : Entier
Début
A←1
B←2
A←B
B←A
Fin
32
Exercices simples sur l'affectation (3)
33
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, …
• Une expression est évaluée de gauche à droite mais en tenant compte de priorités
34
Priorité des opérateurs
• Pour les opérateurs arithmétiques donnés ci-dessus, l'ordre de priorité est
le suivant (du plus prioritaire au moins prioritaire) :
• ^ : (é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
35
Les instructions d'entrées-sorties: lecture et écriture (1)
36
Les instructions d'entrées-sorties: lecture et écriture (2)
• L'écriture permet d'afficher des résultats à l'écran (ou de les écrire dans un
fichier)
37
Exemple (lecture et écriture)
Ecrire un algorithme qui demande un nombre entier à l'utilisateur, puis qui
calcule et affiche le double de ce nombre
Algorithme Calcul_double
variables A, B : entier
Début
écrire("entrer la valeur de A ")
lire(A)
B ← 2*A
écrire("le double de ", A, "est :", B)
Fin
38
Exercice (lecture et écriture)
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
39
Exercice (respect des règles)
• Chacun de ces quatre algorithmes contient une erreur. Laquelle?
Algorithme1 Algorithme2
Variables Variables
Quantité : entier X, Y, Z : réel
Prix_unit : réel Début
Début Lire (X, Y, Z)
Lire (Quantité, Prix_unit) Z :=X-Y
Prix_total := Quantité * Prix_unit Écrire (Z)
Écrire (Prix_total) Fin
Fin
Algorithme3 Algorithme4
Variables Variables
A1, A2: entier X : réel
A3 : réel Début
Début Lire (X)
Lire (A1, A2) X := X-1
A2 := A1 * A3 X :=Pi * X
Écrire (A2) Écrire (X)
Fin Fin
4
Méthode de construction d’un algorithme simple (1/4)
Exemple :
41
Méthode de construction d’un algorithme simple (2/4)
Méthodologie a suivre :
• constantes : Pi = 3.14159
• Variables : Rayon, Surface
• Types : Rayon, Surface : réel
• Expressions et affectation : Surface := Pi * (Rayon)2
• Structures conditionnelles et les boucles : ------
• Opérations d’entrée-sortie : Lire (Rayon),
Écrire (Surface)
42
Méthode de construction d’un algorithme simple
(3/4)
Algorithme
Calcul_Aire
Constantes
Pi = 3,14159
Variables
Rayon, Surface : réels
Début
lire (Rayon)
Surface := Pi * (Rayon)2
écrire (Surface)
Fin
4
Méthode de construction d’un algorithme simple
(3/4)
Programme Pascal Programme C
Program Calcul_Aire; #include <stdio.h>
CONST #include <math.h>
Pi = 3.14159 Main ( )
VAR {
Rayon, Surface : REAL; Float Pi = 3.14159;
BEGIN Float rayon, surface;
READLN (Rayon); Scanf (« °/°f », &rayon);
Surface := Pi * SQR (Rayon) surface = pi*pow (rayon,2);
WRITELN (Surface) Printif (« °/°f\n »surface, )
END. Return 0;
}
4
3. Les structures
Conditionnelles
Besoin a des concepts de ruptures de séquence
Algorithme
• Rare les algorithme qui peuvent se
Calcul_Aire décrire uniquement par un
Constantes enchaînement séquentiel d’opération
Pi = 3,14159 élémentaire
Variables
Rayon, Surface : réels
Début • On a besoin a des concept de rupture de
séquence comme les test et les boucles
lire (Rayon)
Surface := Pi * (Rayon)2 Ex :
écrire (Surface) un algorithme qui résout une équation
Fin de deuxième degré
un algorithme qui calcule une série
numérique
4
Les structures conditionnelles et les boucles
• Les tests simples : permet de réaliser un choix parmi deux possibilités (Ex :Booléenne :
vrais ou faux)
• Les instructions conditionnelles : c’est un concept de tests multiples, permet
de comparer un objet à une série de valeurs, et exécuter si la condition est vérifier ( Ex :
recherche des nombres premier dans une ensemble )
• Les itérations : consiste a exécuté un bloc d’instructions un certain nombre de fois (Ex :
calcul d’une suite numérique)
47
Tests: instructions conditionnelles (1)
• Les instructions conditionnelles servent à n'exécuter une instruction ou une
séquence d'instructions que si une condition est vérifiée
• 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
49
Exemple (Si…Alors…Sinon)
Algorithme AffichageValeurAbsolue (version1)
Variable x : réel
Début
Ecrire " Entrez un réel : "
Lire (x)
Si x < 0 alors
Ecrire ("la valeur absolue de ", x, "est:",-x)
Sinon
Ecrire ("la valeur absolue de ", x, "est:",x)
Finsi
Fin
50
Exemple (Si…Alors)
Algorithme AffichageValeurAbsolue (version2)
Variable x,y : réel
Début
Ecrire " Entrez un réel : "
Lire (x)
y← x
Si x < 0 alors
y ← -x
Finsi
Ecrire ("la valeur absolue de ", x, "est:",y)
Fin
51
Exercice (tests)
Ecrire un algorithme qui demande un nombre entier à l'utilisateur, puis
qui teste et affiche s'il est divisible par 3
Algorithme Divsible_par3
Variable n : entier
Début
Ecrire " Entrez un entier : "
Lire (n)
Si (n%3=0) alors
Ecrire (n," est divisible par 3")
Sinon
Ecrire (n," n'est pas divisible par 3")
Finsi
Fin
52
Conditions composées
• Une condition composée est une condition formée de plusieurs conditions
simples reliées par des opérateurs logiques:
ET, OU, OU exclusif (XOR) et NON
• Exemples :
• x compris entre 2 et 6 : (x > 2) ET (x < 6)
C1 C2 C1 XOR C2 C1 NON C1
VRAI VRAI FAUX VRAI FAUX
VRAI FAUX VRAI FAUX VRAI
FAUX VRAI VRAI
FAUX FAUX FAUX
5
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
55
Tests imbriqués: exemple (version 1)
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
56
Tests imbriqués: exemple (version 2)
Variable n : entier
Début
Ecrire ("entrez un nombre : ")
Lire (n)
Si n < 0 alors Ecrire ("Ce nombre est négatif")
Finsi
Si n = 0 alors Ecrire ("Ce nombre est nul")
Finsi
Si n > 0 alors Ecrire ("Ce nombre est positif")
Finsi
Fin
Remarque : dans la version 2 on fait trois tests systématiquement alors que dans la
version 1, si le nombre est négatif on ne fait qu'un seul test
Conseil : utiliser les tests imbriqués pour limiter le nombre de tests et placer d'abord
les conditions les plus probables (minimiser la complexité)
57
Tests imbriqués: exercice
Le prix de photocopies dans une reprographie varie selon le nombre demandé: 0,5 DH la copie
pour un nombre de copies inférieur à 10, 0,4DH pour un nombre compris entre 10 et 20 et 0,3DH
au-delà.
58
Tests imbriqués: corrigé de l'exercice
59
Tests imbriqués: Exercice 2
60
Tests imbriqués: corrigé de l'exercice 2
Variables
A, B, C, Delta, X1, X2 : réels
Début
Lire (A, B, C)
Delta ← B2 – 4 AC
Sinon
X1 ← (-B ) / 2A
Ecrire (« le trinome possède une racine réelle : », X1)
Finsi
Finsi
Fin
61
4. Les boucles
Les types de boucle
• On distingue 2 types de boucles:
63
Les boucles Tant que
TantQue (condition)
instructions
FinTantQue
Vrai
condition instructions
Faux
64
Boucle Tant que : exemple simple
Un algorithme qui détermine le premier nombre entier N tel que la somme
de 1 à N dépasse strictement 100
Þpgcd(105,30)=pgcd(30,15)=pgcd(15,0)=15
68
Méthode d’Euclide : Algorithme
69
Algorithme d’Euclide
Entrée: a, b deux entiers positifs Trace de l’algorithme pour
a=504 et b=396
Sortie: pgcd(a,b)
504 396 a
108 1
Procédure pgcd(a,b)
Tant que b <> 0 Faire
b 396 108 a
Début
72 3
diviser a par b: a = b.q+r, 0 ≤ r < b;
a:=b;
b 108 72 a
b:=r;
Fin 36 1
Retourner (a) 72 36 a
b 0 2
Fin pgcd
b
Les boucles Pour
instructions
FinPour
i ←initiale
Vrai
i n'a pas atteint finale instructions i ← i + pas
Faux
71
Les boucles Pour
Remarques :
• 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
72
Déroulement des boucles Pour
1) La valeur initiale est affectée à la variable compteur
b) Si compteur est <= à finale dans le cas d'un pas positif (ou si compteur est >=
à finale pour un pas négatif), instructions seront exécutées
73
Boucle Pour : exemple
74
Boucle Pour : remarque
• Il faut éviter de modifier la valeur du compteur (et de finale) à
l'intérieur de la boucle. En effet, une telle action :
• perturbe le nombre d'itérations prévu par la boucle Pour
• rend difficile la lecture de l'algorithme
• présente le risque d'aboutir à une boucle infinie
75
Lien entre Pour et TantQue
La boucle Pour est un cas particulier de Tant Que (cas où le nombre d'itérations est
connu et fixé) . Tout ce qu'on peut écrire avec Pour peut être remplacé avec TantQue
(la réciproque est fausse)
instructions
FinPour
peut être remplacé par : compteur ← initiale
(cas d'un pas positif) TantQue compteur <= finale
instructions
compteur ←
compteur+pas
FinTantQue
76
Lien entre Pour et TantQue: exemple
77
Solution avec la boucle Pour
78
Solution avec la boucle Tant Que
79
Algorithme de la fonction factorielle : Exemple
80
Algorithme de la fonction factorielle
81
Algorithme de la recherche des nombres premiers :
Exemple
82
Détecter l’erreur dans les deux essaie tant que et pour
Algorithme Algorithme
Essai de tant que Essai pour
Variables Variables
n : entier K, N : entier
Début Début
n ← 15 n ← 200
tant que (n<>0) pour K variant de 1 à n
écrire (n) écrire (K)
n←n-2 K ← n – 100
Fin de tant que Fin pour
Fin Fin
83
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 OX
Pour j allant de 1 à i OOX
écrire("O") OOOX
FinPour OOOOX
écrire("X") OOOOOX
FinPour
84
La boucle Faire…Tant Que
• Faire
Instruction(s)
Tant que (condition) Instruction(s) de la
boucle
• do
Instruction;
while (condition)
condition
Vraie
do
{ La boucle s’exécute tant que la Fausse
instructions instructions
Jusqu'à condition
Faux
condition
Vrai
• les instructions entre Répéter et jusqu’à sont exécutées au moins une fois et leur
exécution est répétée jusqu’à ce que condition soit vrai (tant qu'elle est fausse)
86
Boucle Répéter jusqu’à : exemple
Un algorithme qui détermine le premier nombre entier N tel que la somme de 1 à N
dépasse strictement 100 (version avec répéter jusqu'à)
88
Algorithme de la racine carrée : Exercice
89
Algorithme de la racine carrée
93
Fonctions
94
Forme d’une Fonction
• Une fonction s'écrit en dehors du programme principal sous la forme
95
Exemple de programme / fonction
96
Exemple de fonction / fonction
97
Fonctions : exemples
• La fonction SommeCarre suivante calcule la somme des carrées de deux réels
x et y :
Fonction SommeCarre (x : réel, y: réel ) : réel
variable z : réel
z ←x^2+y^2
Paramètres
retourne (z) formels
FinFonction
100
La fonction de recherche des nombres premiers
Fonction estPremier
Fonction est-premier (m : entier) : booléen
Pour i := 2 à ENT(m/2) Faire
Si m mod i = 0 alors // i divise m
Retourne (Faux)
Retourne (Vrai)
FinFonction est-premier
10
Entrée: Un entier positif m Entrée: Un entier positif n
Sortie: Vrai si m est premier, Faux si non. Sortie: Le plus petit nb premier m > n
• 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
FinProcédure
• Remarque : une procédure peut ne pas avoir de paramètres
103
Appel d'une procédure
• 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 :
FinProcédure
Algorithme exepmleAppelProcédure
Début
exemple_proc (…)
…
Fin
• 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
105
Transmission des paramètres
Il existe deux modes de transmission de paramètres dans les langages de
programmation :
• La transmission par valeur : les valeurs des paramètres effectifs sont affectées aux
paramètres formels correspondants au moment de l'appel de la procédure. Dans ce
mode le paramètre effectif ne subit aucune modification
• La transmission par adresse (ou par référence) : les adresses des paramètres effectifs
sont transmises à la procédure appelante. Dans ce mode, le paramètre effectif subit
les mêmes modifications que le paramètre formel lors de l'exécution de la procédure
• Remarque : le paramètre effectif doit être une variable (et non une valeur)
lorsqu'il s'agit d'une transmission par adresse
106
Transmission des paramètres : exemples
Procédure incrementer1 (x : entier par valeur, y : entier par adresse)
x ← x+1
y ← y+1
FinProcédure
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
107
Transmission par valeur, par adresse : exemples
• 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
109
Variables locales et globales (2)
• La manière de distinguer la déclaration des variables locales et globales diffère selon
le langage
• 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
110
6. La Récursivité
Récursivité
112
Types de Récursivité
113
Itération et Récursivité : Exemple
• Calcul de factoriel :
Calcul fact,
Variables
N,f : entier
Debut
f 1
tantque (n > 1)
Version itérative f f * (n−1);
fintantque
Ecrire(f)
End;
114
Itération et Récursivité : Exemple
• Tout module récursif doit posséder un cas limite (cas trivial) qui
arrête la récursivité
115
Liste des appels de la fonction factoriel (cas du n=4)
116
Récursivité : observations
Le corps d’une fonction récursive doit toujours exprimer un choix, soit par une
expression conditionnelle, soit par une définition par cas
Au moins un cas terminal rend une valeur qui n’utilise pas la fonction définie
117
Fonctions récursives : exercice
• La version récursive
119
Fonctions récursives : exercice
nbre ← 0
Si (N1 >10) alors nbre ←nbre+1 FinSi
….
Si (N30>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
123
Tableaux
• Selon les langages, le premier indice du tableau est soit 0, soit 1. Le plus souvent c'est
0 (c'est ce qu'on va adopter en pseudo-code). Dans ce cas, notes[i] désigne l'élément
i+1 du tableau notes
• Par exemple, quand on déclare un tableau comme paramètre d'une procédure, on peut ne
préciser sa dimension qu'au moment de l'appel
• En tous cas, un tableau est inutilisable tant qu’on n’a pas précisé le nombre de ses éléments
• Un grand avantage des tableaux est qu'on peut traiter les données qui y sont
stockées de façon simple en utilisant des boucles
125
Tableaux : exemples (1)
• Pour le calcul du nombre d'étudiants ayant une note supérieure à 10 avec les
tableaux, on peut écrire :
Algorithme Tableaux
variable p : entier
tableau A[10] : réel
Début
p ← 10
SaisieTab(p, A)
AfficheTab(p,A)
Fin
128
Tableaux : fonction longueur
La plus part des langages offrent une fonction longueur qui donne la dimension
du tableau. Les procédures Saisie et Affiche peuvent être réécrites comme suit :
Procédure SaisieTab( tableau T : réel par référence )
variable i: entier
Pour i allant de 0 à longueur(T)-1
écrire ("Saisie de l'élément ", i + 1)
lire (T[i] )
FinPour
Fin Procédure
Procédure AfficheTab(tableau T : réel par valeur )
variable i: entier
Pour i allant de 0 à longueur(T)-1
écrire ("T[",i, "] =", T[i])
FinPour
Fin Procédure
129
Tableaux à deux dimensions
• Exemple : une matrice A de 3 lignes et 4 colonnes dont les éléments sont réels
variable tableau A[3][4] : réel
130
Exemples : lecture d'une matrice
132
Exemples : somme de deux matrices
133
Appel des procédures définies sur les matrices
Algorithme Matrices
variables tableau M1[3][4],M2 [3][4],M3 [3][4] : réel
Début
SaisieMatrice(3, 4, M1)
SaisieMatrice(3, 4, M2)
AfficheMatrice(3,4, M1)
AfficheMatrice(3,4, M2)
SommeMatrice(3, 4, M1,M2,M3)
AfficheMatrice(3,4, M3)
Fin
134
Tableaux : trouver l’erreur
Algorithme 1 Algorithme 2
Essai de tableau 1 Essai de tableau 2
Variables Variables
i : entier i, x : entiers
Tab(10) : tableau d’entiers Tab(10) : tableau d’entiers
Début Début
tant que (i <= 10) pour i variant de 1 à 10
lire tab(i) Si Tab(i+1) < Tab(i) alors
i ← i+1 permute Tab(i), Tab(i+1)
Fin de tant que Fin de Si
Fin Fin de pour
Fin
135
Tableaux : Exemple d’exercice
136
Algorithme recherche Mini
Recherche Mini
Variables
i, Indice_Mini, Mini : entiers
Tab(10) : tableau d’entiers
Début
pour i variant de 1 à 10
Lire Tab(i)
Fin de pour
Mini Tab(1)
Indice_Mini 1
pour i variant de 2 à 10
Si Tab(i) < Mini alors
Mini Tab(i)
Indice_Mini i
Fin de Si
Fin de pour
ecrire (Mini, Indice_Mini)
Fin
137
Tableaux : 2 problèmes classiques
138
Recherche séquentielle
• Une fonction Recherche qui retourne un booléen pour indiquer si une valeur x
appartient à un tableau T de dimension N.
x , N et T sont des paramètres de la fonction
• Le pire des cas pour cet algorithme correspond au cas où x n'est pas dans le
tableau T
• Si x n’est pas dans le tableau, on effectue 3N tests : on répète N fois les tests (i < N),
(Trouvé=Faux) et (T[i]=x)
• La complexité dans le pire des cas est d'ordre N, (on note O(N))
• Pour un ordinateur N
qui effectue
1010
3 6 tests par6seconde on 9a :
10 10
temps 1ms 1s 16mn40s
142
Recherche dichotomique
• Dans le cas où le tableau est ordonné, on peut améliorer l'efficacité de la
recherche en utilisant la méthode de recherche dichotomique
• Si x < T[milieu], il suffit de chercher x dans la 1ère moitié du tableau entre (T[0]
et T[milieu-1])
143
Recherche dichotomique : algorithme
• Si la valeur cherché est 20 alors les indices inf, sup et milieu vont évoluer comme
suit :
inf 0 5 5 6
sup 8 8 5 5
milieu 4 6 5
• Si la valeur cherché est 10 alors les indices inf, sup et milieu vont évoluer comme
suit : inf 0 0 2
sup 8 3 3
milieu 4 1 2
145
Recherche dichotomique : complexité
146
8. Les Méthodes de Tri
Tris d’un tableau
La méthode de tri
148
Les algorithmes de Tri
149
Tri par sélection
150
Tri par sélection : méthodologie
15
Tri par sélection : algorithme
• Supposons que le tableau est noté T et sa taille N
temp ← T[indice]
T[indice] ← T[i] Permutation des deux valeurs
T[i] ← temp
FinPour
152
Tri par sélection : exemple
9 4 1 7 3
153
Tri par sélection : exemple
• Principe : à l'étape i, on sélectionne le plus petit élément parmi les (n - i +1)
éléments du tableau les plus à droite. On l'échange ensuite avec l'élément i du
tableau
• Exemple :
9 4 1 7 3
• Étape 1: on cherche le plus petit parmi les 5 éléments du tableau. On
l’identifie en troisième position, et on l’échange alors avec l’élément 1 :
1 4 9 7 3
• Étape 2: on cherche le plus petit élément, mais cette fois à partir du deuxième
élément. On le trouve en dernière position, on l'échange avec le deuxième:
1 3 9 7 4
• Étape 3:
1 3 4 7 9
154
Tri par sélection : complexité
155
Tri par insertion
156
Tri par insertion : algorithme
157
Tri par insertion : exemple
Simuler l’algorithme du tri par insertion sur le tableau suivant on montrant les
étapes d’exécution.
2 56 4 7 0
15
Tri par insertion : Exemple
- Prendre l’élément i
- Insérer i dans l’ordre entre 0 et i
- Continuer à partir de i+1
2, 56, 4, 7, 0
2, 56, 4, 7, 0
2, 56, 4, 7, 0
2, 4, 56, 7, 0
2, 4, 7, 56, 0
0, 2, 4, 7, 56
159
Tri à bulles
160
Tri à bulles : algorithme
161
Tri à bulles : exemple
4 1 5 3 2
16
Tri à bulles : exemple
Un balayage
2 2 2 2 1
3 3 3 1 2
Sens de
5 5 1 3 3
lecture de 1 1 5 5 5
tableau
4 4 4 4 4
164
Tri Rapide
165
Procédure 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
2 2 1 7 3 4 3 6
<3 ³3
2 2 1 3 3 4 7 6
Suite du tri
TRI TRI
1 2 2 3 3 4 6 7
168
9. Complexité des Algorithmes
L'exécution d'un programme nécessite l'utilisation des
ressources de l'ordinateur : temps de calcul pour exécuter les
opérations, et l'occupation de la mémoire pour contenir et
manipuler le programme et ses données.
170
Il faut déterminer quelle mesure utiliser pour calculer ces deux
quantités.
172
Complexité constante O(1)
Donnée : entier n
Résultat : entier
Variable locale : entier som
début
som n * (n+1) div 2
retourner som
fin
Le temps ne dépend pas de n. 173
Complexité linéaire O(n)
Algorithme 73 : recherche_tableau (tab: tableau, n : entier, but:
T): booléen
2. fin = 4
milieu = 2
tab[2] = 12 < 15
3. début = 3
milieu = 3
tab[3] = 13 <15
4. début = 4
milieu = 4
tab[4]=15
177
but = 24
1. milieu = 5
tab[5]= 16<24
2. début = 6
milieu = 7
tab[7] = 21<24
3. début = 8
milieu = 8
tab[8] = 25 >24
178
Complexité polynomiale quadratique O(n2)
Tri à bulles
Algorithme 75 : tri_a_bulles (tab:
tableau, n : entier): booléen
Donnée : taille du tableau n
Donnée modifiée : tableau tab d’éléments
de type T
Variable locale : booléen ech qui indique
si un échange a eu lieu
Variable locale : i indice dans le tableu
Variable locale : k compteur des parcours
Variable locale : tmp de type T permettant
de faire un échange
179
début
ech vrai
k -1
TANT QUE k < n et ech FAIRE
kk+1
ech faux
POUR i = 1 à n – k – 1 FAIRE
SI tab[i] < tab[i + 1]
temp tab[i]
tab[i] tab[i+1]
tab[i+1] temp
ech vrai
fin
fin
fin
180