TP MAPLE N°3 : Algorithmique
1 Cours
Mots-Clés : algorithme, procédure ou programme c’est l’incarnation dans un langage de programmation d’un algorithme, argument d’une procédure (entrées de la procédure) et leur type, déclaration des variables et de leurs types, sortie des résultats, affichage des résultats, itération «for» et «while», structures conditionnelles, indentation (présentation lisible de la procédure), trace d’un programme.
1.1 Notion de procédure
C’est le «nom» que l’on donne à une suite d’instructions qui réalise une certaine tâche.
La syntaxe est la suivante :
nomdelaprocedure :=proc(arg1,arg2, ...,argn) local a,b,c ;
instructions ;
end ; ou end proc ; sur des versions plus récentes de Maple Les expressions arg1,arg2, ...,argn sont les arguments de notre procédure (entrées).
Dans cette procédure, on utilise 3 variables locales qu’on a baptisées a,b et c.
Remarques :
– Une fonction est un cas particulier de procédure, et on peut donc définir les fonctions à l’aide des procédures.
– on peut préciser le type des arguments que l’on utilise (mais ce n’est pas obligatoire).
Par exemple toto :=proc(arg1 : :posint,arg2 : :nonnegint,arg3 : :array,arg4 : :float) indique que dans la procédure toto, l’argument arg1 est un entier strictement positif, arg2 un entier naturel, arg3 un tableau, arg4 un nombre flottant.
– Dans certains langages de programmation (par exemple le C ou Java), il est obli- gatoire de «typer» les arguments, les variables et aussi la sortie (ce que renvoie le programme).
– il est possible de traduire une procédure Maple en programme en langage C avec l’instrution C.
1.2 La structure conditionnelle Si La syntaxe est la suivante :
if condition1 then instructions1 ; elif condition2 then
instructions2 ; else
instructions3 ; fi ;
L’instruction elif n’est nécéssaire que dans le cas de conditions avec au moins trois éventualités. On peut mettre autant de elif que l’on désire.
Remarque : on peut remplacer fi par end if sur les versions plus récentes de Maple.
Maple doit évaluer la valeur de vérité de propositions (renvoie un boléen). On peut
combiner ces propositions à l’aide des connecteurs logiques et (and), ou (or), non (not).
1.3 L’itération à l’aide de la fonction for
Pour répéter une opération on peut utiliser une boucle avec indice numérique. La syntaxe d’une telle boucle est la suivante :
for indice from début to fin by pas do instructions ;
od ;
L’indication du pas est optionnelle, par défaut, elle vaut 1.
Quand il y a plusieurs instructions de suite, il faut les séparer de par des « ;» ou des
« :».
Remarque : sur les versions plus récentes de Maple, le mot «od» peut être remplacée par «end do».
1.4 La boucle «tant que»
On utilise une boucle while (tant que) quand on veut répéter une opération mais que l’on ne connaît pas à l’avance le nombre d’itérations. Sa syntaxe est :
while conditions do instructions od ;
Remarque : une boucle de type «pour k variant de 1 à n» est en fait un cas particu- lier de boucle de type «tant que». En effet, les deux suites d’instructions suivantes sont équivalentes :
Pour k de 1 à n, faire instructions ;
Fin du pour
k
←1 ;
Tant que k
6n, faire instructions ; k
←k + 1 Fin du tant que
1.5 La sortie des résultats
Si on ne «force pas l’affichage», seul le dernier résultat calculé dans la procédure est retourné.
– Pour afficher des résultats intermédiaires, on peut utiliser print ou ou printf pour insérer aussi du texte.
– La commande RETURN renvoie la valeur d’un résultat et fait quitter la procédure.
1.6 Débuggage ou trace de la procédure
On peut tracer une procédure toto à l’aide de la fonction trace de Maple. On tape trace(toto); puis on exécute toto et alors tous les calculs sont affichés pas à pas.
2 Exemples modèles d’algorithmes
Dans tous ces exercices, l’algorithme est rédigé en pseudo-code. Vous devez le traduire
en langage Maple et décrire son action.
algorithme : soso Entrées : n
∈N∗Résultat : à vous de trouver...
Variables : s
∈R, k
∈Ns
←0 ;
Pour k de 1 à n, faire s
←s + k ;
Fin du pour Renvoyer s
>
soso:=proc(n::posint)
>
local s,k;
>
s:=0;
>
for k from 1 to n do
>
s:=s+k;
>
od;
>
RETURN(s);
>
end;
algorithme : fonctiontente Entrées : x
∈RRésultat : ...
Variables : Si x
∈[0, 1], faire
renvoyer x ; Si x
∈]1, 2], faire
renvoyer
−x + 2 ; Sinon, faire
renvoyer 0.
Fin du Si ;
algorithme : truc Entrées : x
∈R+Résultat : ...
Variables : k
∈Nk
←0 ;
Tant que k
6x, faire k
←k + 1 ;
Fin du tant que Renvoyer k
−1 ;
3 Exercices
3.1 Premiers exemples seuls
Exercice 1 (Fonction factorielle) Écrire une fonction factorielle(n) qui prend en argument un entier naturel n et renvoie n!.
Exercice 2 Écrire une procédure nommée trinôme qui renvoie les solutions réelles d’une équation du second degré. On sera vigilant au cas où a = 0.
Exercice 3 Trouver 3 couples d’entiers naturels (x, y) solutions de l’équation de Pell- Fermat x
2−11y
2= 1.
Exercice 4 Écrire une procédure nommée divcom qui donne tous les diviseurs communs à deux nombres entiers a et b avec a
6b (on rappelle qu’un entier d divise un entier n si et seulement si E
nd=
ndou si et seulement si n est congru à 0 modulo d).
3.2 Assez instructif
Exercice 5 (Affichage) Tester et commenter les 5 procédures suivantes.
>
norme1:=proc(x,y)
>
sqrt(x^2+y^2);
>
end;
>
norme2:=proc(x,y)
>
sqrt(x^2+y^2);
>
x *y;
>
end;
>
norme3:=proc(x,y)
>
print(sqrt(x^2+y^2));
>
print(x *y);
>
end;
>
norme4:=proc(x,y)
>
RETURN(sqrt(x^2+y^2));
>
RETURN(x *y);
>
end;
>
norme5:=proc(x,y)
>
RETURN(sqrt(x^2+y^2),x*y);
>
end;
Exercice 6 (Afficher c’est pas gagner) Paul a besoin d’utiliser la fonction f définie sur
Rpar f (x) = 2x + 1. Il la programme ainsi sur Maple :
f:=proc(x) print(2*x+1); end;
Calculer ainsi f (10), f (5) puis f (f (5)). Commenter puis corriger.
Exercice 7 Quelle est la valeur de la variable a à la suite des instructions suivantes.
a
←10 ;
Si a < 5, alors a = 20 ; Si a > 1 alors a = 500 ; Si a > 100 alors a = 50 ; Sinon a = 0.
Exercice 8 Écrire un algorithme qui ne se termine pas.
Exercice 9 (Pourquoi 11 et pas 10 ?) A l’aide d’une itération dont le nom de la va- riable est k, demander d’afficher les carrés des entiers de 0 à 10. Lorsque l’on demande ensuite à Maple la valeur de k, il renvoie 11. Proposer une explication.
Exercice 10 (argument Vs variable) Voici une procédure essai:=proc(n)
n:=n+1;
end;
Taper là, puis avant de la tester, réfléchir à ce qu’elle doit faire. Tester là et commenter.
3.3 Avec des suites
Exercice 11 (Fonction seuil) La suite u
n= 4n
3+ 5n + 1 est croissante et tend vers +
∞. On est donc sûr qu’à partir d’un certain rang n, on a u
n >100. Compléter les instructions suivantes afin de déterminer le plus petit entier n tel que u
n>100 ?
n
←0 ;
Tant que ...100, faire n
←... ;
Fin du tant que
Renvoyer ... ;
Exercice 12 (Programmation d’une suite récurrente) Soit u la suite définie par u
0= 5 et u
n+1= 3u
n−2 pour n
∈N.
Le but de l’exercice est de construire une procédure d’argument n et renvoyant la valeur u
n.
1. Méthode 1 : à l’aide d’une seule variable algorithme : suite
Entrées : n
∈NRésultat : u
nVariables : u
∈N, k
∈Nu
←5 ;
Pour k de 1 à n faire u
←3u
−2 ; Fin du pour Renvoyer u ;
2. Méthode 2 : à l’aide d’une table algorithme : suitebis Entrées : n
∈NRésultat : u
nVariables : u une table, k
∈Nu[0]
←5 ;
Pour k de 0 à n
−1 faire u[k + 1]
←3u[k]
−2 ; Fin du pour
Renvoyer u[n] ;
3. Quelle méthode vous paraît la plus coûteuse en variables et donc en occupation mémoire de l’ordinateur ?
Exercice 13 (Suite de Syracuse) On note f la fonction définie sur
Npar f(n) =
n2si n est pair et f(n) = 3n + 1 sinon.
1. Écrire une fonction Maple qui renvoie les valeurs de la fonction f .
2. On considère maintenant la suite récurrente u de premier terme u
0 ∈Net vérifiant u
n+1= f(u
n). Programmer cette suite et observer que quelque soit le choix de u
0, la suite u finit par prendre la valeur 1. .
3. Écrire un algorithme
1retouralunite qui prend en argument un entier u
0et renvoie le plus petit entier n tel que u
n= 1.
Exercice 14 (Suite de Fibonnacci) On note (F
n) la suite de premiers termes F
0= 0, F
1= 1 puis définie par F
n+1= F
n+ F
n−1. Écrire une procédure prenant en entrée un entier n et renvoyant F
navec les deux méthodes suivantes selon l’exercice modèle des suites récurrentes :
1. avec une table et donc avec des variables F[k]
2. sans table
3.4 Pour terminer
Exercice 15 (Partie entière) Écrire une fonction partie_entière(x) qui prend en ar- gument un nombre flottant x et renvoie la partie entière de x.
Exercice 16 (Changement de base) Écrire une procédure qui donne l’écriture en base 5 d’un entier.
1. On ne sait toujours pas prouver à l’heure actuelle que l’algorithme retouralunitese termine tou- jours.