Utiliser la calculatrice pour traiter des fonctions binaires

Résolu
Daghis Messages postés 22 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 10 octobre 2010 - 18 mars 2005 à 15:38
Daghis Messages postés 22 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 10 octobre 2010 - 26 mars 2005 à 11:01
Coment utiliser la calculatrice (ou autre) en lui envoyant la valeur booléenne de mes variables comme suivant:
(1 and ((0 or 1) and (1 xor 0) or 1) or 1) et récupérer le résultat dans mon programme.

J'ai recherché dans les OCX, je n'ai rien trouvé

Merci d'avance !

6 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
20 mars 2005 à 12:53
Je n'ai pas retrouvé le code mais je l'ai recréé. Ca donne la petite fonction suivante.
Le seul problème est le type de tes variables LS, LT, ... et le type de résultat que tu veux obtenir.
Il faut savoir que le type Boolean, en VB, c'est VRAI (valeur : -1) ou Faux (valeur 0). Si tu codes LS=1 ou LS=TRUE, en réalité il y aura -1 dedans. Donc, dans ma fonction j'utilise abs() pour supprimer le signe et je renvoie de l'integer. Ainsi, si tes LS,LT,... sont boolean ou integer ça marchera pareil. A toi de savoir comment tu traites le résultat.
dim r as boolean
r=resultat(TaChaine) te renvoie FAUX ou VRAI (0 ou -1)
dim r as integer
r=resultat(TaChaine) te renvoie 0 ou 1

Je suis parti du principe que ta chaine d'origine ne comportait aucune erreur (du genre nb de parenthèses ouvertes et fermées inégal ou autre). La, c'est à toi de voir.

Public Function Resultat(ByVal s As String) As Integer
Dim sResult As String


'pour la commodité du traitement, suppression de tous les espaces
sResult = UCase(Replace(s, " ", ""))

'transformation de la chaine
sResult = Replace(sResult, "LS", Abs(LS))
sResult = Replace(sResult, "LT", Abs(LT))
sResult = Replace(sResult, "LU", Abs(LU))
sResult = Replace(sResult, "LV", Abs(LV))

'évaluation de la chaine, dans l'ordre de priorité
Do While InStr(sResult, "(") > 0
'NOT
sResult = Replace(sResult, "NOT0", "1")
sResult = Replace(sResult, "NOT1", "0")
'AND
sResult = Replace(sResult, "0AND0", "0")
sResult = Replace(sResult, "0AND1", "0")
sResult = Replace(sResult, "1AND0", "0")
sResult = Replace(sResult, "1AND1", "1")
'OR
sResult = Replace(sResult, "0OR0", "0")
sResult = Replace(sResult, "0OR1", "1")
sResult = Replace(sResult, "1OR0", "1")
sResult = Replace(sResult, "1OR1", "1")
'XOR
sResult = Replace(sResult, "0XOR0", "0")
sResult = Replace(sResult, "0XOR1", "1")
sResult = Replace(sResult, "1XOR0", "1")
sResult = Replace(sResult, "1XOR1", "0")
'suppression des parenthèses obsolètes
sResult = Replace(sResult, "(0)", "0")
sResult = Replace(sResult, "(1)", "1")
Loop

End Function

Loup Gris
3
Daghis Messages postés 22 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 10 octobre 2010
20 mars 2005 à 17:29
Loup Gris,

Je te remercie. Je crois avoir compris et tu me me mets sur le bon chemin.

Concernant le type de variable LS, LT etc en fait je les déclare de type byte. Cela me
permet d'avoir 0 pour faux et de 1 à 255 pour vrai.

Je fais mes essais et ne manquerai pas de t'informer le week end prochain

Daghis
3
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
18 mars 2005 à 19:36
Salut,

En VB, on peut faire ça sans ocx ni calculatrice. Il suffit de déclarer la varaible réceptrice non pas en boolean mais en integer.

Dim b As Integer
b = (1 And ((0 Or 1) And (1 Xor 0) Or 1) Or 1)
MsgBox b

Loup Gris
0
Daghis Messages postés 22 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 10 octobre 2010
19 mars 2005 à 19:24
Loup Gris,

Je te remercie pour ta réponse.
Mais je me rends compte que j'ai mal formulé ma question.
En effet, je récupére des formules de type texte comme :
"LS and LT or (LS and LU) and LV"
"Not (LS and (LT or(LS an LU)) and LV)"
etc...

Je sais comment rechercher dans le texte et traiter individuellement les variables concernées pour en connaitre leur valeur booléenne de la manière suivante :

Dim LT as booléan
Dim LS as booléan
LS = 1 ' Etat qui change suivant le programme
LT = 0 ' Etat qui change suivant le programme
etc...
Function Etat(byval Texte as String) as booléen
Select Case Texte
Case "LS": Etat = LS
Case "LT": Etat = LT
etc...
End Select
end Function

Les formules ne sont jamais identiques et je ne sais jamais ou seront les or and et surtout où seront placées les parenthéses.
En résumé je voudrais envoyé toute la formule :
"LS and LT or (LS and LU) and LT" transfomée en
1 and 0 or (1 and 0) and 0
et en recevoir le résultat.

Daghis
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
19 mars 2005 à 21:40
Pour ce qui est de transformer une chaine comme s="LS and LT or (LS and LU) and LT", je ferais plutôt :
replace (s,"LS",LS)
replace (s,"LT",LT)
replace (s,"LU",LU)
...

Pour ce qui est de l'évaluation du résultat : 1 and 0 or (1 and 0) and 0, soit il faut passer par une analyse de la chaine (pas facile) soit tu te sers d'un moteur de bdd comme par exemple :

' dans le menu Projet/References... cocher "Microsoft DAO 3.51 Object Library" ou autre dans le même genre.


Private Sub Form_Load()
Dim db As Database
Dim rs As Recordset
Dim fic As String
Dim question As String


question = "1 and 0 or (1 and 0) and 0"


'nom de la base bidon
fic = App.Path & "\bidon.dat"

'création d'un fichier vide pour simuler une BDD
Open fic For Output As #1
Print #1, ""
Print #1, ""
Close


'ouverture de cette fausse BDD
Set db = OpenDatabase(App.Path, False, True, "Text;")
'envoi de la requete pour calcul par le moteur de BDD
Set rs = db.OpenRecordset("SELECT " & question & " FROM truc.dat")

'affichage du résultat
MsgBox Abs(rs(0))

'on fait le ménage
Kill fic
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing

End Sub

Si je retrouve mon code d'évaluation de chaine mathématique, je te le poste.

Loup Gris
0
Daghis Messages postés 22 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 10 octobre 2010
26 mars 2005 à 11:01
Loup Gris,

J'ai fait mes essais et le résultat est parfait.

J'ai juste ajouté à la ligne :

'évaluation de la chaine, dans l'ordre de priorité
Do While InStr(sResult, "(") > 0

la modif suivante :

'évaluation de la chaine, dans l'ordre de priorité
Do While InStr(sResult, "(") > 0 or len(sResult)>1

pour avoir en dernier une réponse du type 1 au lieu de 1AND1
Encore merci.

Bonne journée

Daghis
0
Rejoignez-nous