![]() |
Delphi-Version: 5
"if boolean then if" ersetzen
Hej,
(wie) kann ich folgende Abfrage durch eine einfachere logische Verknüpfung ersetzen?
Delphi-Quellcode:
Bin nach einigem Probieren noch auf keine Lösung gekommen, um die holprigen if-Abfragen zu umgehen.
var
showzero : boolean; if showzero then showvalue else if y>0 then showvalue; danke und gruß thomas |
AW: "if boolean then if" ersetzen
Ungefähr so:
Delphi-Quellcode:
Oder habe ich jetzt was übersehen? :gruebel:
var
showzero : boolean; if showzero or (y>0) then showvalue @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 ;-) |
AW: "if boolean then if" ersetzen
Hallo,
Delphi-Quellcode:
Gruß
var
showzero : boolean; if (showzero or (not showzero and (y > 0))) then showvalue; xaromz |
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.
|
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! |
AW: "if boolean then if" ersetzen
Hallo,
Zitat:
Gruß xaromz |
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 |
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 |
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.
|
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. |
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 |
AW: "if boolean then if" ersetzen
Zitat:
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! |
AW: "if boolean then if" ersetzen
Zitat:
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:
Und das Distributivgesetz sagt:
a or (b and c)
Code:
Es gilt:
a or (b and c) = (a or b) and (a or c)
Code:
Damit wird die Formel zu:
a or b = a or (not a) = true
Code:
q.e.d.
true and (a or c) = a or c
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: |
AW: "if boolean then if" ersetzen
Jupp, das zweite Statment
Delphi-Quellcode:
entspricht ja
{... else} if y > 0 then
Delphi-Quellcode:
.
if not showzero and (y > 0) then
Nun kann man die Beiden also zusammenfassen
Delphi-Quellcode:
(wie xaromz es richtig gemacht hat)
if showzero or (not showzero and (y > 0)) then
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: |
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? |
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 07:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz