Différences entre les versions de « Introduction à Maple/Procédures »

passage au geshi
(passage au geshi)
| titre = Procédures
| idfaculté = informatique
| leçon = [[Introduction à Maple../]]
| numero = 6
| précédent = [[Introduction à Maple../Listes, tableaux, matrices|Listes, tableaux, matrices/]]
| suivant = [[../Bibliothèques de fonctions|Bibliothèques de fonctions/]]
| niveau = 13
}}
Pour l'utiliser, on pourra écrire :
 
<source lang="text">
:<code>MoudreCafe(T, V) ;</code>
MoudreCafe(T, V) ;
</source>
 
Enfin, une procédure peut se comporter comme une fonction : elle peut retourner une (ou plusieurs) valeur(s) lorsqu'elle est appelée. La différence tient surtout au fait qu'une procédure permet de faire beaucoup plus de choses qu'une fonction. En contrepartie, il ne faut pas espérer dériver, tracer… une procédure.
Voici l'exemple complet :
 
<source lang="text">
:<code>MaProcedure := proc(a,b,c)</code>
:<code> xMaProcedure := proc(a+,b+,c;</code>)
x := a+b+c;
:<code>end proc;</code>
end proc;
</source>
 
Cette procédure prend trois arguments et retourne la somme des trois. En effet, une procédure retourne par défaut le dernier calcul effectué ou la dernière évaluation faite. Ici, l'affectation à la variable <code>x</code> sera retournée. Par exemple :
 
 
:<code>MaProcedure(1,2,3);</code> retourne <code>6</code> ;
Exemple d'illustration :
 
<source lang="text">
:<code>retourner := proc(x);</code>
retourner := proc(x);
:<code> for i from 1 to x do</code>
for i from 1 to x do
:<code> return(i);</code>
return(i);
:<code> od;</code>
od;
:<code>end proc;</code>
end proc;
</source>
 
Cette procédure inutile, ne retourne que la valeur 1 car c'est lors de la première itération de la boucle <code>for</code>, c'est-à-dire quand <code>i</code> possède la valeur 1, que le programme va retourner <code>i</code> et s'interrompre. Aucune autre itération ne sera effectuée, quelque-soit la valeur de <code>x</code> (pourvu tout de même qu'elle soit supérieure ou égale à 1).
On peut utiliser des variables dans les procédures Maple (elles sont dites « locales », ce sont par exemples les variables muettes des <code>for</code>). Pour cela, il n'est en pratique rien besoin de faire. Pour plus de clarté cependant, on prendra l'habitude de les préciser en début de code, avec le mot-clé <code>local</code>. Exemple :
 
<source lang="text">
:<code>MaProcedure := proc(a,b,c)</code>
MaProcedure := proc(a,b,c)
:<code> local x;</code>
local x;
:<code> …</code>
</source>
 
On peut également utiliser des variables accessibles depuis l'extérieur des procédures (dites « globales »), bien que cela soit moins courant. On utilise alors le mot-clé <code>global</code>.
Nous voudrions pouvoir exécuter une certaine opération si un nombre ''x'' est positif, et une autre opération s'il est négatif. Comment faire ? La réponse : utiliser des conditions. Voici la syntaxe Maple qui convient :
 
<source lang="text">
:<code>if ''condition'' then</code>
:<code> if ''code si condition vraie''</code> then
''code si condition vraie''
:<code>fi; </code>
fi;
</source>
 
La ''condition'' doit être une expression booléenne (vraie ou fausse), par exemple :
 
<source lang="text">
* <code>x > 3</code>
x > 3
* <code>(x > 3) and (x < 1)</code>
(x > 3) and (x < 1)
* <code>x = 12</code>
x = 12
</source>
 
Si on essaie d'utiliser une expression ouverte (par exemple, x + 3) Maple retourne une erreur. Notre code s'exécute ici uniquement si la condition est vraie. Si elle est fausse, rien n'est fait. Un petit raffinement :
 
<source lang="text">
:<code>if ''condition'' then</code>
:<code> if ''code si condition vraie''</code> then
''code si condition vraie''
:<code>else
else
:<code> ''code si condition fausse''</code>
''code si condition fausse''
:<code>fi; </code>
fi;
</source>
 
{{Attention
{{Attention|Avec_fond=oui|En anglais, ''if… then… else…'' signifie littéralement ''si… alors… sinon…''.}}
| Avec_fond = oui
| En anglais, ''if… then… else…'' signifie littéralement ''si… alors… sinon…''.
}}
 
Exemple :
 
<source lang="text">
:<code>Majeur := proc(age)</code>
Majeur := proc(age)
:<code>if age >= 18 then</code>
if age >= 18 then
:<code> "oui";</code>
"oui";
:<code>else</code>
else
:<code> "non";</code>
"non";
:<code>fi;</code>
fi;
:<code>end proc;</code>
end proc;
</source>
 
Ici, <code>"oui"</code> et <code>"non"</code> sont des chaines de caractères qui sont évaluées, donc retournées lors de la sortie de la procédure (car aucune autre valeur n'est évaluée par la suite).
Il est parfois nécessaire de répéter des instructions un nombre ''déterminé'' de fois. On peut pour cela utiliser l'instruction <code>for</code>, de la manière suivante :
 
<source lang="text">
:<code>for ''variable'' from ''debut'' to ''fin'' do</code>
for ''variable'' from ''debut'' to ''fin'' do
:<code>''code à répéter''</code>
''code à répéter''
:<code>od; </code>
od;
</source>
 
Écrire le code ci-dessus revient exactement à écrire la chose suivante:
 
<source lang="text">
:<code>variable = début;</code>
variable = début;
:<code>''code à répéter''</code>
''code à répéter''
:<code>variable = début + 1;</code>
variable = début + 1;
:<code>''code à répéter''</code>
''code à répéter''
:<code>variable = début +2;</code>
variable = début +2;
:<code>''code à répéter''</code>
''code à répéter''
:<code>…</code>
:<code>variable = fin;</code>
variable = fin;
:<code>''code à répéter''</code>
''code à répéter''
</source>
 
Utiliser <code>for</code> permet donc de condenser les choses. Voici un exemple clarifiant les choses :
 
<source lang="text">
:<code>x := NULL;</code>
x := NULL;
:<code>for i from 1 to 10 do</code>
for i from 1 to 10 do
:<code> x := x, i;</code>
x := x, i;
:<code>od;</code>
od;
:<code>[x];</code>
[x];
</source>
 
Étudions ce code ligne par ligne :
Pour calculer la factorielle de ''n'', nous calculons la factorielle de ''n-1''. Pour celle-ci, il nous faut (''n-2'')! ''etc.'' Voici le code associé :
 
<source lang="text">
:<code>factorielle := proc(n)</code>
factorielle := proc(n)
:<code> if n = 0 then</code>
if n = 0 then
:<code> 1;</code>
1;
:<code> else</code>
else
:<code> (n * factorielle(n-1));</code>
(n * factorielle(n-1))
:<code> fi;</code>
fi;
:<code>end;</code>
end;
</source>
 
Lorsqu'on exécute <code>factorielle(6)</code>, Maple affiche le bon résultat : <code>720</code>.
{{Bas de page
| idfaculté = informatique
| leçon = [[Introduction à Maple../]]
| précédent = [[Introduction à Maple../Listes, tableaux, matrices|Listes, tableaux, matrices/]]
| suivant = [[../Bibliothèques de fonctions|Bibliothèques de fonctions/]]
}}