©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 ?