Inscription / Connexion Nouveau Sujet
Niveau logiciels
Partager :

TD info: programation language Maple

Posté par
M_yst
14-05-10 à 08:30

Bonjour!

J'ai besoin d'aide pour un exercice de programmation! Je ne suis pas sur de mes réponses. Pour mes deux premières réponse ça à l'air de fonctionner mais je ne suis pas sur de ma dernière réponse pour la question 3):

Voici l'énoncé:

Les programmes sont à écrire en langage Maple sans utiliser les fonctions avancées!
La multiplication du paysan russe permet d'effectuer le produit de deux entiers a et b en ne disposant que de la multiplication par 2, de la division par 2 et de l'addition.
Le principe est le suivant:
-si a est pair alors axb=(a/2)x(2b)
-si a est impair, on diminue a de 1 (de façon à le rendre pair) et on peut écrir axb=(a-1)xb+b, se ramenant ainsi au cas précédent.
Exemple: 6x7=?
6x7
3x14
2x14   +14
1x28
0x28   +28
        42

1)Écrire une procédure récursive permettant d'obtenir le produit de deux entiers selon cette méthode.
2)Écrire une procédure itérative
3)Adapter ces procédures de manière à calculer x^n, x réel et n entier naturel donnés (si n est pair, x^n=x^{n/2}.x^{n/2}, si n impair, x^n=...)


Voici ce que j'ai fait:

TD info: programation language Maple

Posté par
M_yst
re : TD info: programation language Maple 14-05-10 à 08:32

Et voici mes éléments de réponse pour la question 3. Mais avec la méthode itérative ça ne fonctionne pas...
Merci d'avance pour toutes vos suggestions!

TD info: programation language Maple

Posté par
pythamede
re : TD info: programation language Maple 14-05-10 à 09:08

Je ne connais pas Maple !

Mais je peux quand même faire quelques remarques.

Il me semble que ta procédure "récursive" n'est pas récursive !

Si floor(a/2) = a/2 tu fais alors la multiplication pure et simple de a/2 par 2b, ce qui est interdit ! a/2 peut bien être un nombre autre que 2 non ?

Il faut écrire : if (floor(a/2)=(a/2) prod(a/2,2b) ; ainsi, tu appelles récursivement la procédure prod !
[Mais attention, étant donné que je ne connais pas ce langage, peut-être la syntaxe de l'appel n'est pas exactement celle-là !]

De même, dans la ligne suivante : else (a-1)*b+b

Tu fais une multiplication pure et simple de (a-1) par b et rien ne prouve que (a-1) soit égal à 2 ! Il faut supposer que tu ne sais pas faire des multiplications autrement que par 2 !

Il fallait écrire : else prod(a-1,b)+b pour appeler prod de manière récursive !
[Mais attention, étant donné que je ne connais pas ce langage, peut-être la syntaxe de l'appel n'est pas exactement celle-là !]

La méthode itérative n'est pas bonne non plus !

En écrivant : f:=(a/2)*(2b) tu fais aussi une multiplication pure et simple de (a/2) par (2b) ce qui est interdit si (a/2) n'est pas égal à 2. De plus, tu ne vérifies même pas que floor(a/2) est bien égal à a/2, c'est à dire que a est pair !!!! De plus, de toutes façons, cela ne sert à rien de calculer f car juste en dessous tu recalcules f, en écrasant par conséquent le premier résultat !!! !

Ensuite, en écrivant for k to b f:=(a-1)*b+b, je suppose que cela veut dire que tu fais varier k de 1 à b. Tu fais donc exactement le même calcul b fois !!!
Un seul calcul suffirait. Sauf que là aussi, tu ne te préoccupes pas du tout du fait que (a-1) peut bien n'être pas égal à 2 : tu fais une multiplication interdite !

Il faut tout reprendre !

Posté par
M_yst
re : TD info: programation language Maple 14-05-10 à 09:19

Donc cela à marché par chance?
Merci je vais essayer de comprendre mes erreurs...
On début en programmation c'est pas facile...

Posté par
pythamede
re : TD info: programation language Maple 14-05-10 à 09:41

Non, ce n'est pas de la chance !

Cela a marché parce que ton ordinateur sait multiplier (a/2) par (2b) ! Même si (a/2) n'est pas égal à 2 !!! Cela a marché parce que tu n'as pas respecté les règles : tu dois supposer que ton ordinateur ne sait pas faire de multiplication autres que par 2 ! Comme en fait, il sait le faire, lorsque tu essayes l'ordinateur s'exécute !

Tu peux voir le détail étape par étape :

Lorsque tu appelles prod(10,3), on a a=10 et b=3.

L'ordinateur constate que floor(a/2) est égal à 5 et que a/2 est aussi égal à 5, donc il calcule 10*3 par 5*6 et trouve 30 !
Mais ce faisant, tu n'as pas respecté les contraintes de ton exercice, puisque tu as demandé à l'ordinateur de faire la multiplication 5*6 ce que les paysans russes ne savent pas faire ! De plus, tu n'as pas appelé récursivement ta fonction prod !

De même avec prod2 : prod2(10,3)

Tu calcules d'abord f:=(10/2)*6 et tu trouves 30 en utilisant illégalement la capacité de l'ordinateur à calculer 5*6 !
Puis tu calcules 3 fois de suite la même chose : f:=(10-1)*3+3, soit 9*3 +3 ! Tu trouves 3 fois la même chose : 30 !
Et c'est fini !
Il est tout à fait normal que ton résultat soit bon parce que ton ordinateur sait calculer 5*6 !
Cela n'a finalement rien à voir avec la méthode des paysans russes...

Oui, je sais, ce n'est pas facile ; accroche-toi et bon courage !

P.S. Pour ton information en anglais on écrit bien "language", mais en français c'est "langage" ! (dans le titre !)

Posté par
M_yst
re : TD info: programation language Maple 14-05-10 à 09:44

j'ai essayer mais ça ne fonctionne pas! ce que je comprend pas c'est comment le programme sait qu'il qu'il doit faire une multiplication en faisant ça?

J'ai trouvé un exercice que j'ai fait la semaine dernière:

la factorielle d'un entier: n!

Méthode itérative:
on calcule les factorielles successives de k, pour k de 1 à n, en les stockant dans une variable auxiliaire:
>facti:=proc(n)
local f,k::integer
f:=1;
for k to n do f:=f*k end do
end proc

Méthode récursive:
on teste si on est dans le cas précédent sinon:
>factr:=proc(n)
if n=0 then 1 else n*factr(n-1) end if
end proc;

j'espère que ça pourra vous aider à comprendre Maple! Pas facile la programmation!

TD info: programation language Maple

Posté par
M_yst
re : TD info: programation language Maple 14-05-10 à 09:47

Oui pour le titre je m'en suis rendu compte trop tard comme on ne peut rééditer... désolé! Mais je n'ai pas fait cette erreur dans mon premier post!

Posté par
M_yst
re : TD info: programation language Maple 14-05-10 à 09:50

C'est vrai! D'accord j'ai compris! Il faut donc rappeler ma procédure! Après pour que cela fonctionne c'est une autre histoire
Mais pour la méthode itérative j'ai plus de problème pour comprendre!
Merci beaucoup de votre aide

Posté par
M_yst
re : TD info: programation language Maple 14-05-10 à 09:58

Moi qui était content d'avoir réussi à écrire un programme tout seul... Au moins j'apprends! J'ai bien fait de poster sur ce forum et je vous remercie d'avance pour l'aide que vous nous apporter pour la compréhension!

Posté par
pythamede
re : TD info: programation language Maple 14-05-10 à 10:36

Pour le programme que tu as affiché à 9H44, c'est normal qu'il y ait "too many levels", car ta procédure ne s'arrête jamais ! Dans tous les cas, tu appelles prod récursivement ! Il faut aussi penser à s'arrêter ! Par exemple tu peux mettre en tête : if a=0 then  0 ; dans ce cas là il n'y aura pas de nouvel appel !

Car quand a=0, ton programme tel qu'il est appelle à nouveau prod(a/2,b) c'est à dire prod(0,b) !!! Eternellement ! C'est long, l'éternité !

Posté par
M_yst
re : TD info: programation language Maple 14-05-10 à 10:56

Ah d'accord! Merci beaucoup!
C'est vrai ça fonctionne!
Comment dois je procéder alors pour la méthode itérative?

TD info: programation language Maple

Posté par
pythamede
re : TD info: programation language Maple 14-05-10 à 11:19

C'est parfait ça !

Ben tu vois, ce n'est pas si dur !

Pour la méthode itérative, tu ne sais pas combien de fois tu devras itérer. Et a fortiori, certainement pas b fois !
Donc il te faudrait un while. Je suppose que l'ordre "while" (tant que...) existe sous Maple...

Je te propose :


resu=0
"tant que" a >0 faire
{
   si (floor(a/2)=(a/2))
        alors {a=a/2 et b=2b}
   sinon
        alors {resu=resu+b et a=(a-1)/2 puis b=2b}
}
Le résultat est alors resu !


Evidemment, il faut mettre tout ça à la sauce Maple...

Posté par
M_yst
re : TD info: programation language Maple 14-05-10 à 12:11

Je ne comprend pas le resu ? cela correspond à quoi?

Posté par
M_yst
re : TD info: programation language Maple 14-05-10 à 23:22

J'ai compris en gros le principe de la méthode itérative mais ça ne donne rien sous Maple...

Posté par
pythamede
re : TD info: programation language Maple 15-05-10 à 22:24

Moi je ne comprends pas ce que tu dis ! "Ca ne donne rien sous Maple" ! Ca doit donner le même résultat !

Quant à resu, c'est une variable locale qui sera le résultat à la fin. A toi de faire ce qu'il faut, avec la syntaxe de Maple, pour que ta fonction donne resu pour résultat !

Posté par
M_yst
re : TD info: programation language Maple 16-05-10 à 10:35

Excusez moi je me suis mal exprimé... En fait je bloque car je n'arrive pas à voir mon erreur... J'ai bien compris la démarche mais je ne vois pas mon erreur... Voici ce que ça m'affiche:

TD info: programation language Maple

Posté par
M_yst
re : TD info: programation language Maple 16-05-10 à 10:37

Pourtant il ne me met pas qu'il y a un problème dans mon écriture de mon programme. Mais quand je veux vérifier qu'il fonctionne bien rien a faire le même message qui revient... Alors je me suis dit qu'il ne fallait pas l'appeler r ma variable locale mais rien à faire même en le changeant...

Posté par
pythamede
re : TD info: programation language Maple 16-05-10 à 15:05

Je ne peux pas t'aider beaucoup sur ce coup ! Toujours à cause de ma méconnaissance du langage Maple !

Je me demande s'il n'y a pas quelque chose à faire (genre des parenthèses ou qq chose du genre) pour spécifier qu'il y a deux choses à faire si floor(a/2)=a/2 : 1) a=a/2 et 2) b=2b, et trois choses à faire dans le cas contraire : 1) r=r+b, 2) a=(a-1)/2 3) b=2b. Mais j'admets que c'est peut-être la syntaxe normale de Maple, puisqu'il y a un else pour terminer la première partie, et un endif pour terminer la seconde...

Egalement, je me demande si ce n'est pas le return r qui pose problème. Comme tu as appelé ta fonction "prodi:=proc(a,b)", est-ce que tu ne peux pas, dès le début, définir prodi au lieu de r : prodi:=0, et modifier prodi par prodi:=prodi+b à la place de r:=r+b. N'est-ce pas prodi, le résultat de ta fonction ? Ou alors, laisse tout comme ça sauf le "return r" en le remplaçant par "prodi:=r"

Si ce n'est ni l'un ni l'autre, je ne vois vraiment pas ! Il faudrait que quelqu'un qui connaît bien Maple te donne un coup de main. La logique est bonne ! Je suis certain qu'il s'agit d'un problème de syntaxe du langage !



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !