Вы находитесь на странице: 1из 11

Plan

Algorithme
Principe de base de la programmation structure
Programmation structure Les structures
Traduction en Java

Universit de Nice - Sophia Antipolis


Richard Grin
Version 1.1.3 1/10/11

Richard Grin Programmation structure page 2

Objectif
Matriser la complexit lors de lcriture de
programmes/algorithmes comportant de
nombreuses instructions
Algorithme

Richard Grin Programmation structure page 3 Richard Grin Programmation structure 4

Algorithme Programme et algorithme


Un programme est crit dans un langage qui peut
Lenchanement des oprations lmentaires qui
tre excut par une machine
permettent de rsoudre un problme sappelle un
algorithme Un algorithme est crit dans un pseudo-langage,
souvent proche dun langage informatique mais
Nimporte quelle machine ou individu qui suit la
dbarrass de dtails techniques lis aux
lettre lalgorithme obtiendra le bon rsultat, mme sil
langages informatiques ou la machine, qui
ne comprend pas ce quil fait
gnent la comprhension du cheminement
logique

Richard Grin Programmation structure 5 Richard Grin Programmation structure page 6

1
Exemple : algorithme dEuclide Exemple de calcul de PGCD
On cherche le PGCD de deux entiers naturels a PGCD de 18 et de 14 (a = 18 et b = 14)
et b (a > b) b 0 ; r = 18 modulo 14 = 4 ; a = 14 ; b = 4
Description informelle de lalgorithme : b 0 ; r = 14 modulo 4 = 2 ; a = 4 ; b = 2
1. Si b = 0, le PGCD est a ; FIN b 0 ; r = 4 modulo 2 = 0 ; a = 2 ; b = 0
2. sinon, b = 0 donc on sarrte
calculer r le reste de la division de a par b, 2 est le PGCD de 18 et de 14
puis remplacer a par b, puis b par r,
puis recommencer ltape prcdente

Richard Grin Programmation structure page 7 Richard Grin Programmation structure page 8

Transcription plus formelle Exemple de pseudo-langage


Il faut maintenant transcrire cette description Entrer a, b
informelle dans les termes de la programmation
tant que (b 0) rpter {
structure
r := a modulo b
a nest pas toujours vident
a := b
Il peut exister plusieurs transcriptions possibles
b := r
}
Afficher a

Richard Grin Programmation structure page 9 Richard Grin Programmation structure page 10

Preuve de programme/dalgorithme Complexit dun algorithme


Pour les programmes les plus simples il est Il existe le plus souvent plusieurs algorithmes
possible de dmontrer que le rsultat de pour rsoudre un problme
lalgorithme est correct La complexit dun algorithme mesure lefficacit
Le plus souvent la preuve est trop complexe et on dun algorithme en temps de calcul ou en quantit
se contente deffectuer des tests sur le de mmoire
programme crit dans le langage informatique On recherche des algorithmes qui ncessitent
La preuve de programme sappuie moins de temps de calcul ou (souvent
essentiellement sur les invariants de boucle (voir incompatible) moins despace mmoire
section dans la suite de ce cours)

Richard Grin Programmation structure page 11 Richard Grin Programmation structure page 12

2
Calcul de la complexit Notation O()
La complexit dpend le plus souvent de la taille La complexit est surtout importante pour les
n des donnes traiter grands nombres (toujours rapide si petit nombre)
Le calcul de la complexit dun algorithme donne Pour les grands nombres n est trs petit par
une valuation du nombre doprations rapport n
significatives en fonction de la taille n On dit que le tri par insertion est en O(n), ce qui
Par exemple, on dira quen moyenne (notion donne un ordre de grandeur pour lefficacit du tri
probabiliste car dpend des donnes) le tri par par insertion
insertion de n lments ncessite (n - n) / 4 Les meilleurs algorithmes de tri sont en O(n log n)
oprations de comparaison entre lments trier

Richard Grin Programmation structure page 13 Richard Grin Programmation structure page 14

Classes de complexit Exemple


Les algorithmes les plus rapides sont en O(1) : ne Pour trier 30.000 lments, il faudra environ
dpend pas de la taille des donnes traiter
900.000.000 comparaisons avec le tri par
Algorithme linaire : O(n) insertion qui est en O(n)
Logarithmique : O(log n), meilleur que O(n) 1.600.000 comparaisons avec un tri
Moins bons : quicksort qui est en O(n log n)
Polynomial : en O(np) pour un certain p
Exponentiel : en O(exp n) (catastrophique !)

Richard Grin Programmation structure page 15 Richard Grin Programmation structure page 16

Principe gnral de base


Un programme peut comporter des milliers, et
mme des millions dinstructions
Principe de la Impossible pour un dveloppeur davoir une vision
densemble et de grer cette complexit
programmation structure Il faut dcomposer le programme en lments plus
simples apprhender
Le discours de la mthode de Descartes : Diviser
chacune des difficults que jexaminerai en autant
de parcelles quil se pourrait, et quil serait requis
pour les rsoudre.
Richard Grin Programmation structure page 17 Richard Grin Programmation structure page 18

3
Programmation structure Principe
Une mauvaise dcomposition peut rendre le Un programme est dcompos en modules
problme encore plus difficile rsoudre Chaque module a une des structures de la
La programmation structure permet de bien programmation structure
dcomposer un programme complexe en parties En plus de permettre une bonne dcomposition,
plus simples comprendre ce principe offre un bon guide lors de lcriture du
programme puisque les structures de la
programmation structure sont simples et peu
nombreuses

Richard Grin Programmation structure page 19 Richard Grin Programmation structure page 20

Spcification des modules Spcification des modules


Lorsquon introduit un nouveau module dans la La spcification dit ce que lon veut obtenir mais
dcomposition, il faut le dfinir de faon prcise pas comment lobtenir
En effet, lorsquon cherchera le dcomposer Le comment sera donn lorsque le module
son tour, il ne faut pas avoir regarder ce qui sera dcompos son tour
lentoure
Il faut donner une spcification du module qui
dcrit
la situation de dpart (les pr-conditions)
ce qui sera obtenu la fin de lexcution du
module (les post-conditions)
Richard Grin Programmation structure page 21 Richard Grin Programmation structure page 22

Programmation par contrat Exemple de spcification


Le contrat du module est le suivant : Pour une mthode qui insre un nombre entier n
si on fournit au module des donnes qui satisfont dans une liste de nombres entiers l dj trie par
aux pr-conditions, le module assure quil rendra ordre croissant
un rsultat qui satisfera aux post-conditions void inserer(Liste l, int n)
Pr-condition :
la liste dentiers l est trie par ordre croissant
Post-condition :
le nombre n est ajout la liste l
la liste l est trie par ordre croissant

Richard Grin Programmation structure page 23 Richard Grin Programmation structure page 24

4
Structures de la
programmation structure
Chaque module a une des ces 3 structures :
suite de modules
Les structures de la alternative
programmation structure rptition

Richard Grin Programmation structure page 25 Richard Grin Programmation structure page 26

Suite Exemple
Faire Traitement 1 puis Traitement 2 Saisir une fraction (x / y)
Chaque module a lui-mme une des Rduire la fraction (on obtient a / b)
structures de la programmation m=a*b
structure
Cest le systme des poupes
russes qui sembotent les unes
dans les autres
Se gnralise en une suite de n
traitements (n > 2)

Richard Grin Programmation structure page 27 Richard Grin Programmation structure page 28

Alternative Exemple
si (x > y) {
max = x;
}
sinon {
max = y;
}
Variante (pour les cas o on ne fait rien si la
Si la condition est vraie, condition est fausse) :
faire Traitement 1, si (x > max) {
sinon, faire Traitement 2 max = x;
}
Richard Grin Programmation structure page 29 Richard Grin Programmation structure page 30

5
Rptition jusqu Exemple

Lordre naturel dexcution est rpter {


de haut en bas et de gauche droite ; x = x + 10;
on ajoute une flche pour indiquer
} jusqu (x < y)
un autre ordre

Rpter Traitement
jusqu ce que la condition ( de fin ) soit vraie

Richard Grin Programmation structure page 31 Richard Grin Programmation structure page 32

Rptition tant que Exemple


tant que (x < y) rpter {
x = x + 10;
}

Tant que condition est vraie,


rpter Traitement

Richard Grin Programmation structure page 33 Richard Grin Programmation structure page 34

Diffrence importante
Exemple
entre jusqu et tant que
rpter {
x = x + 10;
} jusqu (x >= y)
On commence par augmenter
x de 10, mme si x >= y
au dbut

Avec jusqu, le traitement est excut au


moins une fois

Richard Grin Programmation structure page 35 Richard Grin Programmation structure page 36

6
Rptition pour Exemple
Cas particulier de la boucle tant que pour i de 1 20 rpter {
Utilis quand on sait au moment de lcriture de s = s + i;
lalgorithme combien de fois la boucle va tre }
parcourue
Pour i de 1 n rpter Traitement
i sappelle la variable de boucle

Richard Grin Programmation structure page 37 Richard Grin Programmation structure page 38

Cette section est rserve aux curieux qui


souhaiteraient avoir une ide de la faon de
prouver un algorithme en utilisant des invariants
Complment sur les de boucle
invariants de boucle Il peut tre intressant de prouver des parties de
programmes si on veut tre certain davoir bien
pris en compte tous les cas de figure

Richard Grin Programmation structure page 39 Richard Grin Programmation structure page 40

Rappel sur les boucles Invariant de boucle


Essentiellement 2 types de boucle : Un invariant de boucle est une expression
Tant que (condition) rpter traitement boolenne toujours vraie au dbut et la fin dune
Rpter traitement jusqu (condition_de_fin) certaine boucle
On peut se passer du 2me type qui peut tre Pour dmontrer quune expression boolenne est
remplac par : un invariant de boucle, il suffit de dmontrer que
traitement suivi de tant que(non condition_de_fin) linvariant est vrai juste avant la boucle et que
rpter traitement
si lexpression est vraie au dbut de la boucle,
La suite de cette section ne considrera que les
et si la condition de rptition est vraie,
boucles tant que
alors lexpression est vraie la fin de la boucle
Appelons condition de rptition la condition
dune boucle tant que
Richard Grin Programmation structure page 41 Richard Grin Programmation structure page 42

7
Invariant de boucle Preuve de la boucle

Invariant de boucle :
Il faut prouver que la boucle se terminera, ce qui
Entrer a, b est vident puisque b est un entier positif qui
les diviseurs de a0
a0 = a; b0 = b et de b0 sont les dcrot (dfinition du reste de la division entire :
tant que (b 0) rpter { mmes que ceux de a = bq + r avec r < b)
a et de b.
r := a modulo b A la fin on doit trouver que a est bien le PGCD des
a0 et b0 ont t
a := b introduits pour 2 nombres du dpart, compte tenu de linvariant
faciliter lexpression de boucle et que la condition de rptition est
b := r
de linvariant de fausse (puisquon est sorti de la boucle)
} boucle Cest vrai car lensemble des diviseurs du a final
Afficher a est lensemble des diviseurs des a et b du dpart
Richard Grin Programmation structure page 43 Richard Grin Programmation structure page 44

Suite de traitements
Suite dinstructions lmentaires :
int x = 3;
int y = x + 8;
Bloc avec des accolades
Traduction en Java Un traitement peut tre reprsent en Java par un
appel de mthode (tudi plus loin dans le cours)

Richard Grin Programmation structure page 45 Richard Grin Programmation structure page 46

Alternative Alternative
if (x >= 0) { Possible de ne pas mettre daccolades sil ny a
x = x + 1; quune seule instruction dans le if ou le else
}
if (x >= 0)
else {
x = x + 1;
x = -x + 1;
else
y++;
x = -x + 1;
}
if (x >= 0)
Variante : x = x + 1;
if (x >= 0) {
x = x + 1; Pas recommand, car source derreurs !
}

Richard Grin Programmation structure page 47 Richard Grin Programmation structure page 48

8
Alternative Exemple
Lorsque plusieurs if sont embots les uns dans x = 3;
les autres, un bloc else se rattache au dernier y = 8; Quelle valeur pour x
if qui na pas de else if (x == y) la fin de ce code ?
if (x > 10)
x = x + 1;
else Facile de se tromper
x = x + 2; si on ne met pas
daccolades,
surtout si on indente
mal son code !

Richard Grin Programmation structure page 49 Richard Grin Programmation structure 50

Exemple Expressions boolennes


x = 3; Ce sont des expressions dont le type Java est
y = 8; boolean ; elles peuvent avoir 2 valeurs : true
if (x == y) { (vrai) ou false (faux)
if (x > 10) {
Mettre des accolades
vite de se tromper ! Elles sont utilises par if ou par les rptitions
x = x + 1; (comme condition pour refaire une boucle)
}
Oprateurs et , ou , non ; en Java
} && , || , !
else {
x = x + 2;
}

Richard Grin Programmation structure 51 Richard Grin Programmation structure page 52

Exemples Distinction de cas suivant une valeur


x >= 0 Java a une instruction qui permet de simplifier du
(x != 0) && (y / x > 2.3) // raccourci code avec des if embots dans le cas o la
(x == 0) || (y / x > 2.3) // raccourci condition dpend de la valeur dune expression
! ((x == 0) || (y / x > 2.3))

Richard Grin Programmation structure page 53 Richard Grin Programmation structure page 54

9
switch Exemple de switch
switch(expression) { char lettre;
case val1: instructions; int nbVoyelles = 0, nbA = 0,
break; Attention, sans break, les nbT = 0, nbAutre = 0;
... instructions du cas suivant . . .
sont excutes ! switch (lettre) {
case valn: instructions;
case 'a' : nbA++;
break;
case 'e' : // pas dinstruction !
default: instructions;
case 'i' : nbVoyelles++;
}
break;
expression est de type char, byte, short, ou int case 't' : nbT++;
(ou String depuis le JDK 7) break;
default : nbAutre++;
Sil ny a pas de clause default, rien nest excut }
si expression ne correspond aucun case
Richard Grin Programmation structure 55 Richard Grin Programmation structure 56

Rptition jusqu Exemples en Java tant que


do { while (x < 8) {
x++; x++;
} while (x < 8) }
Quelle valeur aura x aprs ce code ? Quelle valeur aura x aprs ce code ?

Richard Grin Programmation structure page 57 Richard Grin Programmation structure page 58

Rptition pour Rptition pour


La boucle for de Java est plus gnrale que
pour ; la boucle for peut faire tout autre chose
que dincrmenter la variable de boucle
Le plus souvent la variable de boucle est
dclare lintrieur de linstruction dinitialisation
de for (sa porte est alors limite la boucle) :
for (int i = 0; ; )
En Java :
for (initialisations ; test ; modifications) {
instructions dans la boucle
}
Richard Grin Programmation structure page 59 Richard Grin Programmation structure page 60

10
Exemple typique de rptition pour Exercice
initialisations test modifications
for (int i = 0; i < 3; i++) { Reconstituer la structure pour laide des
instructions dans la boucle autres structures de la programmation structure
} Utiliser les poupes russes en donnant
Question : combien de fois les instructions dans la plusieurs tapes, chaque tape nutilisant quune
boucle seront-elles excutes ? seule structure de la programmation structure

Richard Grin Programmation structure page 61 Richard Grin Programmation structure page 62

Saut depuis une boucle en Java Exemple de continue et break


Pas prvu dans la programmation structure ; il int somme = 0;
faut jouer sur la condition de sortie pour sortir for (int i = 0; i < 10; i++) {
dune sortie en son milieu if (i % 2 == 0) continue;
Prvu dans la plupart des langages informatique if (somme > 4) break;
somme = somme + i;
car bien pratique
}
En Java, 2 instructions : break et continue System.out.println(somme);
break fait sortir de la boucle ; lexcution se
poursuit juste aprs la fin de la boucle Quaffiche ce code ?
continue reste dans la boucle mais saute la fin
de la boucle en cours
Richard Grin Programmation structure page 63 Richard Grin Programmation structure 64

11

Вам также может понравиться