Vous êtes sur la page 1sur 11

Plan

Programmation structure

Algorithme
Principe de base de la 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

Richard Grin

Programmation structure

Algorithme

page 3

Richard Grin

Algorithme

Programmation structure

Programme et algorithme

Lenchanement des oprations lmentaires qui


permettent de rsoudre un problme sappelle un
algorithme
Nimporte quelle machine ou individu qui suit la
lettre lalgorithme obtiendra le bon rsultat, mme sil
ne comprend pas ce quil fait

Richard Grin

Programmation structure

Un programme est crit dans un langage qui peut


tre excut par une machine
Un algorithme est crit dans un pseudo-langage,
souvent proche dun langage informatique mais
dbarrass de dtails techniques lis aux
langages informatiques ou la machine, qui
gnent la comprhension du cheminement
logique

Richard Grin

Programmation structure

page 6

Exemple de calcul de PGCD

Exemple : algorithme dEuclide


On cherche le PGCD de deux entiers naturels a
et b (a > b)
Description informelle de lalgorithme :
1. Si b = 0, le PGCD est a ; FIN
2. sinon,
calculer r le reste de la division de a par b,
puis remplacer a par b, puis b par r,
puis recommencer ltape prcdente

Richard Grin

Richard Grin

Programmation structure

page 7

PGCD de 18 et de 14 (a = 18 et b = 14)
b 0 ; r = 18 modulo 14 = 4 ; a = 14 ; b = 4
b 0 ; r = 14 modulo 4 = 2 ; a = 4 ; b = 2
b 0 ; r = 4 modulo 2 = 0 ; a = 2 ; b = 0
b = 0 donc on sarrte
2 est le PGCD de 18 et de 14

Transcription plus formelle

Programmation structure

page 8

Exemple de pseudo-langage

Il faut maintenant transcrire cette description


informelle dans les termes de la programmation
structure
a nest pas toujours vident
Il peut exister plusieurs transcriptions possibles

Richard Grin

Programmation structure

page 9

Entrer a, b
tant que (b 0) rpter {
r := a modulo b
a := b
b := r
}
Afficher a

Richard Grin

Programmation structure

page 10

Preuve de programme/dalgorithme

Complexit dun algorithme

Pour les programmes les plus simples il est


possible de dmontrer que le rsultat de
lalgorithme est correct
Le plus souvent la preuve est trop complexe et on
se contente deffectuer des tests sur le
programme crit dans le langage informatique
La preuve de programme sappuie
essentiellement sur les invariants de boucle (voir
section dans la suite de ce cours)

Il existe le plus souvent plusieurs algorithmes


pour rsoudre un problme
La complexit dun algorithme mesure lefficacit
dun algorithme en temps de calcul ou en quantit
de mmoire
On recherche des algorithmes qui ncessitent
moins de temps de calcul ou (souvent
incompatible) moins despace mmoire

Richard Grin

Richard Grin

Programmation structure

page 11

Programmation structure

page 12

Calcul de la complexit

Notation O()

La complexit dpend le plus souvent de la taille


n des donnes traiter
Le calcul de la complexit dun algorithme donne
une valuation du nombre doprations
significatives en fonction de la taille n
Par exemple, on dira quen moyenne (notion
probabiliste car dpend des donnes) le tri par
insertion de n lments ncessite (n - n) / 4
oprations de comparaison entre lments trier

La complexit est surtout importante pour les


grands nombres (toujours rapide si petit nombre)
Pour les grands nombres n est trs petit par
rapport n
On dit que le tri par insertion est en O(n), ce qui
donne un ordre de grandeur pour lefficacit du tri
par insertion
Les meilleurs algorithmes de tri sont en O(n log n)

Richard Grin

Programmation structure

page 13

Richard Grin

Classes de complexit

Programmation structure

page 14

Exemple

Les algorithmes les plus rapides sont en O(1) : ne


dpend pas de la taille des donnes traiter
Algorithme linaire : O(n)
Logarithmique : O(log n), meilleur que O(n)
Moins bons :
Polynomial : en O(np) pour un certain p
Exponentiel : en O(exp n) (catastrophique !)

Richard Grin

Programmation structure

page 15

Pour trier 30.000 lments, il faudra environ


900.000.000 comparaisons avec le tri par
insertion qui est en O(n)
1.600.000 comparaisons avec un tri
quicksort qui est en O(n log n)

Richard Grin

Programmation structure

page 16

Principe gnral de base


Un programme peut comporter des milliers, et
mme des millions dinstructions
Impossible pour un dveloppeur davoir une vision
densemble et de grer cette complexit
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.

Principe de la
programmation structure

Richard Grin

Programmation structure

page 17

Richard Grin

Programmation structure

page 18

Programmation structure

Principe

Une mauvaise dcomposition peut rendre le


problme encore plus difficile rsoudre
La programmation structure permet de bien
dcomposer un programme complexe en parties
plus simples comprendre

Un programme est dcompos en modules


Chaque module a une des structures de la
programmation structure
En plus de permettre une bonne dcomposition,
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

Richard Grin

Programmation structure

page 19

Spcification des modules

Programmation structure

page 20

Spcification des modules

Lorsquon introduit un nouveau module dans la


dcomposition, il faut le dfinir de faon prcise
En effet, lorsquon cherchera le dcomposer
son tour, il ne faut pas avoir regarder ce qui
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

La spcification dit ce que lon veut obtenir mais


pas comment lobtenir
Le comment sera donn lorsque le module
sera dcompos son tour

Richard Grin

Programmation structure

page 22

Programmation par contrat

Exemple de spcification

Le contrat du module est le suivant :


si on fournit au module des donnes qui satisfont
aux pr-conditions, le module assure quil rendra
un rsultat qui satisfera aux post-conditions

Pour une mthode qui insre un nombre entier n


dans une liste de nombres entiers l dj trie par
ordre croissant
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

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

Les structures de la
programmation structure

Richard Grin

Programmation structure

page 25

Richard Grin

Suite

Programmation structure

page 27

Saisir une fraction (x / y)


Rduire la fraction (on obtient a / b)
m=a*b

Richard Grin

page 28

si (x > y) {
max = x;
}
sinon {
max = y;
}
Variante (pour les cas o on ne fait rien si la
condition est fausse) :
si (x > max) {
max = x;
}

Si la condition est vraie,


faire Traitement 1,
sinon, faire Traitement 2
Programmation structure

Programmation structure

Exemple

Alternative

Richard Grin

page 26

Exemple

Faire Traitement 1 puis Traitement 2


Chaque module a lui-mme une des
structures de la programmation
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 29

Richard Grin

Programmation structure

page 30

Rptition jusqu

Exemple

Lordre naturel dexcution est


de haut en bas et de gauche droite ;
on ajoute une flche pour indiquer
un autre ordre

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

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

Richard Grin

Programmation structure

page 31

Richard Grin

Rptition tant que

Programmation structure

page 32

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

Tant que condition est vraie,


rpter Traitement

Richard Grin

Programmation structure

page 33

Richard Grin

Diffrence importante
entre jusqu et tant que

Programmation structure

page 34

Exemple
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

Rptition pour

Exemple

Cas particulier de la boucle tant que


Utilis quand on sait au moment de lcriture de
lalgorithme combien de fois la boucle va tre
parcourue
Pour i de 1 n rpter Traitement
i sappelle la variable de boucle

pour i de 1 20 rpter {
s = s + i;
}

Richard Grin

Richard Grin

Programmation structure

page 37

Programmation structure

page 39

Richard Grin

Rappel sur les boucles


Tant que (condition) rpter traitement
Rpter traitement jusqu (condition_de_fin)

On peut se passer du 2me type qui peut tre


remplac par :
traitement suivi de tant que(non condition_de_fin)
rpter traitement
La suite de cette section ne considrera que les
boucles tant que
Appelons condition de rptition la condition
dune boucle tant que
Programmation structure

Programmation structure

page 40

Invariant de boucle

Essentiellement 2 types de boucle :

Richard Grin

page 38

Cette section est rserve aux curieux qui


souhaiteraient avoir une ide de la faon de
prouver un algorithme en utilisant des 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

Complment sur les


invariants de boucle

Richard Grin

Programmation structure

page 41

Un invariant de boucle est une expression


boolenne toujours vraie au dbut et la fin dune
certaine boucle
Pour dmontrer quune expression boolenne est
un invariant de boucle, il suffit de dmontrer que
linvariant est vrai juste avant la boucle et que
si lexpression est vraie au dbut de la boucle,
et si la condition de rptition est vraie,
alors lexpression est vraie la fin de la boucle
Richard Grin

Programmation structure

page 42

Preuve de la boucle

Invariant de boucle
Entrer a, b
a0 = a; b0 = b
tant que (b 0) rpter {
r := a modulo b
a := b
b := r
}
Afficher a
Richard Grin

Invariant de boucle :
les diviseurs de a0
et de b0 sont les
mmes que ceux de
a et de b.
a0 et b0 ont t
introduits pour
faciliter lexpression
de linvariant de
boucle

Programmation structure

page 43

Il faut prouver que la boucle se terminera, ce qui


est vident puisque b est un entier positif qui
dcrot (dfinition du reste de la division entire :
a = bq + r avec r < b)
A la fin on doit trouver que a est bien le PGCD des
2 nombres du dpart, compte tenu de linvariant
de boucle et que la condition de rptition est
fausse (puisquon est sorti de la boucle)
Cest vrai car lensemble des diviseurs du a final
est lensemble des diviseurs des a et b du dpart
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

Richard Grin

Programmation structure

Un traitement peut tre reprsent en Java par un


appel de mthode (tudi plus loin dans le cours)

page 45

Richard Grin

Programmation structure

Alternative

Alternative

if (x >= 0) {
x = x + 1;
}
else {
x = -x + 1;
y++;
}

Possible de ne pas mettre daccolades sil ny a


quune seule instruction dans le if ou le else
if (x
x =
else
x =
if (x
x =

Variante :
if (x >= 0) {
x = x + 1;
}
Richard Grin

page 46

>= 0)
x + 1;
-x + 1;
>= 0)
x + 1;

Pas recommand, car source derreurs !

Programmation structure

page 47

Richard Grin

Programmation structure

page 48

Alternative

Exemple

Lorsque plusieurs if sont embots les uns dans


les autres, un bloc else se rattache au dernier
if qui na pas de else

Richard Grin

Programmation structure

page 49

x = 3;
y = 8;
if (x == y)
if (x > 10)
x = x + 1;
else
x = x + 2;

Richard Grin

Exemple
x = 3;
y = 8;
if (x == y) {
if (x > 10) {
x = x + 1;
}
}
else {
x = x + 2;
}
Richard Grin

51

Programmation structure

50

Richard Grin

Programmation structure

page 52

Distinction de cas suivant une valeur

x >= 0
(x != 0) && (y / x > 2.3) // raccourci
(x == 0) || (y / x > 2.3) // raccourci
! ((x == 0) || (y / x > 2.3))

Richard Grin

Programmation structure

Ce sont des expressions dont le type Java est


boolean ; elles peuvent avoir 2 valeurs : true
(vrai) ou false (faux)
Elles sont utilises par if ou par les rptitions
(comme condition pour refaire une boucle)
Oprateurs et , ou , non ; en Java
&& , || , !

Exemples

Facile de se tromper
si on ne met pas
daccolades,
surtout si on indente
mal son code !

Expressions boolennes

Mettre des accolades


vite de se tromper !

Programmation structure

Quelle valeur pour x


la fin de ce code ?

Java a une instruction qui permet de simplifier du


code avec des if embots dans le cas o la
condition dpend de la valeur dune expression

page 53

Richard Grin

Programmation structure

page 54

Exemple de switch

switch
switch(expression) {
case val1: instructions;
break;
...
case valn: instructions;
break;
default: instructions;
}

Attention, sans break, les


instructions du cas suivant
sont excutes !

expression est de type char, byte, short, ou int


(ou String depuis le JDK 7)
Sil ny a pas de clause default, rien nest excut
si expression ne correspond aucun case
Richard Grin

Programmation structure

55

Rptition jusqu

char lettre;
int nbVoyelles = 0, nbA = 0,
nbT = 0, nbAutre = 0;
. . .
switch (lettre) {
case 'a' : nbA++;
case 'e' :
// pas dinstruction !
case 'i' : nbVoyelles++;
break;
case 't' : nbT++;
break;
default : nbAutre++;
}
Richard Grin

Programmation structure

Exemples en Java tant que

do {
x++;
} while (x < 8)

while (x < 8) {
x++;
}

Quelle valeur aura x aprs ce code ?

Quelle valeur aura x aprs ce code ?

Richard Grin

Programmation structure

56

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


initialisations
test modifications
for (int i = 0; i < 3; i++) {
instructions dans la boucle
}

Question : combien de fois les instructions dans la


boucle seront-elles excutes ?

Richard Grin

Programmation structure

page 61

Pas prvu dans la programmation structure ; il


faut jouer sur la condition de sortie pour sortir
dune sortie en son milieu
Prvu dans la plupart des langages informatique
car bien pratique
En Java, 2 instructions : break et continue
break fait sortir de la boucle ; lexcution se
poursuit juste aprs la fin de la boucle
continue reste dans la boucle mais saute la fin
de la boucle en cours
Programmation structure

Reconstituer la structure pour laide des


autres structures de la programmation structure
Utiliser les poupes russes en donnant
plusieurs tapes, chaque tape nutilisant quune
seule structure de la programmation structure

Richard Grin

Programmation structure

page 62

Exemple de continue et break

Saut depuis une boucle en Java

Richard Grin

Exercice

page 63

int somme = 0;
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) continue;
if (somme > 4) break;
somme = somme + i;
}
System.out.println(somme);

Quaffiche ce code ?

Richard Grin

Programmation structure

64

11

Vous aimerez peut-être aussi