Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 25 Mai 2014, 1:15
Ce programme et ses routines récursives calculent une table de vérité.
L'équation est saisie à l'exécution du programme et stocké dans une chaîne de caractère (Str1).
Les multiplications (y compris implicites) et sommes sont supportés en place des opération binaires. Exemple : A+B*C+BD
La seconde saisie est la liste des variables saisies côte à côte. Tout caractère sauf L1, les nombres, et les parenthèses, les guillemets et les opérateurs "+" et "*" peuvent convenir.
Un des programmes routine génère une table en code Naturel et l'autre génère en code Gray (c'est-à-dire Binaire Réfléchi).
Mais mon programme est bien plus puissant.
D'abord une substitution des variables de l'expression est réalisée une seule fois pour permettre de contrôler au travers d'autres variables, c'est-à-dire les termes d'une liste.
Ensuite les tables ne sont pas générées par un incrément dun nombre et une conversion en binaire, tout est réalisé avec la récursivité.
Quelques optimisations sont encore possible mais le code actuel est déjà bien suffisant.
( On pourrait utiliser des caractères "1" au lieu des "." aux extrémités et ne plus s'embèter à supprimmer des extrémités plus tard. )
( On pourrait remplir la matrice avec les fonctions augment()/chaîne() et List>Matr(). )
( On pourrait permettre des noms de variables plus long, mais cela demanderait plus de travail ou encore imposerait un taille fixe pour chaque. )
Code
Input "EQUATION:",Str1
Disp "VARIABLES
Input Str2 // saisissez juste les lettres côte à côte
length(Str2->L
//je remplace les opérateurs */+ par and/or et les lettres par des termes de listes pour assurer les calculs plus tard
For(A,1,length(Str1
inString("+*",sub(Str1,A,1
If Ans // si c'est un opérateur + ou *
sub(Str1,1,A-1)+sub(" or and ",Ans,1)+sub(Str1,A+1,length(Str1)-A)->Str1
// remplace l'opérateur
//pas de problème de dimension puisque les opérateurs ne sont pas aux extrémités
End
// je remplace les lettres par des termes de listes dans l'expression
//mais besoin de supplément aux extrémités
"."+Str1+"."->Str1
For(A,1,L
//génération textuelle une seule fois pour chaque variable
0->R
")->Str3
While iPart(A10^(-R
R+1->R
// ci-dessous décortique un chiffre de A puis prend le caractère correspondant et concatène
sub("0123456789",1+int(10fPart(A10^(-R))),1)+Str3->Str3
End
"L1("+Str3->Str3
// remplacement de la variable par le terme de liste partout dans l'expression
1->Q
While Q
inString(Str1,sub(Str2,A,1),Q+1->Q
If Q
sub(Str1,1,Q-1)+Str3+sub(Str1,Q+1,length(Str1)-Q->Str1
End
End
//élimine les extrémités
sub(Str1,2,length(Str1)-2->Str1
//je génère les états de chaque variable avec chacune une itération du programme routine
{2^L,1+L->dim([A]
//pour le code naturel...
0->A
1->B
prgmTABVERN
Fill(0,L1 // remet à zéro pour permettre le programme suivant
//pour le code gray...
0->A
1->B
prgmTABVERG
Code
// programme TABVERN // N=Naturel
1+A->A
If A<=L
Then
0->L1(A
prgmTABVERN // appel récursif
1->L1(A
prgmTABVERN
Else
expr(Str1->[A](B,A // calcule le résultat de l'équation
For(D,1,L
L1(D->[A](B,D // remplit la matrice
End
B+1->B
End
A-1->A
Code
// programme TABVERG // G=Gray
1+A->A
If A<=L
Then
prgmTABVERG
not(L1(A->L1(A
prgmTABVERG
Else
expr(Str1->[A](B,A
For(D,1,L
L1(D->[A](B,D
End
B+1->B
End
A-1->A
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)