Delphi-PRAXiS

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)

cltom 5. Sep 2011 09:29

Delphi-Version: 5

"if boolean then if" ersetzen
 
Hej,

(wie) kann ich folgende Abfrage durch eine einfachere logische Verknüpfung ersetzen?

Delphi-Quellcode:
var
  showzero : boolean;

if showzero then
  showvalue
else
  if y>0 then
    showvalue;
Bin nach einigem Probieren noch auf keine Lösung gekommen, um die holprigen if-Abfragen zu umgehen.

danke und gruß
thomas

jfheins 5. Sep 2011 09:32

AW: "if boolean then if" ersetzen
 
Ungefähr so:
Delphi-Quellcode:
var
  showzero : boolean;

if showzero or (y>0) then
  showvalue
Oder habe ich jetzt was übersehen? :gruebel:

@xaromz (unter mir): Deins ist auf jeden Fall identisch mit meinem. Denn wenn showzero wahr ist, ist das Ergebnis der and Verknüpfung irrelevant. Und wenn showzero falsch ist, steht links von dem and ein wahr, damit wird das and überflüssig ;-)

xaromz 5. Sep 2011 09:33

AW: "if boolean then if" ersetzen
 
Hallo,

Delphi-Quellcode:
var
   showzero : boolean;

if (showzero or (not showzero and (y > 0))) then
   showvalue;
Gruß
xaromz

himitsu 5. Sep 2011 09:40

AW: "if boolean then if" ersetzen
 
@xaromz: Theoretisch hast du Recht und dein Code entspricht funktional genau dem ursprünglichen statement, aber praktisch kann man das auf die Version von jfheins zusammankürzen.

cltom 5. Sep 2011 09:45

AW: "if boolean then if" ersetzen
 
Himmel. Eine einfache or hat's getan. Danke!

Meine Konstruktionen waren auch nahe dran an dem, was xaromz gefunden hat (in punkto umständlich), aber dann doch falsch ...

peinlich ... :oops:

Danke jedenfalls!

xaromz 5. Sep 2011 09:58

AW: "if boolean then if" ersetzen
 
Hallo,
Zitat:

Zitat von himitsu (Beitrag 1121740)
Theoretisch hast du Recht und dein Code entspricht funktional genau dem ursprünglichen statement, aber praktisch kann man das auf die Version von jfheins zusammankürzen.

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.

Gruß
xaromz

angos 5. Sep 2011 10:05

AW: "if boolean then if" ersetzen
 
Hi xaromz,

magst du mir einmal erlären, wie sich die Aussagen unterscheiden? Ich sehe jetzt erstmal keine Möglichkeit, dass sich das Programm bei der Variante von jfheins anders verhalten sollte als in deiner oder der Ursprungsvariante.


verwirrte Grüße

xaromz 5. Sep 2011 10:10

AW: "if boolean then if" ersetzen
 
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

Medium 5. Sep 2011 10:16

AW: "if boolean then if" ersetzen
 
Dann hättest du, genauso wie jfheins, ein xor verwenden müssen, da das bei dir grad so nach "entweder" oder klingt. Es macht an dieser Stelle aber wirklich keinen Unterschied im Ergebnis, das würde es nur wenn unterschiedliche Funktionen in den if- und else-Zweigen aufgerufen würden.

Memnarch 5. Sep 2011 10:20

AW: "if boolean then if" ersetzen
 
Naja..das ursprüngliche konstrukt und die sehr kompakte variante reagieren aber gleich.
Deswegen ist noch die relevanz der zustände zu klären, ich sehe ansonsten auch keinen unterschied.

Ursprünglich:
Wenn showzero gesetzt -> Dann ShowValue
Wenn showzero aber nicht gesetzt und Y wenigstens > Null -> ShowValue

Keiner der beiden zustände schließt den anderen aus. Und wie Medium bereits gesagt(hui RoterKasten^^) wird bei beiden bedingungen dasselbe aufgerufen.

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 19:40 Uhr.

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