Seite 1 von 2

[gelöst] Logik-Operatoren und Klammern

Verfasst: Mi, 24.06.2015 15:30
von TrueColor
Hallo,

ich tu mich immer bisschen schwer, wenn mehrere Bedingungen für einen Gesamt-Wahrheitswert geprüft werden müssen. Mit Klammern ist das ganze kein Problem. Nur: Ich habe weder in der Doku noch, so weit ich mich erinnern kann, in diversen Quellcodes Prüfungen mit Klammern gefunden. Darf ich überhaupt Klammern verwenden? Ist der Ausdruck korrekt? Oder wie kann ich ihn ohne Klammern schreiben?

Code: Alles auswählen

If Not (sPart1 = sPart2 And sType1 = sType2) Then [...]
Vielen Dank!

Re: Logik-Operatoren und Klammern

Verfasst: Mi, 24.06.2015 18:19
von Karolus
Hallo

Woher sollen wir wissen ob der Ausdruck korrekt ist?

`not ( a=b and c=d)` ist equivalent zu `a<>b or c<>d`

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 07:55
von TrueColor
Karolus hat geschrieben:Woher sollen wir wissen ob der Ausdruck korrekt ist?
Öhm... du hast natürlich recht, die Frage ist Blödsinn.
`not ( a=b and c=d)` ist equivalent zu `a<>b or c<>d`
Danke dir!
Und darf ich nun Klammern verwenden oder sind Klammern nicht erlaubt?

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 09:12
von Karolus
Hallo

Sie sind erlaubt (sonst würde der Basic-Interpreter ja ein Fehlermeldung ausgeben)

Im Fall von `not ...` scheinen die Klammern sogar notwendig? -- soweit ich das jetzt getestet habe werden der|die Ausdrück|e sonst nicht sinnvoll ausgewertet.

nb:
`not (a=b and c=d)` ist nicht das gleiche wie `not (a=b) and c=d`

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 09:41
von Stephan
nb:
`not (a=b and c=d)` ist nicht das gleiche wie `not (a=b) and c=d`
das verstehe ich sofort, weshalb ich mich jetzt doch einmal oute das ich:
`not ( a=b and c=d)` ist equivalent zu `a<>b or c<>d`
nicht so recht verstehe. Ich habe den Ausdruck heute früh mehrfach überlegt, aber mir ist das nicht sicher verständlich obwohl ich sonst mit Logik-Ausdrücken keine Probleme habe.

Gib mir doch bitte mal einen Denkanstoss.


Gruuß
Stephan

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 10:22
von Karolus
Stephan hat geschrieben: das ich:
`not ( a=b and c=d)` ist equivalent zu `a<>b or c<>d`
nicht so recht verstehe. Ich habe den Ausdruck heute früh mehrfach überlegt, aber mir ist das nicht sicher verständlich obwohl ich sonst mit Logik-Ausdrücken keine Probleme habe.
`not ( a=b and c=d)` wird nur dann wahr, wenn mindestens eine der Bedingungen in der Klammer falsch ist.

`a<>b or c<>d` wird dann wahr, wenn mindestens eine der Bedingungen richtig ist, da die Bedingungen selbst das Gegenteil vom oberen Ausdruck sind, sind beide Ausdrücke gleich.

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 11:24
von Stephan
`not ( a=b and c=d)` wird nur dann wahr, wenn mindestens eine der Bedingungen in der Klammer falsch ist.
ja, verstehe ich
`a<>b or c<>d` wird dann wahr, wenn mindestens eine der Bedingungen richtig ist,
und das verstehe ich nicht, denn einerseits kann ich zwar nicht erklären warum es falsch sein sollte andererseits glaube ich rein intuitiv es müsste XOR sein.
Nein, ich behaupte nicht das OR falsch ist, aber ich bin unsicher.

Ich wollte gerade ein Makro schreiben um das Ganze durchzuprobieren, scheitere aber bereits an der Abbildung des ersten Ausdrucks (a=b and c=d), denn warum verdammt ist sind im Folgenden E und F True jedoch (E AND F) -1?

Code: Alles auswählen

Sub Main
A=10 : B=10 : C=5 : D=5
E = (A=B) 
F = (C=D)
Msgbox E & "-" & F & "-" & (E AND F) 
End Sub
oder auch:

Code: Alles auswählen

Sub Main
A=10 : B=10 : C=5 : D=5
x = (A=B) AND (C=D)
Msgbox x
End Sub


Gruß
Stephan

Tschuldigung, ich habe gerade nochmals geändert und sehe Dich schon als angemeldet.

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 12:06
von Karolus
Hallo
denn warum verdammt ist sind im Folgenden E und F True jedoch (E AND F) -1?
weil Basic immer wieder mal völlig kaputte implizite Konvertierungen abliefert.

Code: Alles auswählen

Msgbox E & " " & F & " " & cbool(E AND F)

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 13:31
von Krangel
Hi

Wahrheitstabellen sind besser als Intuition.
http://workupload.com/file/Gyzb4dvR
Grüße

Edit: Dateianhang

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 14:19
von Karolus
Krangel hat geschrieben:Hi

Wahrheitstabellen sind besser als Intuition.
http://workupload.com/file/Gyzb4dvR
Grüße
Prima, aber deine Tabelle hättest du besser gleich hier angehängt

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 16:20
von TrueColor
Karolus hat geschrieben:Sie sind erlaubt (sonst würde der Basic-Interpreter ja ein Fehlermeldung ausgeben)


Hm... das ist ein Argument :-)
Karolus hat geschrieben:Im Fall von `not ...` scheinen die Klammern sogar notwendig? [...]
nb:
`not (a=b and c=d)` ist nicht das gleiche wie `not (a=b) and c=d`
Ja, weil ja ohne Klammern strikt von links nach rechts ausgewertet wird, das hab ich zumindest schon irgendwo gelesen, was dann also
(not (a=b)) and (c=d) ergäbe
Krangel hat geschrieben:[Wahrheitstabellen]
Das ist mal übersichtlich!

Ich danke euch!

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 17:52
von Karolus
Hallo
Ja, weil ja ohne Klammern strikt von links nach rechts ausgewertet wird, das hab ich zumindest schon irgendwo gelesen, was dann also
(not (a=b)) and (c=d) ergäbe
Es wäre ja ok, wenn wenigstens der VergleichsOperator = vor der `not`-Operation ausgeführt würde, tut es aber nicht, ohne Klammern wird ausgewertet ((not a)=b) and (c=d)
und es kommt noch schlimmer, die Operation `not a` wird intern berechnet über den Term `(a*-1)-1` was prima funktioniert wenn a ein tatsächlich ein Wahrheitswert -1(wahr) oder 0(falsch) ist, nicht aber bei jeder anderen Zahl.

(Hab ich eigentlich schon erwähnt das Basic völliger Schrott ist?)
Bevor jemand die Frage stellt - ja Python macht das besser, Vergleichsoperatoren ( ==, <=, >=, <, >, !=) haben Vorzug vor logischen Operationen, und selbst ein einzelnes `not 42` gibt schlicht False zurück anstatt -43

Re: Logik-Operatoren und Klammern

Verfasst: Do, 25.06.2015 18:29
von TrueColor
oh... das klingt ja übel, bin bisher immer davon ausgegangen, dass generell Vergleichsoperatoren höchste Priorität haben.

Re: Logik-Operatoren und Klammern

Verfasst: Fr, 26.06.2015 09:27
von Stephan
Msgbox E & " " & F & " " & cbool(E AND F)
aah, OK.

Ich habs jetzt ausprobiert mit durchspielen aller Fälle durch Ändern der Variablenwerte in:

Code: Alles auswählen

tmp = ""
A=32 : B=13 : C=1 : D=5
E = (A=B) 
F = (C=D)
tmp = E & " " & F & " " & cbool(NOT(E AND F))
E = (A<>B)
F= (C<>D)
Msgbox tmp & CHR(13) & E & " " & F & " " & cbool(E OR F)
und sehe das das OR stimmt, ich muss aber wohl noch einige Tage mit 'dem kleinen Mann in meinem Kopf' kämpfen der das nur widerwillig verstehen mag.
Hab ich eigentlich schon erwähnt das Basic völliger Schrott ist?
zumindest heute noch nicht :-)

Womit hast Du denn ursprünglich programmieren gelernt?
Ich auf einer 8-Bit Maschine mit 16 KB Hauptspeicher und eben Basic-Interpreter. Jahre später, zur Zeit meine zweiten Studiums, wollte ich mich dann einmal rein aus Interese informieren wie sich die Technik weiterentwickelt hat und dank Studentenausweis gabs damals VB6 für 99 DM und der erste Eindruck von VB6 haftet irgendwie noch heute, wegen des riesigen Unterschieds zu dem 8Bit-Basic-Interpreter den ich bis dahin nur kannte.
Nö, ich mache hier keine Basic-Werbung, denn ich bin mir der zumindest niedrigen Effizienz von VB6 oder VB .Net bewusst, aber es ist halt bequem damit zu programmieren.

Beruflich hingegen ist es so das im Office-Bereich kaum ein Kunde von mir etwas Anderes nachfragt als Basic, der Grund ist einfach: es hat sich in den Jahren in den Firmen genügend eigenes (Halb-)Wissen zu VBA angesammelt und so kommt man mit StarBasic auch ganz gut zurecht. Für andere Sprachen müsste man Mitarbeiter erst schulen und das würde kosten.
Weil das so ist habe ich wenig 'Druck' mich mit Alternativen zu beschäftigen. Wenn dann käme für mich Python in Frage (aber Du weist ja das ich damit schon einmal begonnen hatte das zu lernen).





Gruß
Stephan

Re: Logik-Operatoren und Klammern

Verfasst: Fr, 26.06.2015 17:08
von Dreh-Gel
Moin,

Karolus hat recht mit
not ( a=b and c=d)` ist equivalent zu `a<>b or c<>d
Das liegt an den deMorganschen Gesetzen https://de.wikipedia.org/wiki/De_Morgansche_Gesetze

Also: Not( a=b and c=d ) ergibt Not (a=b) or Not (c=d)
und Not (a=b) ist a<>b

cu.