Académique Documents
Professionnel Documents
Culture Documents
FONDAMENTALE
et TEST
AFGT
INTRODUCTION
Abstraction / Modélisation
Trier un ensemble
Trier les valeurs de n valeurs dans
51, 48, 6 dans Trier 10 valeurs l'ordre croissant
l'ordre croissant dans l'ordre
croissant
2
ALGORITHMIQUE :
COEUR DE L’INFORMATIQUE
C’est une boîte à outils pour résoudre des problèmes (complexes) en
proposant :
Des moyens de décrire précisément (modéliser) les étapes de
calcul et les données (structures de contrôle et de données)
Différentes méthodes de résolution : récursivité, itération, "diviser
pour résoudre", algorithmes d'approximation (programmation
dynamique, algorithmes gloutons, utilisation d’heuristiques, IA),
programmation parallèle ou distribuée…
Une classification de ces méthodes / problèmes
Une classification des problèmes traités : P, NP, NP-complet
Des bases théoriques posant les limites de l’algorithmique :
décidabilité, calculabilité
Des métriques associées (complexité en temps, complexité en
espace…) et des techniques d’optimisation
Des techniques pour vérifier la correction (ou sûreté), la
terminaison (vivacité) et la complétude des algorithmes construits
3
PLAN DU COURS
5
DEMARCHE POUR RESOUDRE
UN PROBLEME
(OBTENTION D’UN ALGORITHME)
Algorithme ou Programme
Analyse (pour la qualité)
Constituants
Preuve
Métriques Complexité
Test
8
EXEMPLES
Exemple 1 :
A partir d’informations stockées dans le système
d’information d’une entreprise, élaborer des données
statistiques comme l’évolution de la masse salariale et des
dépenses de fonctionnement sur les dix dernières années.
9
EXEMPLES
Exemple 2 :
Une entreprise conçoit et commercialise deux produits.
Le premier est vendu avec un bénéfice de 10 euros l’unité pour les
40 premières unités, et de 20 euros pour les suivantes,
Le second est vendu avec un bénéfice de 14 euros l’unité pour les
25 premières unités, et de 18 euros pour les suivantes.
La production est soumise à la contrainte suivante : la quantité
journalière fabriquée ne peut dépasser 100 unités tous produits
confondus.
12
MODELISER LES DONNEES
Mais aussi :
14
MODELISER LES OPERATIONS SUR
LES DONNEES (METHODES)
15
EXEMPLE DE MODELE
(Pour l’exemple 2)
. Les constantes sont : 10, 20, 14, 18, 40, 25, 100 ;
. Les variables sont : qp1, qp11, qp12, z12 (quantité quotidienne de produit 1),
qp2, qp21, qp22, z22 (quantité quotidienne de produit 2) : entiers naturels ;
. Une fonction f(bénéfice quotidien) telle que :
f(qp11,qp12,qp21,qp22) = 10*qp11 + 20*qp12 + 14*qp21 + 18*qp22
. Des relations d’égalité = :
qp1 = qp11+qp12 (quantité de produit 1), qp2 = qp21+qp22 (quantité de produit 2)
. Des relations d’inégalité ≤ :
qp1+qp2 ≤ 100 (limite de production quotidienne)
0 ≤ qp11, 0 ≤ qp12, 0 ≤ qp21, 0 ≤ qp22 (toute quantité produite est positive)
qp11 ≤ 40, qp11≥ 40 * z12, qp12 ≤ 60 * z12, z12 ϵ {0,1}
qp21 ≤ 25, qp21 ≥ 25 * z22, qp22 ≤ 75 * z22, z22 ϵ {0,1}
vers CM2
16
EXEMPLE DE MODELE
(Exemple 2 récapitulatif)
Maximiser
f(qp11,qp12,qp21,qp22) = 10*qp11 + 20*qp12 + 14*qp21 + 18*qp22
telle que qp11+qp12+qp21+qp22 ≤ 100
0 ≤ qp11, 0 ≤ qp12, 0 ≤ qp21, 0 ≤ qp22
qp11 ≤ 40, qp11 ≥ 40 * z12,
qp12 ≤ 60 * z12, z12 ϵ {0,1}
qp21 ≤ 25, qp21 ≥ 25 * z22,
qp22 ≤ 75 * z22, z22 ϵ {0,1}
:- lib(fd). Exemple 2 :
:- lib(fd_search).
Résolution possible par
opt(P11,P12,P21,P22) :- l’algorithme du simplexe
P11 :: [0..40],
P12 :: [0..60], (programmable) dans le cadre
P21 :: [0..25], de la programmation linéaire en
P22 :: [0..75], nombres entiers (Recherche
[Z12,Z22] :: [0..1], Opérationnelle, cf. UE Algo
P11+P12+P21+P22 #=< 100,
FC #= 10*P11+20*P12+14*P21+18*P22, avancée en L3).
FCNeg #= -FC,
P11 #>= 40*Z12,
P12 #=< 60*Z12, Autre solution via la
P21 #>= 25*Z22, programmation par contraintes :
P22 #=< 75*Z22, résolution de systèmes de
minimize(labeling([P11,P12,P21,P22]), FCNeg). contraintes (cf. UE PLIA en L3).
18
3 – ANALYSE DE L’ALGORITHME
(POUR LA QUALITE)
algo3(n) = n*(n+1)/2
23
Exercice
24
UN MÊME PROBLÈME
PLUSIEURS ALGORITHMES DE RESOLUTION
(complexité)
26
ECRIRE UN ALGORITHME :
S’EXPRIMER A UN HAUT NIVEAU EN
INFORMATIQUE
LANGAGE MACHINE
27
CARACTERISTIQUES D’UN
LANGAGE DE HAUT NIVEAU
IMPERATIF
LANGAGE IMPERATIF
=
LANGAGE À BASE D’INSTRUCTIONS
modifiant des EMPLACEMENTS MEMOIRE
28
CONSTITUANTS SYNTAXIQUES
D’UN LANGAGE IMPERATIF
si (var = val1)
switch (var) { { séq1; séq2; … séqn; séq }
case val1 : séq1; sinon si (var = val2)
case val2 : séq2; { séq2; … séqn; séq }
…. sinon …
case valn : séqn; sinon si (var = valn)
default : séq; { séqn; séq }
} sinon séq 31
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF :
les structures de contrôle
34
Solution
On note n:2 la valeur du résultat de la division (réelle) de n par 2.
On note n/2 la partie entière de la valeur n:2.
- Avant la première itération, la variable n contient la valeur initiale de n.
- Après une itération, la nouvelle valeur de n est n/2 et on a :
n/2 n:2
- Après deux itérations la nouvelle valeur de n est (n/2)/2 et on a :
(n/2)/2 (n:2):2 = n:22
…
- Après (p-1) itérations la valeur de n a été divisée (p-1) fois par 2 et on a :
(…((n/2)/2)……)/2 n:2(p-1)
p-1 fois
- Au début de la pème itération, la valeur de n doit être 1 (car on sortira de la
boucle après une dernière mise à jour de n à sa valeur finale 0) et on a :
(…((n/2)/2)……)/2 = 1
On a ainsi 1 n:2(p-1) d’où 2(p-1) n donc log2 2(p-1) log2 n d’où p-1 log2 n
et donc p 1 + log2 n 35
III - Schéma itératif,
schéma récursif de programme
36
PROGRAMMES RECURSIFS
Attention !!
Les appels récursifs doivent être effectués un nombre
fini de fois.
38
PROGRAMMES RECURSIFS
39
PROGRAMMES RECURSIFS
OU ENCORE :
si condition // condition de continuation, cas récursif
faire appel récursif
[sinon] retourner(résultat) // retour du résultat associé au cas d’arrêt
40
SCHEMA GENERAL DE
PROGRAMME RECURSIF
(entier) facto2(entier n)
{ retourner (facto-acc(n,1) }
(entier) facto-acc(entier n, entier a) {
si n = 0
retourner (a)
sinon retourner (facto-acc(n-1, n * a))
Récursivité }
terminale
45
PROGRAMMES RECURSIFS
Exemple de récursivité croisée
(booléen) est-impair(entier n) {
si n = 0 retourner (faux)
sinon si n = 1 retourner (vrai) // optimisation
sinon retourner (est-pair(n-1) }
46
PROGRAMMES RECURSIFS
Exemples de récursivité directe
(booléen) est-impair(entier n) {
si n = 0 retourner (faux)
sinon si n = 1 retourner (vrai)
sinon retourner (est-impair(n-2) }
47
PROGRAMMES RECURSIFS
Exemple de récursivité multiple
Complexité
(entier) fibo(entier n) exponentielle !
{
si n= 0 OU n = 1
retourner (1)
sinon retourner (fibo(n-1) + fibo(n-2)) // appel multiple
}
48
PROGRAMMES RECURSIFS
Exemple de récursivité multiple
Complexité
Tableau[entier][n+1] F ← {1,1,0,…0}
(entier) fibo2(entier n) { linéaire !
si F[n] 0 retourner (F[n])
sinon { F[n] ← fibo2(n-1) + fibo2(n-2) // appel multiple
retourner (F[n]) }
}
49
PROGRAMMES RECURSIFS
Intérêts
fiter(n) : fiter(n) :
Question 1 :
Formuler en langage ALGO la méthode de calcul
alternative du pgcd suivante (exprimée en langage
naturel) :
« Le pgcd de 2 nombres x, y se calcule comme suit :
lorsque ces 2 nombres ont des valeurs différentes, on
calcule leur pgcd comme le pgcd du plus petit des 2
nombres avec la différence du plus grand et du plus
petit.
Ce procédé s’arrête lorsque le pgcd se calcule sur 2
nombres égaux, et dans ce cas le pgcd est la valeur
commune de ces 2 nombres »
54
SOLUTION A LA QUESTION 1
(entier) pgcd1(entier x, y)
{
si x = y
retourner (x)
sinon si x > y
retourner (pgcd1(x-y, y))
sinon
retourner (pgcd1(x, y-x))
}
55
EXERCICE
Question 2 :
56
SOLUTION A LA QUESTION 2
(entier) pgcd2(entier x, y)
{ entier u ← x, v ← y
tant que u ≠ v
{
si u > v
u ← u-v
sinon
v ← v-u
}
retourner(u)
}
57
PROGRAMMES RECURSIFS
Preuve de correction (sûreté)
60
Résultat
CQFD 62
Programme fonct1 modifié
Par exemple :
66
Solution
67
Tracez les valeurs des mises à jour des
variables jugées importantes lors de
l’exécution de :
nbDiviseurs(12,27)
68
Solution
n1 = 12
n2 = 27 ent(n1/2) = 6
i=2
compte1 = 0 compte1 = 1 ent(n2/2) = 13
compte2 = 0 i=3 j=2
compte1 = 2 compte2 = 0
i=4 j=3
compte1 = 3 compte2 = 1
i=5 …
compte1 > compte2
compte1 = 3 j=9
i=6 compte2 = 2
compte1 = 4 …
j = 13 12 | 4
compte2 = 2
69
PROGRAMMES ITERATIFS
Invariant de boucle
IV - le test
73
IV (suite) –
Elements de typage
74
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF : les types
78
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF : les types
Exemple de représentation
dans un langage algorithmique
programme(……)
{
entier x // déclaration d’une variable x et de son type entier
ensEnt E, F // E et F variables de type ensEnt construit ou spécifié
// une fois les variables E et F déclarées, leur accès
// par référence est possible
x←3 // affectation de l’entier 3 à x
insérerp(x, E) // insertion de 3 dans E, procédure construite ou spécifiée
F←E // on affecte la référence de E (valeur de E) à F
…
}
79
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF : les types
Instruction d’appel
81
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF : l’appel
Programme appelé
permuterVal(entier u, v)
// entier n’est pas une référence à une valeur entière.
// Les valeurs pour u, v en entrée sont stockées aux adresses de u, v
{
entier w
w←u // On affecte la valeur de u à l’adresse de w
u←v // On affecte la valeur de v à l’adresse de u
v←w // On affecte la valeur de w à l’adresse de v
}
84
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF :
exemple d’appel par valeur
Programme appelant
appelVal()
{
entier a, b
lire(a, b) /* 2 valeurs saisies par l’utilisateur sont
affectées aux variables a et b */
permuterVal(a, b) /* les valeurs de a et b sont
passées en paramètres effectifs */
écrire(a, b)
} 85
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF :
exemple d’appel par valeur
Explications :
- Les paramètres formels u et v de permuterVal sont
activés (u et v ont le même comportement que des
variables locales à permuterVal).
- 3 (resp. 4) la valeur saisie de a (resp. b) est liée par
recopie à la variable u (resp. v) lors de l’appel.
- Les contenus des variables u et v sont permutés.
- Les contenus des variables a et b ne sont pas
modifiés ; on retrouvera les valeurs saisies de a et b.
- Affichage de : 3 4
87
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF : l’appel
Programme appelé
permuterRef(&entier u, v)
// &entier est une référence à un emplacement contenant une valeur entière.
// Référence u, v permet d’accéder à la valeur de u, v
{
entier w
w←u // On affecte la valeur référencée par u à l’adresse de w
u←v // On affecte la valeur référencée par v à la référence (adresse) u
v←w // On affecte la valeur de w à la référence (adresse) v
}
89
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF :
exemple d’appel par référence
Programme appelant
appelRef()
{
entier a, b
lire(a, b) /* 2 valeurs saisies par l’utilisateur sont
affectées aux variables a et b */
permuterRef(a, b) /* les références de a et b sont
passées en paramètres effectifs */
écrire(a, b)
} 90
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF :
exemple d’appel par référence
Il y a eu permutation de a et b !
91
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF :
exemple d’appel par référence
Explications :
- Les paramètres u et v de permuterRef sont activés.
- 3 (resp. 4) la valeur saisie de a est stockée à
l’adresse de a (resp. b) et c’est cette adresse qui est
liée à la référence u (resp. v) lors de l’appel.
- Les contenus référencés par u et v sont permutés.
- Par conséquent, les contenus des variables a et b ont
été permutés.
- Affichage de : 4 3 après la permutation.
92
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF : l’appel
94
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF : l’appel
96
EXERCICE (suite)
appel()
{
entier a, b
a←3
b←4
écrireln(« valeur initiale a = », a, « ---- b = », b)
permuterN(a, b)
écrire(« valeur finale a = », a, « ---- b = », b)
}
97
SOLUTION
permuter1 permuter2
valeur initiale a = 3 ---- b = 4 valeur initiale a = 3 ---- b = 4
valeur finale a = 3 ---- b = 4 valeur finale a = 3 ---- b = 3
Pas de permutation car appel par Appel par valeur sur a et par référence
valeur sur a et b. sur b.
permuter3 permuter4
valeur initiale a = 3 ---- b = 4 valeur initiale a = 3 ---- b = 4
valeur finale a = 4 ---- b = 4 valeur finale a = 4 ---- b = 3
Appel par valeur sur b et par référence Permutation car appel par référence
sur a. sur a et b.
98
. Au moment de l’appel par valeur de permuter1 :
par recopie la valeur 3 de a est liée à x et la valeur 4 de b
est liée à y
.. Après exécution de temp ← x
temp contient la valeur 3 de x
.. Après exécution de x ← y
x contient la valeur 4 de y
.. Après exécution de y ← temp
y contient la valeur 3 contenue dans temp.
Ex2 :
La variable pointeur d’entier px a été déclarée et
initialisée à l’adresse de la variable entière x.
104
Solution (Ex3)
ad1 ad2 px
ad2 10 y
Schématiquement :
……
106
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF :
les tableaux
2- entier x ← 1
pour i de 1 à 2
pour j de 1 à 3
{ T[i][j] ← x
x ← x+1 }
… 109
CONSTITUANTS SYNTAXIQUES D’UN
PROGRAMME IMPERATIF :
les enregistrements
type nomType =
{
existantType1 champ1
… // champi est un nom de champ
// existantTypei est un nom de type primitif ou déjà défini
existantTypen champn
}
struct nomStruct
{
existantType1 champ1;
…
existantTypen champn;
};
typedef struct nomStruct nomType;
112