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 || !c

    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)".



  • 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" ?


  • Mod

    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 ?


  • Mod

    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.


Log in to reply