7Fermer9
sandroLe 06/11/2011 à 20:17
[nosmile]C'est bon, j'ai réussit à optenir quelquechose d'à peu près correct (mais pas terminé, loins de là) en ayant tout restructuré (pas une seul sous programme est resté : j'ai remplacé les chaînes par des listes pour le stocage proncipal des infos):

Cette version gère pour l'instant :
-les 4 opérations de bases (+,-,*,/)
-les "unitées" : pi, e, i(mais sans la propriété i²=-1), X et Y : chacun avec un exposant entier de -10 à 10 fois une exposant en racines composé au maximum d'une racine carrée et une racine cube : rac2(rac3(?)); rac3(?); rac2(?); rac3(?)²; ou rac2(?)*rac3(?)
-les opérations d'exposant "préfètes" : carré, cube et inverse
-les fraction (mais pas en entrée) de forme {Z:N} (Z étant le numérateur : entier relatif et N le dénominateur : entier naturel)
-la trigo de base (radian) : cos, sin, tan avec les valeures usuelles sur R (simplification avec trig(x)=trig(x+2pi) )
-les racines carrés

Pas géré:
-un bon nombre de fonctions
-les dévelopement/réductions (sauf dans le cadre d'abscence de parrenthèses et d'adjacence dans l'ordre des opérations)
-les parrenthèses (ne génèrent pas de bug ou de non sens, mais elles ne sont pas prise en compte : on calcule ce qu'il y a avant, après et dedant, mais on ne regroupe pas les 3)
-les "déplacements de blocs" : on effectuera pas d'opérations avec des termes non adjacent : example : 7+3pi+8 ne sera pas calculé car on ne peut pas faire ni 7+3pi, ni 3pi+8
-la prise en compte du fait que i²=-1
-la suppression des parenthèsses inutiles

Voici les programmes (6014 octé pour l'instant (non optimié pour m'instant):
tromb Fichier joint : CALCLIST.83p
tromb Fichier joint : INTERFAC.83p
tromb Fichier joint : _theta_ADDSUB.83p
tromb Fichier joint : _theta_CARRE.83p
tromb Fichier joint : _theta_COS.83p
tromb Fichier joint : _theta_CUBE.83p
tromb Fichier joint : _theta_DISP.83p
tromb Fichier joint : _theta_DIV.83p
tromb Fichier joint : _theta_FACTP.83p
tromb Fichier joint : _theta_INV.83p
tromb Fichier joint : _theta_MULT.83p
tromb Fichier joint : _theta_OPS.83p
tromb Fichier joint : _theta_OPSPAR.83p
tromb Fichier joint : _theta_RAC2.83p
tromb Fichier joint : _theta_RACLIS1.83p
tromb Fichier joint : _theta_RACLIST.83p
tromb Fichier joint : _theta_SIN.83p
tromb Fichier joint : _theta_TAN.83p





Et les codes :
ProgrammeCALCLIST:
{1,2 -> lREG1
"{E+1,2E+1 -> lREG2
5 -> dim(lUNITE
prgmINTERFAC
prgmThétaDISP
Pause Str0
0 -> A
While A=/=dim(L1
A+1 -> A
Pause A
If L1(A)=2
prgmThétaOPS
If L1(A)=4
prgmThétaOPSPAR
End


ProgrammeINTERFAC
Input "CALCUL:",Str1
length(Str1üL
Lüdim(L
Fill(1,L
LüL‚
L‚üL„

L-LüLƒ
L„+L„àüL…
L…üL†

For(A,1,length(Str1
sub(Str1,A,1üStr2
If inString("ú.0123456789",Str2
1üL„(A

If inString("+-*/^ñÜÝ",Str2
2üL„(A

If Str2="(" or Str2=")"
3üL„(A

If inString("sin(cos(tan(sinñ(cosñ(tanñ(ln(log(ý^(ë^(ð(Ýð(",Str2
4üL„(A

If inString("ÄëàXY",Str2
5üL„(A

End


ÄëÄüL„(1+dim(L„


1üD
For(A,1,length(Str1
sub(Str1,A,1üStr2

If L„(A)=1
Then
AüB
While 1=L„(B+1
B+1üB
End
expr(sub(Str1,A,B-A+1üL‚(D
1üL(D
D+1üD
BüA
End

If L„(A)=2
Then
2üL(D
inString("+-*/^ñÜÝ",Str2üL‚(D
D+1üD
End

If L„(A)=3
Then
If Str2="(
1üL‚(D
If Str2=")
ú1üL‚(D
3üL(D
D+1üD
End

If L„(A)=4
Then
inString("cos(sin(tan(cosñ(sinñ(tanñ(ln(log(ý^(ë^(ð(Ýð(",Str2üL‚(D
4üL(D
D+1üD
End

If L„(A)=5
Then
6ý^(ú2+2inString("YXàëÄ",Str2üLƒ(D
D+1üD
End

End
D-1üD
Düdim(L
Düdim(L‚
Düdim(Lƒ
Düdim(L„
Fill(1,L„
Düdim(L…
Düdim(L†

For(A,1,dim(L
If L(A)=1 and fPart(L‚(A
Then
L‚(AüU
1üV
While fPart(round(U,9
10UüU
10VüV
End
gcd(abs(U),V)ñüR
URüL‚(A
VRüL„(A
End
End


ProgrammeThétaADDSUB
If A=1:Return
If L(A-1)ø1 or L(A+1)ø1
Return

If Lƒ(A+1)øLƒ(A-1)
Return

If Aø2
Then
If L(A-2)=2 and L‚(A-2)ø1 and L‚(A-2)ø2
Return
End

If A+1øD
Then
If L(A+2)=2 and L‚(A+2)ø1 and L‚(A+2)ø2
Return
End

L‚(A-1)*L„(A+1üS
L‚(A+1)*L„(A-1üT
S+TüU
If L‚(A)=2:S-TüU
L„(A-1)*L„(A+1üV
gcd(abs(U),V)ñüR
URüL‚(A-1
VRüL„(A-1

2üÁ
prgmÁRACLIST
A-2üA
If AùD
1üA


ProgrammeThétaCARRE
If L(A-1)=1
Then
(1-2(L‚(A-1)÷0))L‚(A-1)Üreal(L…(A-1üU
L„(A-1)Üimag(L…(A-1üV
gcd(abs(U),V)ñüR
URüL‚(A-1
VRüL„(A-1
2Lƒ(A-1üLƒ(A-1
real(L†(A-1))Ü+àimag(L†(A-1))ÜüL†(A-1

1üÁ
prgmÁRACLIS1
A-2üA


ProgrammeThétaCOS
A+1üB
If L(B)=1 and L(B+1)=3 and L‚(B+1)=ú1
Then
If L…(B)=1+à and L†(B)=1+à and (Lƒ(B)+0à=6û8+0à or L‚(B)=0
Then
abs(L‚(B)/L„(BüC
2fPart(.5CüC
If C>1:2-CüC
B+1üB

1üK

If C=0
Then
1üL(B
1üL‚(B
0üLƒ(B
0üK
End

If C=1/6
Then
1üL(B
1üL‚(B
0üLƒ(B
2üL„(B
3+àüL…(B
0üK
End

If C=1/4
Then
1üL(B
0üK
1üL‚(B
0üLƒ(B
2üL„(B
2+àüL…(B
End

If C=1/3
Then
1üL(B
1üL‚(B
0üLƒ(B
2üL„(B
0üK
End

If C=1/2
Then
1üL(B
0üL‚(B
0üLƒ(B
0üK
End

If C=1
Then
1üL(B
ú1üL‚(B
0üLƒ(B
0üK
End

If C=5/6
Then
1üL(B
ú1üL‚(B
0üLƒ(B
2üL„(B
3+àüL…(B
0üK
End

If C=3/4
Then
1üL(B
ú1üL‚(B
0üLƒ(B
2üL„(B
2+àüL…(B
0üK
End

If C=2/3
Then
1üL(B
ú1üL‚(B
0üLƒ(B
2üL„(B
0üK
End



If not(K
Then
2üÁ
prgmÁRACLIST
A-2üA


Programme ThétaCUBE
If L(A-1)=1
Then
L‚(A-1)Ýreal(L…(A-1))real(L†(A-1üU
L„(A-1)Ýimag(L…(A-1))imag(L†(A-1üV
gcd(abs(U),V)ñüR
URüL‚(A-1
VRüL„(A-1
2Lƒ(A-1üLƒ(A-1

1üÁ
prgmÁRACLIS1
A-2üA


Programme ThétaDISP
" üStr0
0üP
Repeat P=dim(L
P+1üP

If L(P)=1
Then
L‚(PüE
LinReg(ax+b)áREG1,áREG2,Y‰
EquåString(Y‰,Str2
sub(Str2,1,length(Str2)-3üStr2
If L„(P)ø1
Then
L„(PüE
LinReg(a+bx) áREG1,áREG2,Y‰
EquåString(Y‰,Str3
Str0+"{"+Str2+":"+sub(Str3,3,length(Str3)-3)+"}üStr0
Else
Str0+Str2üStr0
End
If L…(P)ø1+à
Then
real(L…(PüE
LinReg(ax+b)áREG1,áREG2,Y‰
EquåString(Y‰,Str2
sub(Str2,1,length(Str2)-3üStr2
If 1øimag(L…(P
Then
imag(L…(PüE
LinReg(ax+b)áREG1,áREG2,Y‰
EquåString(Y‰,Str3
"{"+Str2+":"+sub(Str3,1,length(Str3)-3üStr2
End
Str0+"ð("+Str2+")üStr0
End

If L†(P)ø1+à
Then
L†(PüE
LinReg(ax+b)áREG1,áREG2,Y‰
EquåString(Y‰,Str2
Str0+"Ýð("+sub(Str2,1,length(Str2)-3)+")üStr0
End
If real(Lƒ(P)) or imag(Lƒ(P
Then
real(Lƒ(PüK
imag(Lƒ(PüL
For(M,1,5
iPart(û2fPart(Ký^(ú12+2M)))-iPart(û2fPart(Lý^(ú12+2MüN
If N
Then
sub("ÄëàXY",M,1üStr8
N/6üN
If N>0
Then
iPart(NüQ
6fPart(NüR
If Q
Str0+"Ò"+Str8üStr0
If Q=2
Str0+"ÜüStr0
If Q=3
Str0+"ÝüStr0
If Qù4
Str0+"^"+sub("123456789",Q,1üStr0
If R=1
Str0+"Òð(Ýð("+Str8+"))üStr0
If R=2
Str0+"ÒÝð("+Str8+")üStr0
If R=3
Str0+"Òð("+Str8+")üStr0
If R=4
Str0+"ÒÝð("+Str8+")ÜüStr0
If R=5
Str0+"ÒÝð("+Str8+")ð("+Str8+")üStr0
Else
abs(NüN
iPart(NüQ
6fPart(NüR
If Q=1
Str0+"Ò"+Str8+"ñüStr0
If Qù2
Str0+"Ò"+Str8+"^ú"+sub("123456789",Q,1üStr0
If R=1
Str0+"Òð(Ýð("+Str8+"))ñüStr0
If R=2
Str0+"ÒÝð("+Str8+")ñüStr0
If R=3
Str0+"Òð("+Str8+")ñüStr0
If R=4
Str0+"ÒÝð("+Str8+")^ú2üStr0
If R=5
Str0+"ÒÝð("+Str8+")ñÒð("+Str8+")ñüStr0
End
End
End
End


End





If L(P)=2
Then
Str0+sub("+-*/^ñÜÝ",L‚(P),1üStr0
End

If L(P)=3
Then
If L‚(P)=1
Then
Str0+"(üStr0
Else
Str0+")üStr0
End
End

If L(P)=4
Then
Str0+sub("cos(sin(tan(cosñ(sinñ(tanñ(ln(log(ý^(ë^(ð(Ýð(",L‚(P),1üStr0
End

End


Programme ThétaDIV
If L(A-1)ø1 or L(A+1)ø1
Return

If Aø2
Then
If L(A-2)=2 and L‚(A-2)ù4
Return
End

If A+1øD
Then
If L‚(A+2)>4
Return
End

3üL‚(A

L‚(A+1üV
L„(A+1üL‚(A+1
VüL„(A+1

imag(L…(A+1))+àreal(L…(A+1üL…(A+1
imag(L†(A+1))+àreal(L†(A+1üL†(A+1
real(Lƒ(A+1))à+imag(Lƒ(A+1üLƒ(A+1

A-2üA


Programme ThétaFACTP
{1üáFACT
1üX
While not(fPart(.5W
2üáFACT(X
X+1üX
.5WüW
End

1üD
While D÷ð(W)+1
D+2üD
While not(fPart(round(DñW,5
DüáFACT(X
X+1üX
round(DñW,0üW
End
End
If W-1
WüáFACT(X


Programme ThétaINV
Pause "ÁINV
If L(A-1)=1
Then
A-1üB

real(Lƒ(B))à+imag(Lƒ(BüLƒ(B
real(L…(B))à+imag(L…(BüL…(B
real(L†(B))à+imag(L†(BüL†(B

L‚(BüC
L„(BüL‚(B
CüL„(B

1üÁ
prgmÁRACLIS1
A-2üA


Programme ThétaMULT
If L(A-1)ø1 or L(A+1)ø1
Return

If Aø2
Then
If L(A-2)=2 and L‚(A-2)ù4
Return
End

If A+1øD
Then
If L‚(A+2)>4
Return
End

L‚(A-1)*L‚(A+1üU
L„(A-1)*L„(A+1üV
gcd(abs(U),V)ñüR
URüL‚(A-1
VRüL„(A-1

Lƒ(A-1)+Lƒ(A+1üLƒ(A-1



real(L…(A-1))real(L…(A+1))+àimag(L…(A-1))imag(L…(A+1üL…(A-1
real(L†(A-1))real(L†(A+1))+àimag(L†(A-1))imag(L†(A+1üL†(A-1

2üÁ
prgmÁRACLIST
A-3üA


Programme ThétaOPS
dim(LüD
L‚(AüZ
If real(Z)=1 or real(Z)=2
prgmÁADDSUB

If real(Z)=3
prgmÁMULT

If real(Z)=4
prgmÁDIV

If real(Z)=6
prgmÁINV

If real(Z)=7
prgmÁCARRE

If real(Z)=8
prgmÁCUBE



If A÷0
1üA
prgmÁDISP
Pause Str0


Programme ThétaOPSPAR
Pause "OPSPAR
dim(LüD
L‚(AüZ
If real(Z)=1
prgmÁCOS
If real(Z)=2
prgmÁSIN
If real(Z)=3
prgmÁTAN


If real(Z)=11
prgmÁRAC2


If A÷0
1üA
prgmÁDISP
Pause Str0


Programme ThétaRAC2
A+1üB
If L(B)=1 and L(B+1)=3 and L‚(B+1)
Then
If L…(B)+0à=1+à and L†(B)+0à=1+à
Then
0üJ
real(Lƒ(BüK
imag(Lƒ(BüL
For(M,1,5
iPart(û2fPart(Ký^(ú12+2MüN
iPart(û2fPart(Lý^(ú12+2MüO
J+(N/2)+(O/2üJ
End

If not(J
Then
L‚(B)<0üS
abs(L‚(BüU
L„(BüV

.5Lƒ(BüLƒ(B+1
1üL(B+1

0üL…(B+1
For(F,0,1
If F
Then
VüW
1üI
1üJ
Else
UüW
1üI
1üJ
End
prgmÁFACTP
0üP
While Pødim(áFACT
P+1üP
If P+1÷dim(áFACT
Then
If áFACT(P)=áFACT(P+1
Then
P+1üP
I*áFACT(PüI
Else
J*áFACT(PüJ
End
Else
J*áFACT(PüJ
End
End

If F
Then
J*IüL„(B+1
L…(B+1)*J+àüL…(B+1
Else
IüL‚(B+1
JüL…(B+1
End
End

If S
6û4+Lƒ(B+1üLƒ(B+1

2üÁ
prgmÁRACLIST
A-2üA


Programme ThétaRACLIS1
For(B,A+Á,D
L(BüL(B-1
L‚(BüL‚(B-1
Lƒ(BüLƒ(B-1
L„(BüL„(B-1
L…(BüL…(B-1
L†(BüL†(B-1
End
D-ÁüD
Düdim(L
Düdim(L‚
Düdim(Lƒ
Düdim(L„
Düdim(L…
Düdim(L†


Programme ThétaRACLIST
For(B,A+Á,D
L(BüL(B-Á
L‚(BüL‚(B-Á
Lƒ(BüLƒ(B-Á
L„(BüL„(B-Á
L…(BüL…(B-Á
L†(BüL†(B-Á
End
D-ÁüD
Düdim(L
Düdim(L‚
Düdim(Lƒ
Düdim(L„
Düdim(L…
Düdim(L†


Programm ThétaSIN
A+1üB
If L(B)=1 and L(B+1)=3 and L‚(B+1)=ú1
Then
If L…(B)=1+à and L†(B)=1+à and (Lƒ(B)+0à=6û8+0à or L‚(B)=0
Then
L‚(B)/L„(BüC
2fPart(.5CüC
C+2(C÷0)üC
B+1üB

1üK

If C=0 or C=1
Then
1üL(B
0üL‚(B
0üLƒ(B
0üK
End

If C=1/6 or 5/6
Then
1üL(B
1üL‚(B
0üLƒ(B
2üL„(B
0üK
End

If C=1/4 or C=3/4
Then
1üL(B
0üK
1üL‚(B
0üLƒ(B
2üL„(B
2+àüL…(B
End

If C=1/3 or C=2/3
Then
1üL(B
1üL‚(B
0üLƒ(B
2üL„(B
3+àüL…(B
0üK
End

If C=1/2
Then
1üL(B
1üL‚(B
0üLƒ(B
0üK
End

If C=1+1/6 or C=1+5/6
Then
1üL(B
ú1üL‚(B
0üLƒ(B
2üL„(B
0üK
End

If C=5/4 or C=7/4
Then
1üL(B
ú1üL‚(B
0üLƒ(B
2üL„(B
2+àüL…(B
0üK
End

If C=4/3 or C=5/3
Then
1üL(B
ú1üL‚(B
0üLƒ(B
2üL„(B
3+àüL…(B
0üK
End

If C=3/2
Then
1üL(B
ú1üL‚(B
0üLƒ(B
0üK
End



If not(K
Then
2üÁ
prgmÁRACLIST
A-2üA


Programme ThétaTAN
A+1üB
If L(B)=1 and L(B+1)=3 and L‚(B+1)=ú1
Then
If L…(B)=1+à and L†(B)=1+à and (Lƒ(B)+0à=6û8+0à or L‚(B)=0
Then
L‚(B)/L„(BüC
C-int(C)üC
B+1üB

1üK

If C=0
Then
1üL(B
0üL‚(B
0üLƒ(B
0üK
End

If C=1/6
Then
1üL(B
1üL‚(B
0üLƒ(B
3+àüL…(B
0üK
End

If C=1/4
Then
1üL(B
1üL‚(B
0üLƒ(B
0üK
End

If C=1/3
Then
1üL(B
1üL‚(B
0üLƒ(B
3+àüL…(B
0üK
End

If C=2/3
Then
1üL(B
ú1üL‚(B
0üLƒ(B
3+àüL…(B
0üK
End

If C=3/4
Then
1üL(B
ú1üL‚(B
0üLƒ(B
0üK
End

If C=5/6
Then
1üL(B
ú1üL‚(B
0üLƒ(B
3üL„(B
3+àüL…(B
0üK
End


If not(K
Then
2üÁ
prgmÁRACLIST
A-2üA





Sandro

PS : je m'occupe demain des carractères spéciaux.