Cours Complet Algorithmique II
Cours Complet Algorithmique II
Cours Complet Algorithmique II
Hajar LAZAR
Département d’Informatique
Faculté des Science de
Semlalia –Marrakech-
1
PLAN DUCOURS
2
RAPPELS : NOTATIONSALGORITHMIQUES
TABLEAUX A PLUSIEURS DIMENSION
FONCTIONS ET PROCEDURES
RECURSIVITE
STRUCTURES /ENREGISTREMENTS
FICHIERS
Notations algorithmiques
3
Algorithme
Un algorithme, traduit dans un langage compréhensible par l’ordinateur
(ou langage de programmation, C par ex), donne un programme, qui peut
ensuite être exécuté, pour effectuer le traitement souhaité.
Notations algorithmiques
2
4
Début
Ensemble d’instructions ;
Fin
Notations algorithmiques
❑ Une expression, pour untype, est soit une constante, soit une
variable, soit constituée à l’aide de constantes, de variables,
de parenthèses et des opérateurs
Notations algorithmiques
Entrée\Sortie
Exemple :
écrire(x, y+2, "bonjour")
Notations algorithmiques
Exemple :
Lire(x, y, A)
Notations algorithmiques
10
Exemple
Cet algorithme demande a l'utilisateur de saisir une valeur numérique, ensuite il
affiche la valeur saisie, puis la même valeur incrémentée de 1.
FIN
Notations algorithmiques
11
La structure Si
L’instruction si alors sinon permet de conditionner l’exécution d’un
algorithme à la valeur d’une expression booléenne.
Syntaxe :
si <expression booléenne> alors
▪ <suite d’instructions exécutées si l’expression est vrai>
sinon
<suite d’instructions exécutées si l’expression est fausse>
finsi
12
Structure Si
Exemple
Algorithme : Valeur Absolue
Données : La valeur à calculer
Résultat : La valeur Absolue
▪
début
si valeur ≥ 0 alors
valeurabsolue ← valeur
sinon
valeurabsolue ← valeur * -1
finsi
fin
Notations algorithmiques
13
14
[autres: instructions]
finSelon
▪ V1,. . . ,Vn sont des constantes de type scalaire (entier, réel, caractère
…)
▪ instructions i est exécutée si V = Vi (on quitte ensuite le selon)
▪ instruction autre est exécutée si quelque soit i, V ≠ Vi
Notations algorithmiques
15
16
Structure itératives
▪Un algorithme peut répéter le même traitement plusieurs fois, avec éventuellement
quelques variantes.
▪Utilisation des instructions en boucle qui répètent plusieurs fois une même
instruction.
17
Répétition inconditionnelle
▪Il est fréquent que le nombre de répétitions soit connu à l'avance, et que l'on ait besoin
d'utiliser le numéro de l'itération afin d'effectuer des calculs ou des tests.
Syntaxe de Pour :
pour <variable> := <initiale> à <final> faire
action
Fpour
▪La variable prend successivement toutes les valeurs entières entre valeur initiale et
valeur finale. Pour chaque valeur, la liste des instructions est exécutée.
▪Où initiale et finale sont des expressions de même type que celui de la variable
contrôlant la boucle, le type peut être entier, caractère ou énuméré)
Notations algorithmiques
18
19
Programme somme_des_n_premiersTermes
/ / partie déclaration
n : entier; s : entier; i : entier; (ou n, i, s : entier)
Début
/ / Lecture des données
Écrire (" n = " ); lire(n);
/ / calcul de la somme s := 0;
pour i := 1 à n faire
s := s + i;
fpour;
/ / affichage du résultat écrire("1+ 2 + … + n = ", s);
fin
Notations algorithmiques
20
Répétition conditionnelle
▪Dans beaucoup de cas, on souhaite répéter une instruction tant qu'une certaine
condition est remplie, alors qu'il est à priori impossible de savoir à l'avance au bout
de combien d'itérations cette condition cessera d'être satisfaite.
21
22
Variable C : caractère
Debut
Écrire (" Entrez une lettre majuscule ");
Lire (C);
TantQue ((C < 'A‘) ou (C > 'Z')) faire
Ecrire ("Saisie erronée. Recommencez");
Lire (C);
FinTantQue
23
Répéter
liste d'instructions
jusqu'à condition
24
répéter
écrire ("indiquez la largeur du rectangle :") lire(largeur)
si largeur < 1 alors
écrire ("erreur : indiquez une valeur > 0")
finSi jusqu'à largeur >=1
fin
Notations algorithmiques
25
26
Structure itératives
Conclusion
Exemples
27
• Écrire un algorithme qui permet d’effectuer la saisie d’un nom, d’un prénom et
affiche ensuite le nom complet
• Le prix de disques compacts (CDs) dans espace de vente varie selon le nombre à
acheter: 5 DH l’unité si le nombre de CDs à acheter est inférieur à 10, 4 DH l’unité
si le nombre de CDS à acheter est compris entre 10 et 20 et 3 DH l’unité si le
nombre de CDs à acheter est au-delà de 20.
Exemple 3: tests
Écrire un algorithme qui demande un nombre entier à l'utilisateur, puis qui teste
et affiche s'il est divisible par 7 ou non
Algorithme Divsible_par7
Variable n : entier
Début
Ecrire (" Entrez un entier : ");
Lire (n)
Si (n%7=0) alors
Ecrire (n," est divisible par 7");
Sinon
Ecrire (n," n'est pas divisible par 7");
Finsi
Fin
Exemples
27
⚫ Supposons que l'on veut calculer le nombre d’étudiants ayant une note
supérieure à 10 pour une classe de 20 étudiants.
⚫Syntaxe :
Variable tableau identificateur [dimension] : <TypeTab>
⚫Exemple :
variable tableau notes[20] : réel
0 1 2 3 4 5 6 7 8 9
45 54 1 -56 22 134 49 12 90 -26
▪Ce tableau est de longueur 10. Chacun des dix nombres du tableau est repéré par
son rang, appelé indice
▪Pour accéder à un élément du tableau, il suffit de préciser entre crochets
l'indice de la case contenant cet élément.
▪Pour accéder au 5ème élément (22), on écrit : Tab[4]
▪Les instructions de lecture, écriture et affectation s'appliquent aux tableaux
comme aux variables.
x ← Tab[0] (x=45)
Tab[6] ← 43
TABLEAUX
32
⚫Ungrand avantage des tableaux est qu'on peut traiter les données qui y
sont stockées de façon simple en utilisant des boucles.
⚫Exemples :
x ← tab[0];
La variable x prend la valeur du premier élément du tableau (45 selon le
tableau précédent).
tab[6] ← 43;
Cette instruction a modifié le contenu du 7ème élément du tableau (43 au
lieu de 49).
TABLEAUX
34
⚫Les boucles sont extrêmement utiles pour les algorithmes associés aux
tableaux.
⚫Pourparcourir les éléments du tableau selon l’ordre croissant (ou
décroissant) des indices, on utilise des boucles.
⚫Le traitement de chacun des éléments étant souvent le même, seule la
valeur de l’indice est amenée à changer.
Tableaux : Exercice
Tableaux : Exercice
peut être explicitée comme suit : les éléments sont rangées dans un tableau
à deux entrées.
0 1 2 3 4
0 12 28 44 2 76
1 23 36 51 11 38
2 43 21 55 67 83
Début
ecrire("entrer le nombre de lignes et le nombre de colonnes :") ;
lire(m, n);
Pour i 0 à m-1 [par 1] faire
Pour j 0 à n-1 [par 1] faire
écrire ("A[",i, "] [",j,"]=", A[i][j]);
FinPour
FinPour
Fin
TABLEAUX
33
Initialisation de matrice
⚫Pour initialiser une matrice on peut utiliser par exemple les instructions
suivantes :
Exercices:
Corrigés:
1.
Variable i , Tableau tab[6] : entiers
Debut
Pour i ← 0 à 6 faire
tab[i] ← 0
i Suivant
Finpour
Fin
2.
Variable Tableau tab[6] : caractère
Debut
Tab[0] ← "a"
Tab[1] ← "e"
Tab[2] ← "i"
Tab[3] ← "o"
Tab[4] ← "u"
Tab[5] ← "y"
Fin
TABLEAUX
34
Notion de réutilisabilité
Algorithme TraitTableau;
Variables tableau tab[100] : réel;
pPetit, pGrand, moyen : réel;
Début
Saisir(tab);
Afficher(tab);
pPetitplusPetitElements(tab);
pGrandplusGrandElements(tab);
moyen calculerMoyen(tab);
Trier(tab);
Fin
Les procédures et les fonctions
34
⚫On doit fournir une valeur pour chacun des arguments définis pour la
fonction (certains langages acceptent des valeurs par défaut).
Les fonctions
35
⚫ La fonction max suivante retourne le plus grand des deux réels x et y fournis en arguments :
Comment appeler la méthode Quels sont les paramétres Quel est le type du résultat
⚫L'utilisation d'une fonction se fera par simple écriture de son nom dans
le programme principale. Le résultat étant une valeur, devra être affecté
ou être utilisé dans une expression, une écriture, ...
⚫L’évaluation de l’appel : f(arg1, arg2, ..., argN); d’une fonction définie par :
⚫Ecrire
une fonction qui calcule la somme de deux entiers
donnés en paramètres.
⚫Ecrire une fonction qui calcule le produit de trois réels donnés
en paramètres.
⚫Ecrire une fonction Min_2 qui calcule le minimum de deux
entiers donnés en paramètres.
⚫Ecrire une fonction qui teste si n entier est divisible par 3 ou
non.
⚫Ecrire une fonction qui prend en paramètres un nombre entier N
et qui calcule la somme des nombres impaires compris entre 1
et N.
Les fonctions
35
1 4
Fonction somme ( a: int, b: int): int Fonction est_divi_3 ( a: int): int
début début
retourne(a+b) si (n%3==0) alors retourne (1)
sinon retourne(0)
finFonction finsi
2 finFonction
Fonction produit ( a: réel, b: réel, c: réel): réel
début 5
retourne(a*b*c) Fonction somme_imp ( n: int): int
variables i, s=0 : int
finFonction début
3 pour i : 1 à n faire
Fonction Min_2 ( a: int, b: int): int si (n%2!=0) alors
début s<- s+i
si (a<b) alors retourne(a) finsi
sinon retourne(b) finPour
finsi retourne(s)
finFonction finFonction
Les procédures
35
⚫ Pour appeler une procédure dans un programme principale ou dans une autre
procédure, il suffit d’écrire une instruction indiquant le nom de la procédure :
Algorithme exepmleAppelProcédure
Début
exempleProcedure (…)
…
Fin
Remarque :
⚫ contrairement à l'appel d'une fonction, on ne peut pas affecter la procédure appelée
ou l'utiliser dans une expression.
⚫ 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.
⚫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.
Les procédures
35
Algorithme Test_incrementer1
variables n, m : entier
Début
n ← 3;
m ← 3;
incrementer1(n, m) ; résultat : n=3 et m=4
écrire (" n= ", n, " et m= ", m) ;
Fin
Remarque : l'instruction x ← x+1; n'a pas de sens avec un passage par valeur
Les procédures
35
Procédure SommeProduit (x, y: entier par valeur, som, prod : entier par adresse)
som ← x+y; prod ← x*y;
FinProcédure
Variables z : réel
z ← x;
x ← y;
y ← z;
FinProcédure
SOUS ALGORITHMES
42
Fonction échnger(x: réel, y : réel) : vide Fonction echnger(ref x: réel, ref y : réel) : vide
z : réel; z : réel;
début début
z := x; z := x;
x := y; x := y;
y := z; y := z;
fin fin
Fonction appelante() a, b : réel Fonction appelante() a, b : réel
début début
a := 2; b:= 7; a := 2; b:= 7;
échanger(a,b); échanger(a,b);
écrire( a = , a); écrire( a = , a);
écrire( b = , b); écrire( b = , b);
fin fin
Les résultas affichés par la fonction appelante :
Les résultas affichés par la fonction appelante : a= 7 b= 2
a= 2 b= 7
Les procédures
35
⚫ Une variable locale n'est connue qu'à l'intérieur du module où 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.
⚫ La manière de distinguer la déclaration des variables locales et globales diffère selon
le langage
•En général, les variables déclarées à l'intérieur d'une fonction ou procédure sont
considérées comme variables locales.
Fin
Les procédures
35
k←2
k++
écrire (" k= ", k)
k- -
écrire (" k= ", k)
k=f(k)
Fin
Récurrence et Récursivité
35
Soit P un prédicat (ou propriété) sur IN qui peut être soit vrai soit faux (on
écrira souvent P(n) à la place de P(n) = vrai).
On suppose que
• P(0) vrai
• ∀n ∈IN, P(n) ⇒P(n+1)
Alors , pour tout n ∈IN, P(n) est vrai.
Si on considère le prédicat suivant
P(n) : je sais résoudre le problème pour n alors le principe de récurrence
nous dit que si je sais résoudre le Pb pour n=0 et que si je sais exprimer la
solution pour n en fonction de la solution pour n+1 alors je sais résoudre le Pb
pour n’importe quel n.
Récurrence et Récursivité
35
Examples:
1. Puissance
a0 = 1 a0 = 1
Ou bien
an+1 = aan an = a an-1 n>0
2. Factoriel
0! = 1
n! = n (n-1)! , n 1
3. Suite de Fibonacci
F0= F1= 1
Fn= Fn-1 + Fn-2 , n2
Récurrence et Récursivité
35
⚫
Un algorithme (ou fonction) est dit récursif s’il est défini en fonction de lui-
même.
Exemples
début
si n = 0 alors retourner 1
sinon retourner (x * puissance(x , n-1))
fin
fsi
fin
L’algorithme récursif afficher(n) permet d’afficher les chiffres d’un entier,
strictement positif, selon la disposition de l’instruction écrie(n mod 10):
-Si l’instruction est placée en ١ , les chiffres sont affichés dans l’ordre inverse
-Si elle est placée en ٢, alors les chiffres seront affichés dans le
bon ordre Pour n = 123, on a :
١ →3 2 1
٢ →1 2 3
Type de Récursivité
Pair(n) Impair(n)
début début
si n = 0 alors si n = 0 alors
retourner vrai retourner (faux)
sinon sinon
retourner (impair(n-1)) retourner (pair(n-1))
fsi fsi
fin fin
Notion de pile
Notion de pile.
Une pile est une structure pour représenter une suite
d’éléments avec la contrainte qu’on ne peut ajouter, ou
enlever, unélément que d’un mêmecôté de la
pile (dit sommet de la pile). ajouter enlever
Exemple pile d’assiettes. som
4
Une pile peut être représentée
Exemple.
Une expression e est dite bien parenthésée (on selimite au ‘(‘ et ‘)’) si :
1. Le nombre de parenthèses ouvrantes (e() est égal au nombre de
parenthèses fermantes (e)) dans e.
2. Tout préfixe (partie gauche) u de e vérifie: u( - u( 0.
Récursivité terminale:
La récursivité d’une fonction F(X) est aussi dite terminale
lorsqu’elle se termine par l’instruction retourner(F((X))). On
ajoute, dans ce cas, un paramètre à la liste X pour contenir
le résultat de retour d’un appel récursive, comme le montre
l’exemplesuivant:
Exemple
fonction FACI(n);
fonction FACI'(n, r) ;
début
début
r: = 1 ;
tant que n > 0 faire
tant que n > 0 faire
{ r : = n* r ; n : = n-1 ; }
{ r := n* r ; n := n-1 ; }
retourner (r) ;
retourner (r) ; fin.
fin.
ITÉRATIVE
Exercices
2. Ecrire une fonction booléenne rend une valeur vrai si un nombre "b"
est diviseur d’un nombre "a" ou faux dans le cas contraire.
3. Ecrire une fonction récursive permettant de calculer la puissance pour
x réel et n entier en utilisant la définition récursive suivante:
Exercices : Solution
Algorithme:
pour i=1 à n-1 faire
-chercher le 1ème minimum, Ak , de {Ai+1,…,An} (K est l’indice de
min{Ai+1,…,An} dans le tableauA)
- échanger Ai etAk
➢ Principe:
Le tri par minimum successif nommé tri par sélection et
permutation: pour une place donné, on sélectionne l’élément qui
doit y être positionné.
➢ Simplicité
➢ Efficacité (but de ce chapitre)
Complexité
L’analyse de la complexité consiste à mesurer ces deux grandeurs pour
choisir l’algorithme le mieux adapté pour résoudre un problème.(le
plusrapide, le moins gourment enplace mémoire)
•nombres).
Les données (trier 4 nombres ne peut être comparé au trie de 1000
•Le code généré par le compilateur (interpréteur).
•La nature de la machine utilisée (mémoire, cache,multi-treading,…)
•La complexité de l’algorithme.
⚫La complexité d’un algorithme permet de qualifier sa performance par
rapport aux autres algorithmes.
Complexité
5
→ dimension desmatrices
➢ Recherche d’un mot dans un texte
→ longueur du mot et celle du texte
On note généralement:
n la taille de données, T(n) le temps (ou le cout) de
l’algorithme.
Complexité
7
⚫ Écrire une fonction qui permet de retourner le plus grand diviseur d’un entier.
Fonction PGD1( n: entier) : entier Fonction PGD2( n: entier) : entier
Variables i :entier Variables i :entier
Debut Debut
i n-1 ; i 2;
Tantque (n%i !=0) Tantque ((i<sqrt(n))&&(n%i !=0))
i i-1; i i+1;
finTantque finTantque
Retourner( i) si(n%i == 0) alors retourner (n/i)
sinon retourner (1)
finsi
Fin Fin
Pour un ordinateur qui effectue 106 tests par seconde et n=1010 alors le temps
requis par PGD1 est d’ordre 3 heures alors que celui requis par PGD2 est d’ordre
0.1 seconde
Complexité
⚫La complexité est souvent définie en se basant sur le pire des cas ou sur la
complexité moyenne. Cependant, cette dernière est plus délicate à calculer
que celle dans le pire des cas.
⚫De façon général, on dit que T(n) est O(f(n)) si c et n0 telles que n≥n0,
T(n) ≤ c.f(n).
⚫L’algorithme ayant T(n) comme temps d’exécution a une complexité d’ordre
O(f(n))
⚫3- Si T1(n) est O(f(n)) et T2(n) est O(g(n)) alors T1(n)+T2(n) est
Traitement2 T3 ( n)
Calcul de la complexité:
règles pratiques
Evaluation de T (n) (boucle Tant que)
La difficulté, pour la boucle tantque, est de déterminer le nombre
d’itération Nb_iter (ou donneruneborne supérieurede ce nombre)
T( tantque C faire A ftantque) =O(Nb_iter x (T(C) + T(A))
Traitement Ai(n)
fin pour
Exemples
1. Calcul de la somme1+2+…+n
S:=0; //O( 1)
Pour i:=1 à n faire
s:= s+ i; / / O(1)
O(1) + O(n) = O(n)
O(n)
fpour;
T(n) = O(n)
Complexité
2. Calcul de :
pour i := 1 à n faire
s:= 0; / / O(1)
pour j := 1 à i faire
s:= s+ j; / / O(1) O(i) O(1)+O(i)+O(1)=O(i)
fpour; = O(n2)
T[i] := s; //O(1)
fpour;
T(n) = O(n2)
Tableaux : recherche d’un
élément
7
Méthode séquentielle
FinSi
Recherche séquentielle :
complexité
⚫Dans le pire des cas, on doit parcourir tout le
tableau. Ainsi, la complexité est de l’ordre de
O(n).
⚫Si le tableau est trié, la recherche
séquentielle peut s’arrêter dés qu’on
rencontre un élément du tableau strictement
supérieur à l’élément recherché.
⚫Si tous les éléments sont plus petits que
l’élément recherché, l’ensemble du tableau
est parcouru. Ainsi la complexité reste
d’ordre O(n).
Recherche dichotomique
(½)k-1n >=2;
k vérifie: 2k ≤ n < 2k+1
k ≤ log2(n)< p+1 -> p=E(log2n)
⚫Donc 2k ≤n soit k ≤log2n
⚫Il
y a au plus log2n itérations comportant 3
comparaisons chacune.
⚫La recherche dichotomique dans un tableau trié est d’ordre
O(log2n).
•É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:
•Étape 3:
Tri par sélection-échange
: complexité
⚫ Supposons que le tableau est noté T La boucle j détermine le iè minimum;
et sa taille N elle tourne n-i fois (au maximum) pour
faire (n-i) tests d’éléments.
Pour i 0 à N-2 Leséchanges de A[indice-
indice_ppe ← i; ppe] et A[i] demandent 3
Pour j i + 1 à N-1 opérations.
Si T[j] <T[indice_ppe] La complexité du corps de la boucle j
est donc en O(n-i) ( i=1, …, n-1).
alors
La complexité de l’algorithme est de
indice_ppe ← j; l’ordre de:
Finsi
FinPour
temp ← T[indice_ppe];
T[indice_ppe] ← T[i];
T[i] ← temp;
FinPour T(n) = O(n2)
Tri en complexité quadratique.
Tri par insertion
: complexité
⚫ Exemple :
•Étape 3:
•Étape 4:
Tri par insertion
: complexité
La boucle j tourne, dans le pire
Algorithme: des cas, (i-1) fois
Tri_Insersion(A,n) (i-1 comparaisons et i-1
début décalages)
pouri := 2 à n faire La complexité du corps de la
cle := A[i]; boucle i est de la forme
j := i-1; a(i-1)+b, pour i=2,…,n.
Tantque (j>1) et (cle<A[j]) faire La complexité de l’algorithme:
A[j+1] := A[j];
j := j-1;
ftantque
A[j+1] = cle;
fpour
fin T(n) = O(n2)
Tri en complexité quadratique.
Enregistrement
f, g : FicheEtudiant
définit deux variables f et g enregistrements de type
FicheEtudiant
Procedure affiche(FicheEtudiant v)
debut
ecrire("No:",v.numero, "-",v.prenom)
Pour i allant de 0 à v.notes.taille()
écrire(v.notes[i], " ")
FinPour
finProcedure
Utilisation des
enregistrements
Fonction add( z1, z2 :Complexe par valeur) : Complexe
Début
Variable z: Complexe // l’enregistrement Complexe
z.re=z1.re+z2.re; ⚫ Enregistrement Complexe
z.im=z1.im+z2.im; re : réel
retourne(z)
FinFonction im: réel
Programme principale
Variables u, v, w: Complexe Fin
a, b, c, d : réel
Début
ecrire("Entrez 4 valeurs réelles :");
lire(a,b,c,d);
u.re ← a; u.im ← b; v.re ← c; v.im ← d;
w ← add(u,v);
ecrire("Somme( ,) = :", w.re,w.im);
fin