logische Ausdruecke umformen in C++
-
Hallo zusammen.
Ich brauche euren Rat
folgender logischer Ausdruck ist gegeben:
a ∧ b ∨ ¬ c
Nun soll ich diesen so umformen das ich ihn in einem C++ Programm benutzen kann und ihn umgangssprachlich beschreiben.
Ich sitze da jetzt schon ewig dran.. Das habe ich bisher "erreicht":
a && b || ! c = wahr wenn A und B wahr sind oder C nicht wahr ist.
Meine Frage:
1. Stimmt das umformen des Ausdruckes für das C++ Programm?
2. Ist die Umgangssprachliche Beschreibung sinnig?Bin für jeden Rat dankbar.
-
Jo, stimmt.
a ∧ b ∨ ¬ c
=>
(a ∧ b) ∨ (¬c)
=>
(a && b) || (!c)
=>
a && b || !cMusst aufpassen, dass die Version ohne Klammern das gleiche macht wie die mit. In C++ ist es nämlich so, dass das && höhere Priorität hat als das ||, d.h. "a||b && !c" wäre "a||(b && !c)".
-
Danke für die Hinweise.
Habe noch 2 weitere logische Ausdrücke die ich umformen möchte aber irgendwie komm ich nicht weiter
1. ¬ (a ∨ b) ∨ c (die klammer verunsichert mich noch dazu)
2. a ∧ b ∧ c ∨ ¬ d
Kann mir hier vielleicht jemand beim umformen helfen?
-
Ist doch eigentlich ganz einfach. Einfach die mathematischen Zeichen durch die entsprechenden C++-Operatoren ersetzen. Mich wundert nur, warum deine zweite Formel nicht geklammert ist, obwohl sie unterschiedliche Operatoren enthält.
-
bankdar schrieb:
Musst aufpassen, dass die Version ohne Klammern das gleiche macht wie die mit. In C++ ist es nämlich so, dass das && höhere Priorität hat als das ||, d.h. "a||b && !c" wäre "a||(b && !c)".
Ist es doch in der Logik doch praktisch immer auch.
Spätestens wenn man es in die für die boolsche Algebra üblkiche Notation umformt wird es doch ganz klar:a ∧ b ∨ ¬ c
->
a * b + !c
Genauso bei den neuen Aussagen:
1. ¬ (a ∨ b) ∨ c (die klammer verunsichert mich noch dazu)
->
!(a + b) + c
->
!(a || b) || c
-
Das Umformen für C++ klappt nun.
Aber wie kann ich " ¬ (a ∨ b) ∨ c " umgangssprachlich beschreiben? Wahr wenn....
Was hat die Klammer zu bedeuten? Wird die Klammer bevorzugt "bearbeitet" ?
-
Jos schrieb:
Was hat die Klammer zu bedeuten? Wird die Klammer bevorzugt "bearbeitet" ?
Ja. So wie Klammern in mathematischen Ausdrücken.
Für die Umgangssprache ist die Klammer schwierig auszudrücken. Man könnte es umstellen und daraus "Entweder c, oder a und b beide nicht" machen, in der Annahme, dass dann die Betonung die Klammern ausdrückt. Oder man muss es wirklich lang umschreiben.
-
Hi SeppJ,
danke für deine Tipps.
Nur für mein Verständnis:
So weit ich weiß sind die Prioritäten der Operatoren folgende:
! = höchste Prio
&& = kommt nach !
|| = kommt nach &&Muss dann dieser Ausdruck " a ∧ b ∨ ¬ c " in Klammern gesetzt werden?
Also quasi: (a && b) || !c ?
-
Also quasi: (a && b) || !c ?
Diese Klammern sind redundant. a && b || !c macht genau das gleiche. Kann aber die Lesbarkeit erhöhen, für Leute, die nicht so fit sind mit Operatorpriorität.
Jos schrieb:
Muss dann dieser Ausdruck " a ∧ b ∨ ¬ c " in Klammern gesetzt werden?
Ich nehme doch mal an, dass im mathematischen Ausdruck die gleichen Prioritäten gelten sollen wie in C++, oder? Die von dir genannte Reihenfolge ist zumindest die übliche Konvention in der Aussagenlogik, daher hat man das in C++ (und fast allen anderen Programmiersprachen) auch so übernommen.
-
Ich habe hier mal 4 Ausdrücke die ich umgeformt habe.
Kann mir da jemand sagen ob ich damit richtig liege:a) a ∧ b ∨ ¬ c = ( a && B ) || ! c
b) ¬ (a ∨ b) ∨ c = ! ( a || b ) || c
c) a ∨ b ∨ c = a || b || c
d) a ∧ b ∧ c ∨ ¬ d = (a && b && c) || ! d
-
Richtig. Zumal die ersten beiden schon beantwortet wurden.
Wie andere schon gesagt haben, ist das ganze doch trivial. Du ersetzt v durch ||, ∧ durch && und ¬ durch !, da die Priorität sich nicht ändert.