Sébastien Verel
vereli3s.unie.fr
www.i3s.unie.fr/
∼
verelÉquipeSoBi-UniversitédeNieSophia-Antipolis
08 février2008
Objetifs de la séane 4
1
Connaîtrele prinipe de séparationde ode
2
Erire orretement unefontion maple
3
Comprendre et alulerle résultatd'un algorithmedonné
4
Modierunalgorithme donné
5
Utiliserune partied'algorithme donné
6
Corrigerun algorithmedonné
Question prinipaledujour :
Comment érireréutiliserlesalgorithmespourmoinsse fatiguer?
Choses enore mystérieuses
Vousavez éritdepuis quelquestempsmaintenant e genre de
programme Maple :
moyenne := pro(n)
loal a, m, i;
m := 0;
for i from 1 to n do
a := readstat(`taper un nombre `);
m := m + a;
od
m := m / n;
RETURN(m);
Choses enore mystérieuses
Ou enore :
deviner := pro(b)
loal a;
a := readstat(`tenter un nombre `);
while a <> b do
a := readstat(`tenter un autre nombre `);
od;
print(`gagne`)
end;
Choses mystèrieuses
Le oeur du programme vous estbien familier(!),mais ilreste
surement duoupour leontour
moyenne := pro(n)
loal a, m, i;
...
RETURN(m);
end;
ou enore
deviner := pro(b)
loal a;
end;
De même plus généralement
Nous allons donnerunsens pluspréisau ontour des
algorithmes:
Algorithme moyenne(n :entier) :réel
début
variable m,a:réel
variable i :entier
...
retournerm
n
Quelques préisions
Nous allons étudier:
les paramètres:à quoiservent-ils?ommentlesutiliser?
les valeurs retournées:quelstypesutiliser?
les variablesloales:ommentles utiliser?
Pour allerplusloin :laSéparationde ode
Plan
1
Paramètrerlesalgorithmes
Paramètres
Variables loales
Valeurs de sorties
2
Séparationde ode
3
Itérationsmultiples
Problématique
aluler lamoyenne de 10 notes
aluler lamoyenne de 20 notes
aluler lamoyenne de 100 notes
aluler lamoyenne de 3 notes
aluler lamoyenne de 0 notes
Problématique
Ne surtoutpas érireunalgorithmepourhaque situation :
m
←
0pour i de 1 à10 faire
lire(a )
m
←
m+
anpour
m
←
m/
nMais généraliseren introduisantunnombren à déterminerau
moment de l'exéution de l'algorithme.
Problématique
On voudrait pouvoir érireunalgorithmeplus général
m
←
0pour i de 1 àn faire
lire(a )
m
←
m+
anpour
m
←
m/
nSolutions
2 solutionspossibles :
Demander lavaleurde n dansl'algorithmemoyenne :
érire(Taperle nombrede nombres )
lire(n)
Ce n'estpas unebonne solutionpuisquemaintenant l'algorithme
moyenne eetuedeux hoses: demanderlenombrede notes ET
aluler lamoyenne.
Mettre n en paramètre de l'algorithmemoyenne :
Algorithme moyenne(n :entier):réel
Autre problème
Erire unalgorithme quidétermineleplusgros gâteau(en kg)
parmi3
si a<balors
sib<alors
retourner
sinon
retourner b
nsi
sinon
sia <alors
retourner
sinon
retourner a
nsi
n si
Autre problème
2possiblitésd'algorithme
Algorithme plusGros():réel
début
variable a, b,:réel
lire(a)lire(b) lire()
si a<balors
sib<alors
retourner
sinon
retourner b
n si
sinon
sia <alors
retourner
sinon
retourner a
n si
n si
SébastienVerel Séparationdeodesetfontions
Autre problème
2possiblitésd'algorithme
Algorithme plusGros(a:réel,b:réel,: réel):réel
début
si a<balors
sib<alors
retourner
sinon
retourner b
n si
sinon
sia <alors
retourner
sinon
retourner a
n si
n si
Algorithme plusGros à préfèrer
Le seond algorithme estmeilleurpuisqu'il orrespondànos
attentes:
Seulement déterminerle plusgrosgâteau (enkg) àpartirde
données.
et nonréaliseren pluslatahe de saisiede espoids
Quand utiliser un (des) paramètre(s)?
L'algorithmedoit-ilrésoudreunensemble de problèmes
dépendantde paramètres?
Peut-on généraliserl'algorithmeàl'aidede variables?
Larésolutionduproblème néessite-t-elledesdonnées
externes?
Si oui àmoinsunedesquestions:
−→
utiliserun algorithmeparamètréà l'aidede variablesComment érire un algorithme paramètré?
Algorithme nomAlgo(nom1:type1,nom2 :type2,nom3 :
type3,...) :type
début
...
n
nom1,nom2,nom3 sontdesnomsde variables
type1,type2,type3 sont lestypesdesvariables
orrespondantes (booléen, entier,réel,mot,...)
Exemple
Caluler lalongueur de l'hypothénused'un triangleretangle
Algorithme hypothenuse(a :réel, b:réel) :réel
début
...
n
Paramètres eetifs et formels
Algorithme hypothenuse(a :réel, b:réel) :réel
début
...
n
Les valeurs desparamètressontdéterminéslors de l'algorithme:
←
hypothenuse(3,4)aet b sontdesParamètresformels:ilsreprésentent des
nombres quelonques.
3 et4 sontdesParamètreseetifs :valeurs des paramètres
réellement utilisés.
En Maple...
Maple est unlangage faiblementtypé,
e quisignie quelaprésene destypespour haque variablen'est
pas néessaire, voire impossible.
nomAlgo := pro(nom1, nom2, nom3)
...
end;
nom1,nom2,nom3 sontdesnomsde variablesquipeuvent être
de typequelonque
Remarques:
ily aun ; après leend
En Maple
Pour larierl'utilisationde vosprogrammeset éviterles erreurs,je
vous onseille trèsfortement d'ajouterdes ommentairespour
indiquer letype etlasigniation desvariablesparamètres
nomAlgo := pro(a, b, )
# a : reel, poids du premier gateau
# b : reel, poids du deuxième gateau
# : reel, poids du troisième gateau
...
end;
le "
♯
" permetd'érire unommentaire,lereste de laligne n'est pas exéutéeUtilisation de variables dans un algorithme
Il est souvent néessaired'enregistrerdes résultatsintermédiaresau
ours d'un algorithme:
Algorithme moyenne(n :entier) :réel
début
variable m,a:réel
variable i :entier
...
retournerm
n
m,aet i sontdesvariables loales àl'algorithme.
Remarque :
Porté des variables loales
Les valeurs desvariablesloales(m,aet i) ne sontaessiblesque
dans etalgorithme,'est-à-dire entredébut et n.
Algorithme moyenne(n :entier) :réel
début
variable m,a:réel
variable i :entier
...
retournerm
n
moyenne(5)
m
←
m+
3Cette dernièrelignen'apas de sens,m n'existepasà l'extérieurde
l'algorithme.
Porté des variables loales
Les valeurs desvariablesloalesn'altèrentpas les valeurs des
variablesportant lemême nom àl'extérieurde l'algorithme.
variable m:réel
m
←
2moyenne(5)
m
←
m+
3érire(m)
Variables loales et paramètres
Les variablesdélarées en paramètre desalgorithmessontdes
variablesloales àl'algorithmeaveles mêmespropriétés.
Remarquesdans e ours :
les valeurs initialesdesvariablesen paramètresontelles
donnéesen appelant l'algorithme(passageparvaleur)
iln'est pas possiblede modierla valeurd'unevariablepar
l'appeld'un algorithme (pasde passageparadresse)
En Maple...
Les variablesloalessedélarent àl'aidedumotlé loal :
deviner := pro(b)
loal a;
...
end;
Enore unefois,iln'est pas possiblede délarer letype et donil
est fortementonseillé d'ériredesommentairespour indiquerla
sémantique de lavariableetsontype.
En Maple
Les variablesdélarées en paramètre ne peuvent êtremodiées.
deviner := pro(b)
loal a;
...
b := b + 2;
end;
−→
InterditparMapleLa valeurde b ne peut êtremodiée
Variable globale Maple
Une proédure maplepeutmodierlavaleurd'unevariabledélarée
à l'extérieurede laproédure.
n := 5;
plus1 := pro()
n := n + 1;
end;
print(n);
m apour valeur6
On parlealors devariableglobale paroppositionàvariableloale.
Variable globale Maple
Il faut évitere genre de proéder pouréviter les modiations
malheureuses et inattendues.
Il vaut mieuxérire:
n := 5;
plus1 := pro(n)
RETURN(n + 1);
end;
n := plus1(n);
print(n);
Valeur de sortie
Il existe deuxpossibilitéspourles algorithmes :
retournerune valeurdont letypeest déterminé
Algorithme moyenne(n :entier) :réel
début
ne retournerauune valeur :on noteraletype de retourrien
Algorithme deviner(n :entier) :rien
début
On indique lavaleur retournéeà l'aidede l'opération:
retournervaleur
Auune opérationne s'exéute aprèsette opération.
En Maple
Il n'y pas depossibilitépourindiquer letypede retour.
On ne peut donseulement quel'indiquer en ommentaire
On indique lavaleurretournée (s'ily en a une)par:
RETURN( valeur );
Quoi t'est-e?
Maintenantque nousavonsdes algorithmesmodulaires ave
desdonnées en entrée,desvaleurs de sortieet untraitement
loalbiendéni
Possibilitéde déouperle ode en modulesindépendants
An d'assemblerles modules en de gros algorithmes
Avantages à séparer le ode en plusieurs sous-algorithmes?
Limitationsdeserreurs:
plusun algorithmeest ourtmoinsily a d'erreurs
Algorithmesplusfailes àérire:
Coneption desendante(du généraleau partiulier)
Algorithmesréutilisables:
plusfaile àadapter, àreprendrepour d'autrealgorithme
(bibliothèque)
Fatorisation de l'algorithme :
ne pas érirebeauoups de fois lesmêmesalgorithmes
Sous-algorithme
Un sous-algorithmeest unalgorithme.
Algorithme monAlgo(paramètres) :type
début
...
...
retournervaleur
n
Exemple
♯
alullasommede deux nombresentiers taperaulavierAlgorithme somme() :entier
début
♯
nombresàsaisirvariable a , b :entier
a
←
saisir10()b
←
saisir10()retournera
+
bn
Exemple
♯
saisirun entierentre 0et 10Algorithme saisir10( ):entier
début
variable a:entier
lire(a )
tant quea
<
0??10<
a faireérire(nombreinorret,veuillezretaperunnombreentre0 et
10)
lire(a )
ntant que
retournera
n
Exemple
♯
saisirun entierentre 0et 10Algorithme saisir10( ):entier
début
variable a:entier
lire(a )
tant quea
<
0OU 10<
afaireérire(nombreinorret,veuillezretaperunnombreentre0 et
10)
lire(a )
ntant que
retournera
n
Exemple : mieux
♯
saisirun entierentre infet supAlgorithme saisir(inf:entier,sup :entier):entier
début
variable a:entier
lire(a )
tant quea
<
inf OUsup<
a faireérire(nombreinorret,veuillez retaperunnombre entre,
inf, et ,sup)
lire(a )
ntant que
retournera
n
Exemple de réutilisation
Petitjeuoùl'ondoitdevinerunnombremystèreentre0et100
Algorithme deviner(n :entier) :rien
début
variable a:entier
a
←
0tant quea
6=
n fairelire(a )
si a
<
n alorsérire(troppetit)
sinon
érire(tropgrand)
nsi
ntant que
érire("gagné")
n
Exemple de réutilisation
Petitjeuoùl'ondoitdevinerunnombremystère
Algorithme deviner(n :entier) : rien
début
variable a:entier
a
←
0tant quea
6=
n fairea
←
saisir(0,100)si a
<
n alorsérire(troppetit)
sinon
érire(tropgrand)
nsi
ntant que
érire("gagné")
boules imbriquées
Boulesdetype"pour"imbriquées
variable i,j :entier
pour i de 1à n faire
pourj de 1àpfaire
algorithme A
npour
npour
si p ne dépend pas de lavaleurde i
alorsl'algorithmeAs'exéute n
×
p.si p dépend de i,
alors l'algorithme As'exéute
P
ni
=
1p(
i)
Itérations multiples
Attention:suessionde 2 boules
6=
boulesimbriquéesvariable i,j :entier
pour i de 1à n faire
algorithmeA
npour
pour j de 1 àp faire
algorithmeB
npour
l'algorithmeAs'exéute n fois
Puis,
l'algorithmeB s'exéutep fois
Que vaut x à la n de haun des algorithmes suivants?
Algo1 :
x
←
0pour i de 1à n faire
pour j de 1 à p faire
x
←
x+
1npour
npour
Algo2 :
x
←
0pour i de 1à n faire
pour j de 1 à i faire
x
←
x+
1npour
npour
Algo3 :
x
←
0pour i de 1à n faire
x
←
x+
1npour
pour j de 1 àp faire
x
←
x+
1npour
Que vaut x à la n de haun des algorithmes suivants?
Algo1 :
Labouleen "j"ajoutep fois1,
don àhaque exéutionde ette boule en "j",x est
augmenté de p.Labouleen "i" ajouten fois p àx
don après esboulesx
=
n×
p.Algo2 :
Labouleen "j"ajoutei fois 1,
don àhaque exéutionde ette boule en "j",x est
augmenté de i.Labouleen "i"aluledon
1
+
2+
3+ . . . +
ndon après esboulesx
= P
ni
=
1i=
n(
n+
1)
2
Que vaut x à la n de haun des algorithmes suivants?
Algo3 :
Labouleen "i" ajouten fois 1,
don après ette boule,x estaugmenté de n.Labouleen
"j"ajoutep fois1 àx
don après esboulesx
=
n+
p.Boules imbriquées
Exempleenmaple
tablesMultipliation := pro(n)
loal i, j;
for i from 1 to n do
for j from 1 to n do
print(i, ` fois `, j, ` est égale a `, i*j);
od;
od;
end;
tablesMultipliation(10);
Objetifs de la séane 4
1
Connaîtrele prinipe de séparationde ode
2
Erire orretement unefontion maple
3
Comprendre et alulerle résultatd'un algorithmedonné
4
Modierunalgorithme donné
5
Utiliserune partied'algorithme donné
6
Corrigerun algorithmedonné
Question prinipaledujour :
Comment ériredeouperles algorithmespour mieuxrégner?
Travail de doumentation
Trouver de ladoumentationen rapportavel'ensemblede
l'enseignement.
Quels sontvosréférenes?