Boolsche Algebra - Funktionen vereinfachen?

klar, aber garantieren kann ich für nichts, weil ich im moment ein paar andere dinge zu tun hab. aber grundsätzlich würd ich das mal so anfangen:
Code:
Private Sub btnParsen_Click()
Dim strTokens() As String
Dim i As Integer

'Eingegebenen Ausdruck zerlegen
If txtEingabe.Text <> "" Then
    strTokens() = Split(txtEingabe.Text, " ")
End If

For i = 0 To UBound(strTokens)
    If LCase(strTokens(i)) = "not" Then
        'logischen NOT-Operator gefunden
    ElseIf LCase(strTokens(i)) = "or" Then
        'logische OR-Verknüpfung gefunden
    ElseIf LCase(strTokens(i)) = "and" Then
        'logische AND-Verknüpfung gefunden
    ElseIf strTokens(i) = "(" Then
        'linke Klammer gefunden
    ElseIf strTokens(i) = ")" Then
        'rechte Klammer gefunden
    Else
        'Variable oder Wert gefunden
    End If
Next i

End Sub
in der schleife prüfst du jedes gefundene token auf seine bedeutung. dann kannst du später mit den fallunterscheidungen verschiedene aktionen für die gefundenen tokens durchführen. z.b. prüfen, ob ein gefundener wert in einer klammer steht oder ähnliches.
ich mach morgen mal weiter.
 
Das ist au jeden Fall schon mal cool.
Aber wäre es nicht günstiger, nicht gleich alles so klein zu zerstückeln.
Wäre es nicht günstiger die Terme die in einer Klammer stehen als einzelne Strings zu speichern und diese dann an eine Funktion zu übergeben, wo sie ausgewertet werden?
Oder wie würdest du ab dieser Stelle rangehen?

Aber auf jeden Fall schon mal Danke!
Solche Hilfen sind echt super. Sind nen paar nette Befehle dabei, die ich nicht kannte. Echt praktisch!
Tja, Übung macht den meister!:)
 
stimmt, mir ist auch eingefallen, dass es sinnvoller wäre, erstmal teilterme auszuschneiden. das ganze könnte man z.b. als rekursive funktion laufen lassen, bis alle teilterme aufgelöst sind.
teilterme erkennt man ja daran, dass sie umklammert sind. also durchsuchst du einfach rekursiv den gesamten term nach eingeklammerten blöcken.

ausserdem ist mir an dem code noch aufgefallen, dass er zwar funktioniert, aber nicht ganz sauber läuft. z.b. wird
Code:
not(a and b)
nicht richtig aufgeteilt, weil zwischen not, der klammer und a kein leerzeichen steht. das array sieht also nachher so aus: ("not(a", "and", "b)").

alles weitere müsste ich aber auch selber ausprobieren. sieh dir doch einfach mal in der hilfe oder in einem buch die befehle zur verarbeitung von strings an.
als vorrübergehendes ziel kannst du ja eine kleine aufgabe nehmen, beispielsweise die vereinfachung von dieser anweisung:
Code:
not (not (a and b))
und noch was: um das ganze zu perfektionieren kannst du natürlich auch noch eine kleine syntax-prüfung mit einbauen, indem du sicherstellst, dass zu jeder linken klammer "(" auch eine rechte klammer ")" steht.
 
Den kleinen Fehler mit dem Leerzeichen hab ich auch schon mitbekommen. Aber ich denke, dass das kein so arges Problem ist.
Dann muss man halt den User daraufhinweisen.
Und wenn man dann sowieso ne Syntaxprüfung macht,kann der User ja gleich drauf hingewiesen werden.
 
Ich bezweifle zwar, dass das Problem noch aktuell ist, aber falls doch...

Meines Wissens nach wird es grundsetzlich so gemacht, dass man nicht den Ausdruck abklappert und versucht ihn direkt unter Verwendung von Distributivgesetz & Co zu optimieren, sondern in dem man Algorithmen wie die Verwendung von Karnaugh-Veitch-Diagrammen implementiert. So würde man das im übrigen ja auch mit Papier und Bleistift lösen, wobei man dann aber bei 10 stelligen Ausdrücken schon ziemlich viel Papier brauchen würde :).
 

Neue Beiträge

Zurück