Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein (https://www.delphipraxis.net/188339-elegante-loesung-gesucht-3-boolean-werte-nur-einer-darf-gesetzt-sein.html)

Union 23. Feb 2016 10:39

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Ich würde auch ein Bool Array vorziehen:
Delphi-Quellcode:
function IsNumberOfValuesSet(const AValues : array of Boolean; AMax : Integer = 1) : Boolean;
var
  LCount : Integer;
begin
  LCount := 0;
  for Result in AValues do
    if Result then
    begin
      Inc(LCount);
      if LCount > AMax then
        Break;
    end;
  Result := LCount = AMax;
end;

begin
  Writeln(IsNumberOfValuesSet([False]));
  Writeln(IsNumberOfValuesSet([False, True]));
  Writeln(IsNumberOfValuesSet([False, True, False]));
  Writeln(IsNumberOfValuesSet([False, True, False, True]));
  Writeln(IsNumberOfValuesSet([False, True, False, True], 2));
  Readln;
end.

himitsu 23. Feb 2016 12:57

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Delphi-Quellcode:
B1=True
Wobei man das ja eigentlich nicht macht.

Die mathematischen Lösungen mit Ord gehen natürlich nur unter der Annahme, daß man davon ausgeht, daß nur True oder False drin steht.

Wobei True = not False, bzw. True <> "True".
Der Delphi-Boolean kennt ja 254 "True" und ein False, deswegen auch niemals
Delphi-Quellcode:
B1=True
:stupid:

EricMeyer 23. Feb 2016 13:08

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
oder sowas

function CountTrues (ABoolean :array of Boolean):Integer
for i ...
result := result + ((-1)*strtoint(booltostr(ABoolean [i])))

Delphi-Laie 23. Feb 2016 13:12

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Zitat:

Zitat von himitsu (Beitrag 1331094)
Delphi-Quellcode:
B1=True
Der Delphi-Boolean kennt ja 254 "True" und ein False, deswegen auch niemals
Delphi-Quellcode:
B1=True
:stupid:

Fangen die modernen Delphi-Compiler (so ab Version XEx) diese Programmierschludrigkeit nicht endlich ab? Genaugenommen ist das ja kein Fehler, denn rein von der booleschen Logik ist true=true.

Und das "=true" passiert vermutlich auch so manchem gestandenen Programmierer dann und wann, das ist einfach mental zu aufdringlich. Dito: "=false" anstatt "if not"....

himitsu 23. Feb 2016 13:22

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Nein, das darf nicht abgefangen werden.

Es kommt auf die "Auswertung an, also ob man es logisch oder binär vergleich ... = ist in Pascal immer "binär".

Nur bei der Typkonvertierung zwischen Boolean/ByteBool/WordBool/LongBool/Variant wird der logische Wert konvertiert.

TiGü 24. Feb 2016 11:38

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Um das nochmal aufzugreifen:
(~a*~b*c)+(~a*b*~c)+(a*~b*~c) in http://www.elektroniker-bu.de/kvdiagramm.htm reingehauen und sehen, dass die DNF nicht vereinfacht werden kann.
Kannst auch die KNF nehmen ((a+b+c) * (~b+~c) * (~a+~c) * (~a+~b)), aber das bringt dich ja auch nicht wirklich weiter.

Also:
B1 := (not B1 and not B2 and B3) or
(not B1 and B2 and not B3) or
(B1 and not B2 and not B3);

himitsu 24. Feb 2016 13:07

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Delphi-Quellcode:
if Ord(A) + Ord(B) + Ord(C) <= 1 then
(maximal 1) und
Delphi-Quellcode:
if Ord(A) + Ord(B) + Ord(C) = 1 then
(immer 1)
geht halt nur, wenn wirklich nur True und False drin stehen.
Einen Cast von Boolean auf Byte und zurück macht Delphi immer nur binär.

Es gibt in Pascal keine Möglichkeit zu steuern ob Binär oder Logisch konvertiert wird. (es gibt immer nur je Eines von Beidem)

Delphi-Quellcode:
if Ord(A <> False) + Ord(B <> False) + Ord(C <> False) = {<=} 1 then


Delphi-Quellcode:
NOT
arbeitet bei einem Boolean logisch und nicht binär (glaub ich), also ginge auch
Delphi-Quellcode:
if Ord(not A) + Ord(not B) + Ord(not C) = {>=} 2 {3-1} then

Valle 24. Feb 2016 13:42

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Wie wäre es, wenn man sich dafür eine Hilfsfunktion baut?

Pseudocode:
Code:
def OneIfTrue(mybool):
    return 1 if mybool else 0

def ExactlyOneIsTrue(b1, b2, b3):
    return OneIfTrue(b1) + OneIfTrue(b2) + OneIfTrue(b2) == 1
Fände ich am elegantesten, solange sich ein Array noch nicht lohnt.

himitsu 24. Feb 2016 13:51

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Delphi-Quellcode:
OneIfTrue
, bzw.
Delphi-Quellcode:
IfThen(b1, 1, 0)
sollten aber hoffentlich als Inline-Funktion vorliegen.

Jasocul 24. Feb 2016 13:52

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
 
Wie wäre denn:
Delphi-Quellcode:
b4 := Ord(b1 and True) + Ord(b2 and True) + Ord(b3 and True) = 1;


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr.
Seite 3 von 4     123 4      

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