Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   "if boolean then if" ersetzen (https://www.delphipraxis.net/162767-if-boolean-then-if-ersetzen.html)

patti 5. Sep 2011 10:29

AW: "if boolean then if" ersetzen
 
Beide Varianten haben zumindest das selbe Ergebnis. Beweis durch Wahrheitstabelle:

Code:
showzero    |    y > 0    |    ((showzero) || (y > 0))   |    ((showzero) || ((-showzero) && (y > 0)))
   0        |      0      |                0              |                     0
   0        |      1      |                1              |                     1
   1        |      0      |                1              |                     1
   1        |      1      |                1              |                     1

Sir Rufo 5. Sep 2011 10:32

AW: "if boolean then if" ersetzen
 
Zitat:

Zitat von xaromz (Beitrag 1121749)
Hallo,

das eine Programm ruft die Funktion auf, wenn a) showzero gesetzt ist oder b) y größer Null ist.

Das andere Programm ruft die Funktion auf, wenn a) schowzero gesetzt ist oder b) y größer Null ist, aber showzero nicht gesetzt ist.

Gruß
xaromz

Und wo ist jetzt der Unterschied in beiden Aussagen?

Mal mathematisch/logisch betrachtet:
Code:
A or ( not A and B ) = ( A or not A ) and ( A or B ) = A or B
(A or not A) ist immer WAHR!

jfheins 5. Sep 2011 10:35

AW: "if boolean then if" ersetzen
 
Zitat:

Zitat von xaromz (Beitrag 1121746)
Das kommt immer darauf an, was gewollt ist. Die beiden Lösungen unterscheiden sich fundamental in ihrer Aussage. Wenn die einfache Variante gemeint ist, dann ist das in Ordnung, aber die Aussage, dass die beiden Statements praktisch gleichwertig sind ist grob falsch. So gesehen war auch der Ursprungscode falsch.

Falls y keine Funktion ist, sondern eine Variable gilt:
Die beiden Lösungen unterscheiden sich in keiner Weise, das Ergebnis ist exakt identisch.

Man kann sie auch ineinander umformen.
Vorraussetzung: y und showzero bleiben bei mehrfacher Auswertung konstant.
Ich definiere:
a := showzero
b := not showzero
c := y > 0

xaromz Statement wird damit zu
Code:
a or (b and c)
Und das Distributivgesetz sagt:
Code:
a or (b and c) = (a or b) and (a or c)
Es gilt:
Code:
a or b = a or (not a) = true
Damit wird die Formel zu:
Code:
true and (a or c) = a or c
q.e.d.

Mit teilweiser Boolescher Auswertung (standardmäßig aktiviert) entspricht der Code komplett den Ursprungscode, bei deaktivierter teilweiser Auswertung wird in jedem Fall (y>0) geprüft, falls y also eine Funktion ist wird diese immer ausgeführt und nicht nur falls showzero falsch ist.

Oha, roter Kasten. Aber das mit der teilweisen Auswertung hat noch keiner gesagt :mrgreen:

himitsu 5. Sep 2011 10:37

AW: "if boolean then if" ersetzen
 
Jupp, das zweite Statment
Delphi-Quellcode:
{... else} if y > 0 then
entspricht ja
Delphi-Quellcode:
if not showzero and (y > 0) then
.

Nun kann man die Beiden also zusammenfassen
Delphi-Quellcode:
if showzero or (not showzero and (y > 0)) then
(wie xaromz es richtig gemacht hat)

Jetzt noch Kürzen, die Klammern auflösen usw.:
Delphi-Quellcode:
if showzero or (not showzero and (y > 0)) then

// beide AND-Teile in Klammern (damit der nächste Einfügeprozess einfacher zu erkennen ist)
if showzero or ((not showzero) and (y > 0)) then

// das OR auflösen, bzw. OR und AND austauschen ... also den linken OR-Teil in beide AND-Teile einfügen
if (showzero or not showzero) and (showzero or (y > 0)) then

// x or not x = true
if true and (showzero or (y > 0)) then

// nun nur noch "true and ..." rauskürzen und fertig
if showzero or (y > 0) then

[edit]
menno :cry:

cltom 5. Sep 2011 11:11

AW: "if boolean then if" ersetzen
 
Falls es für die Diskussion noch erforderlich ist:

y ist eine Variable. Es soll nicht mehr passieren als dass alle Werte angezeigt werden, ausser eben der User will Null-Werte nicht angezeigt haben (und die Werte sind auch wirklich Null).

Ich hoffe, ich hab durch meine urpsrüngliche Problemstellung niemanden auf die falsche Fährte gelockt.

btw. "roter Kasten" wie/wo/was?

mquadrat 5. Sep 2011 11:22

AW: "if boolean then if" ersetzen
 
Der rote Kasten ist ein Hinweis, der eingeblendet wird, wenn während dem Schreiben einer Antwort neue Antworten anderer Benutzer hinzugekommen sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz