Page 1 of 4

Structure d'une expression

Unread postPosted: 11 Oct 2013, 11:15
by AnToX98
Je me suis lancé il y a quelques jours dans la conception d'un programme qui pourrais m'être très utile pour la suite.
Il s'agit d'un programme qui donne la structure d'une expression dans une liste, et qui en sépare les parties en fonction des additions (et non des multiplications)

Déjà, petite question parceque il serait inutile de programmer ceci pour rien : il existe une fonction qui fait tout ce travail automatiquement ?

Si elle n'existe pas, voici le code de mon petit programme qui utilise la fonction part:

Code: Select all
Define stru(ex)=
Prgm
:struct:={}
:dec:=ex
:While part(dec)=2
:p:={part(dec,1),part(dec,2)}
:struct[dim(struct)+1]:=p[2]
:If part(p[1])=2 Then
:dec:=p[1]
:Else
:struct[dim(struct)+1]:=p[1]
:Exit
:EndIf
:EndWhile
:struct:=rotate(struct)
:EndPrgm


Mais je voudrais enfaite que le programme ne sépare pas l'expression quand c'est une multiplication :

Image

Sinon, si vous avez une manière plus simple de le faire, je vous écoute.

Merci de votre aide

Re: Structure d'une expression

Unread postPosted: 11 Oct 2013, 14:26
by NspireCas
Voici le code :
Code: Select all
Define stru(f)=
Prgm
:polyCoeffs(f)→k
:Disp k
:EndPrgm

du moins si j'ai bien compris ta question...
Ici, stru(3*x+2*x^(2)) renvoit {2,3,0}, ce n'est pas exactement ce que tu veux... (tu pourrais modifier à coups de left pour que ça affiche {2x^2,3x,0}

Peut-on savoir quand ce programme sert-il, je ne comprends pas vraiment l'intérêt ?
Aussi, pourrais-tu nous donner un exemple, par exemple si la fonction est 2x^2+3x-5, ce qu'elle devrait afficher ?

Re: Structure d'une expression

Unread postPosted: 11 Oct 2013, 16:57
by davidElmaleh
Pour compléter le programme de Nspirecas et ainsi avoir ce que tu veux, voici un autre programme :
Code: Select all
Define struct(f,var)=
Prgm
:Local k,i
:polyCoeffs(f,var)→k
:For i,0,polyDegree(f,var)
:  k[i+1]:=var^(polyDegree(f,var)-i)*k[i+1]
:EndFor
:Disp k
:EndPrgm

Re: Structure d'une expression

Unread postPosted: 11 Oct 2013, 17:34
by critor
Cela aurait pu être fort utile pour un programme de calculs/simplifications par étapes, si hélas la TI-Nspire ne simplifiait pas déjà toute seule au maximum tout argument passé à un tel programme, qui n'aurait donc plus grand chose à simplifier... :(

Re: Structure d'une expression

Unread postPosted: 11 Oct 2013, 17:43
by davidElmaleh
dans ce cas, ne serai-ce-t-il pas possible d'entrer les arguments grace à un RequestStr, ainsi, les variables sont stockées en String et la Nspire ne simplifie pas :)

Re: Structure d'une expression

Unread postPosted: 11 Oct 2013, 17:44
by Adriweb
Sauf qu'alors, il te faut toi-même parser la chaîne...

Re: Structure d'une expression

Unread postPosted: 11 Oct 2013, 17:45
by davidElmaleh
c'est vrai que c'est difficil mais entreprenable (perso, je ne m'y aventurespas :p )

Re: Structure d'une expression

Unread postPosted: 11 Oct 2013, 17:47
by AnToX98
Oui critor c'est pour ce genre de programme.
archives_voir.php?id=536
Dans ce programme de Philippe fortin, il y a un programme pour trouver la structure, ce qui permet de donner la dérivée d'une fonction pas à pas.

Ce que vous n'avez pas encore compris, c'est que polyCoeffs n'a rien n'a voir la dedans, puisque polyCoeffs ne concerne que les polynomes, la je parle d'expressions generales.
En gros, si je fais struc(-3x^2+(1/x)-sqrt(2)*2), le programme me crée une liste struct de la forme :
struct:={-3x^2,(1/x),-sqrt(2)*2}

Re: Structure d'une expression

Unread postPosted: 11 Oct 2013, 18:06
by Lionel Debroux
En BASIC, la façon classique est d'utiliser des fonctions comme part().
En code natif, ça se ferait en itérant avec next_expression_index et éventuellement quelques helpers, comme sur TI-68k/AMS...

Re: Structure d'une expression

Unread postPosted: 11 Oct 2013, 23:23
by Bisam
La fonction "part()" est parfaite pour ce que tu veux mais tu ne l'utilises pas à fond !
Tu peux l'utiliser de 3 façons :
- sans argument, elle renvoie le nombre d'opérandes d'une expression, de 0 à 4 pour les opérateurs usuels, et autant qu'on veut si c'est une liste (ou une matrice)
- avec l'argument 0, elle renvoie l'opérateur principal de l'expression sous forme de chaîne de caractère (avec le cas d'exception où il n'y a pas d'opérateur, auquel cas, elle renvoie la variable ou le nombre correspondant)
- avec l'argument n différent de 0, elle renvoie le n-ème argument de cet opérateur

Tu peux donc tester si l'opérateur est une addition ou non...