Chapitre 2 Anas AOA Algo
Chapitre 2 Anas AOA Algo
Chapitre 2 Anas AOA Algo
Chap 2 « Algorithmique »
ENSA – CP1
Applications
(Word, Excel, Jeux, Maple, etc.)
Langages
(Java,C/C++, Fortran,etc.)
Système d’exploitation
(DOS,Windows, Unix, etc.)
Matériel
(PC, Macintosh, station SUN, etc.)
Périphériques
• Moniteur (l'écran), clavier, souris
• Modem, imprimante, scanner, …
• Le code ASCII (American Standard Code for Information Interchange) donne les
correspondances entre les caractères alphanumériques et leurs
représentation binaire, Ex. A= 01000001, ?=00111111
ADD A, 4
traducteur langage machine
LOAD B
MOV A, OUT
…
• +: déjà plus accessible que le langage machine
• -: dépend du type de la machine (n’est pas portable)
• -: pas assez efficace pour développer des applications complexes
Exemples de langages:
• Fortran, Cobol, Pascal, C, …
• C++, Java, …
Ouvrir guichet
Tant que ((client dans file d'attente) et (pas fin de journée))
Appeler client suivant
Traiter client
Fin TantQue
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
2015/2016 Module AOA, CP1 - ENSA 25
Quelques remarques
Beaucoup de langages de programmation (C/C++, Java, …) utilisent
le signe égal = pour l’affectation ←. Attention aux confusions:
Variables A, B, C: Entier
Début
A←3
B←7
A←B
B ← A+5
C←A+B
C←B–A
Fin
Variables A, B : Entier
Début
A←1
B←2
A←B
B←A
Fin
• ^ : (élévation à la puissance)
• * , / (multiplication, division)
• % (modulo)
• + , - (addition, soustraction)
exemple: 2+3*7 vaut 23
Algorithme Calcul_double
variables A, B : entier
Début
écrire("entrer le nombre ")
lire(A)
B ← 2*A
écrire("le double de ", A, "est :", B)
Fin
2015/2016 Module AOA, CP1 - ENSA 34
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
2015/2016 Module AOA, CP1 - ENSA 35
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
Si condition alors
instruction ou suite d'instructions1
Finsi
Exemples :
• x compris entre 2 et 6 : (x > 2) ET (x < 6)
• n divisible par 3 ou par 2 : (n%3=0) OU (n%2=0)
C1 C2 C1 XOR C2 C1 NON C1
VRAI VRAI FAUX VRAI FAUX
VRAI FAUX VRAI FAUX VRAI
FAUX VRAI VRAI
FAUX FAUX FAUX
FinTantQue Faux
Variable C : caractère
Debut
Ecrire (" Entrez une lettre majuscule ")
Lire (C)
TantQue (C < 'A' ou C > 'Z')
Ecrire ("Saisie erronée. Recommencez")
Lire (C)
FinTantQue
Ecrire ("Saisie valable")
Fin
version 1
Variables som, i : entier
Debut
i←0
som← 0
TantQue (som <=100)
i ← i+1
som ← som+i
FinTantQue
Ecrire (" La valeur cherchée est N= ", i)
Fin
instructions
FinPour
i ←initiale
Vrai
i n'a pas atteint finale instructions i ← i + pas
Faux
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
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
puiss ← 1
Pour i allant de 1 à n
puiss← puiss*x
FinPour
Ecrire (x, " à la puissance ", n, " est égal à ", puiss)
Fin
2015/2016 Module AOA, CP1 - ENSA 57
Boucle Pour : exemple1 (version 2)
Calcul de x à la puissance n où x est un réel non nul et n un entier
positif ou nul (version 2 avec un pas négatif)
instructions
FinPour
peut être remplacé par : compteur ← initiale
(cas d'un pas positif) TantQue compteur <= finale
instructions
compteur ← compteur+pas
FinTantQue
puiss ← 1
i←1
TantQue (i<=n)
puiss← puiss*x
i ← i+1
FinTantQue
Ecrire (x, " à la puissance ", n, " est égal à ", puiss)
Fin
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
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)
Présentation générale et
syntaxe des instructions de
base
• Calcul numérique : calcul sur des valeurs (avec une grande précision)
> 30!; 265252859812191058636308480000000
> evalf(sqrt(2),50); 1.414213562373095048801688
7242096980785696718753769
2015/2016 Module AOA, CP1 - ENSA 67
Maple : les packages
Maple dispose d'un certain nombre de packages (librairies). Chacun
de ces packages est spécialisé dans un traitement particulier.
Comme exemples de ces packages, on a :
• linalg : pour l'algèbre linéaire
• plots : pour le tracé des courbes
• geometry : pour la géométrie
• student : ce package est conçu pour assister l'enseignement des
mathématiques de base (intéressant pour les étudiants)
Fonctions et procédures
Dans ces cas on ne peut pas utiliser une fonction, on utilise une procédure
FinProcédure
Remarque : une procédure peut ne pas avoir de paramètres
2015/2016 Module AOA, CP1 - ENSA 80
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 :
Procédure exemple_proc (…)
…
FinProcédure
Algorithme exepmleAppelProcédure
Début
exemple_proc (…)
…
Fin
• Remarque : le paramètre effectif doit être une variable (et non une
valeur) lorsqu'il s'agit d'une transmission par adresse
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
2015/2016 Module AOA, CP1 - ENSA 84
Transmission par valeur, par adresse : exemples
Procédure qui calcule la somme et le produit de deux entiers :
Procédure SommeProduit (x,y: entier par valeur, som, prod : entier par adresse)
som ← x+y
prod ← x*y
FinProcédure
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
• 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
Les paramètres, les variables locales et globales sont facultatifs, ils peuvent
ne pas figurer dans la déclaration
Une procédure Maple peut rendre un seul résultat (comme une fonction),
plusieurs résultats ou aucun résultat
En Maple, une procédure peut être appelée sans être affectée. Elle
peut aussi être affectée à une variable
> carre(1,2); 5
> a:=carre(3,3); a := 18
> exemple:=proc(a,b)
> local c,d,e;
> c:=a+b; d:=a-b; e:=a*b;
> RETURN(c,d,e);
> d:=c+e;
> end:
Tout module récursif doit posséder un cas limite (cas trivial) qui
arrête la récursivité
Les 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
• 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
2015/2016 Module AOA, CP1 - ENSA 100
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(10,A)
Fin
> A:=array(1..4,[5,8,1,7]);
> moyenne(4,A); résultat : 21/4
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
2015/2016 Module AOA, CP1 - ENSA 111
Matrices : syntaxe Maple
Pour définir une matrice en Maple, on peut utiliser le type array ou le type
matrix comme suit :
Le type matrix est disponible dans le package linalg. Il faut donc charger ce
package avec la commande with(linalg) avant d'utiliser ce type
2015/2016 Module AOA, CP1 - ENSA 112
Tableaux : 2 problèmes classiques
• Recherche séquentielle
• Recherche dichotomique
Le pire des cas pour cet algorithme correspond au cas où x n'est pas dans
le tableau T
La complexité dans le pire des cas est d'ordre N, (on note O(N))
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
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
temp ← T[indice_ppe]
T[indice_ppe] ← T[i]
T[i] ← temp
FinPour
2015/2016 Module AOA, CP1 - ENSA 124
Tri par sélection : complexité
Quel que soit l'ordre du tableau initial, le nombre de tests et d'échanges
reste le même
On effectue N-1 tests pour trouver le premier élément du tableau trié, N-2
tests pour le deuxième, et ainsi de suite. Soit : (N-1)+(N-2)+…+1 = N(N-1)/2
On effectue en plus (N-1) échanges.
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
Le pire des cas correspond au cas où le pivot est à chaque choix le plus petit
élément du tableau (tableau déjà trié)
différentes versions du tri rapide sont proposés dans la littérature pour rendre
le pire des cas le plus improbable possible, ce qui rend cette méthode la plus
rapide en moyenne parmi toutes celles utilisées