Algorithmique - Site Personnel de Arnaud de Saint Julien

publicité
©Arnaud de Saint Julien - MPSI Lycée La Merci 2012-2013
1
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.
nomdelaprocedure :=proc(arg1,arg2, ...,argn)
local a,b,c ;
La syntaxe est la suivante :
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 obligatoire 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).
2
©Arnaud de Saint Julien - MPSI Lycée La Merci 2012-2013
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 particulier 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
1.5
k ← 1;
Tant que k 6 n, faire
instructions ; k ← k + 1
Fin du tant que
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.
3
©Arnaud de Saint Julien - MPSI Lycée La Merci 2012-2013
algorithme : soso
Entrées : n ∈ N∗
Résultat : à vous de trouver.....
Variables : s ∈ R, k ∈ N
s ← 0;
Pour k de 1 à n, faire
s ← s+k;
Fin du pour
Renvoyer s
algorithme : fonctiontente
Entrées : x ∈ R
Résultat : .....
Variables :
Si x ∈ [0, 1], faire
renvoyer x ;
Si x ∈]1, 2], faire
renvoyer −x + 2 ;
Sinon, faire
renvoyer 0.
Fin du Si ;
>
>
>
>
>
>
>
>
soso:=proc(n::posint)
local s,k;
s:=0;
for k from 1 to n do
s:=s+k;
od;
RETURN(s);
end;
algorithme : truc
Entrées : x ∈ R+
Résultat : .....
Variables : k ∈ N
k ← 0;
Tant que k 6 x, faire
k ← k + 1;
Fin du tant que
Renvoyer k − 1 ;
3
3.1
Exercices
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 PellFermat x2 − 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 6 b (on rappelle qu’un entier d divise un entier n si
et seulement si E nd = nd ou 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;
©Arnaud de Saint Julien - MPSI Lycée La Merci 2012-2013
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
4
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 R par 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 variable 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 un = 4n3 + 5n + 1 est croissante et tend vers
+∞. On est donc sûr qu’à partir d’un certain rang n, on a un > 100. Compléter les
instructions suivantes afin de déterminer le plus petit entier n tel que un > 100 ?
n ← 0;
Tant que .................100, faire
n ← .............. ;
Fin du tant que
Renvoyer ... ;
5
©Arnaud de Saint Julien - MPSI Lycée La Merci 2012-2013
Exercice 12 (Programmation d’une suite récurrente) Soit u la suite définie par
u0 = 5 et un+1 = 3un − 2 pour n ∈ N.
Le but de l’exercice est de construire une procédure d’argument n et renvoyant la
valeur un .
1. Méthode 1 : à l’aide d’une seule variable
algorithme : suite
Entrées : n ∈ N
Résultat : un
Variables : u ∈ N, k ∈ N
u ← 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 ∈ N
Résultat : un
Variables : u une table, k ∈ N
u[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 N par f (n) =
n est pair et f (n) = 3n + 1 sinon.
n
2
si
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 u0 ∈ N et vérifiant
un+1 = f (un ). Programmer cette suite et observer que quelque soit le choix de u0 ,
la suite u finit par prendre la valeur 1. .
3. Écrire un algorithme 1 retouralunite qui prend en argument un entier u0 et renvoie
le plus petit entier n tel que un = 1.
Exercice 14 (Suite de Fibonnacci) On note (Fn ) la suite de premiers termes F0 = 0,
F1 = 1 puis définie par Fn+1 = Fn + Fn−1 . Écrire une procédure prenant en entrée un
entier n et renvoyant Fn avec 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 argument 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 retouralunite se termine toujours.
©Arnaud de Saint Julien - MPSI Lycée La Merci 2012-2013
6
Exercice 17 (Quelle fractale se cache dans le triangle de Pascal ?) –
1. Représenter les 10 premières lignes du triangle de Pascal sous formes de 10 listes (on
pourra utiliser binomial).
2. Écrire une fonction f définie sur N qui à un entier n pair associe la chaîne de
caractères oo et à un entier n impair associe la chaîne de caractères [].
3. Appliquer cette fonction f à chaque élément de la dixième ligne du triangle de
Pascal, puis refaire cette opération pour les cinquantes premières lignes du triangle
de Pascal.
4. Représenter ainsi le triangle de Pascal modulo 2, quelle fractale se dévoile devant
vous ?
Téléchargement