Forum

Catégorie : Programmes
Forum : Les programmes des internautes
Vues : 1153
Réponses : 6
Type : discussion
Etat : réponses autorisées

Table de vérité

CaltoDev' le 17/05/2014 à 10:29
Bonjour,

Je poste ma nouvelle merveille.
C'est un programme qui calcule la table de vérité associée à une équation logique.

On entre l'équation logique, ensuite on entre les variables, et on attend... parce qu'à partir de 4 variables, il faut attendre longtemps (>30 sec)
'fin bref, vous verrez par vous même. La table de vérité est stockée dans la matrice [A], et comme l'affichage de la matrice dans le programme ne permet pas de la faire défiler, il faudra surement rappeler la matrice une fois le programme effectué.


ps: j'aurais bien mis le nom des variables sur la première ligne du tableau pour plus de visibilité, mais c'est malheureusement impossible... dommage.

Il est surement possible de détecter les variables directement dans l'équation au lieu de les entrer à la mais, mais j'ai eu la flemme de le coder et de tt façon, c'est pas génant.

Postez vos impressions !

voila le code :

Code
EffEcr
Disp "EQUATION:
Input "S=",Chaîne1
Disp "","NB DE VARIABLES:
Input "",N
" "->Chaîne2
Disp ""
For(X,1,N
Input "VAR:",Chaîne0
Chaîne2+Chaîne0->Chaîne2
End
sous-Chaîne(Chaîne2,2,N)->Chaîne2
2^N->L
N+1->C
EffVar [A]
{L,C}->dim([A]
EffEcr
Output(3,3,"VEUILLEZ
Output(5,5,"PATIENTER...
For(X,1,L
X-1->X
"0"->Chaîne0
1->Q
While Q!=0
partEnt(N/2)->Q
N-2*Q->R
sous-Chaîne("01",R+1,1)+Chaîne0->Chaîne0
Q->N
End
sous-Chaîne(Chaîne0,1,longueur(Chaîne0)-1)->Chaîne0
longueur(Chaîne0)->M
If M<C
Then
For(H,M,C-2
"0"+Chaîne0->Chaîne0
End
End
For(Y,1,C-1
expr(sous-Chaîne(Chaîne0,Y,1))->[A](X,Y)
End
End
"("+Chaîne1+")"->Chaîne1
For(X,1,L
Chaîne1->Chaîne5
For(Y,1,C-1
While carChaîne(Chaîne5,sous-Chaîne(Chaîne2,Y,1))!=0
carChaîne(Chaîne5,sousChaîne(Chaîne2,Y,1))->R
sous-Chaîne(Chaîne5,1,R-1)+sous-Chaîne("01",([A](X,Y)=1)+1,1)+sous-Chaîne(Chaîne5,R+1,longueur(Chaîne5)-R)->Chaîne5
End
End
expr(Chaîne5)->[A](X,C)
End
EffEcr
Disp [A]
Output(1,1,Chaîne1
m@thieu41 le 17/05/2014 à 10:36
Salut,
Pour permettre un défilement de la matrice, utilise Pause au lieu de Disp:
Code
Pause [A]
CaltoDev' le 17/05/2014 à 21:50
Bonne idée !
J'ai rajouté l'affichage des variables en dessous de la matrice et la possibilité de la faire défiler

Voila ce qu'il faut rajouter après le dernier EffEcr a la fin :

Code
EffEcr
Chaîne2+"S"->Chaîne2
longueur(Chaîne2)->L
For(X,1,L
Output(8,16-2X, sous-Chaîne(Chaîne2,L-X+1,1
End
Pause [A]
Output(1,1,
m@thieu41 le 17/05/2014 à 23:37
Par contre à la dernière ligne tu as du oublier d'ouvrir un guillemet (on comprend normalement mais pour ceux qui ne s'y connaissent pas on risque d'avoir des questions "pourquoi err:syntaxe") :
Code
Output(1,1,"
linkakro le 18/05/2014 à 01:03
Intéressant.
Je ne sais pas par qule bout prendre ton algorithme. J'apprécierais des commentaires.

Sache que le dernier calcul d'un programme est renvoyé comme résultat de calcul à l'écran principal, et donc une Pause est facultative puisque l'écran principal permet alors de défiler. Je te propose de simplement placer la matrice sur la dernière ligne.

Je me demande si générer les entrées du tableau est vraiment important pour le code naturel. Par contre j'envisage de permettre le code Gray ("binaire réfléchi").

Dans certains cas tu peux stocker l'expression dans une variable d'équation et te passer de expr().

J'ai mes propres idées à appliquer à ce problème. Je posterai ça ailleurs.
Je veux gérer les variables une par une avec de la récursivité ou un équivalent.
CaltoDev' le 18/05/2014 à 12:28
Oups, oui bien sur, il y a évidemment un guillemet à la fin du code ^^
linkakro le 25/05/2014 à 01:19
J'ai fini l'essentiel de ma version que je vous conseille en remplacement.
https://tout82.pages-perso.fre[...].php?sujet=4054

Il est bien plus performant car il ne repose pas sur les substitutions de la chaîne de caractères pour les valeurs binaires : il remplace les variables puis les calculs sont réalisés par application numérique.