我有一个函数,它评估多个(在我的情况下为7)布尔变量和条件,如果只有其中一个为true,则结果为true(当然其余为false)。我有以下代码:
function GetExclusiveTrue: boolean;
begin
Result:= (
Integer(BoolVar1) +
Integer(BoolVar2) +
Integer(BoolFunc3) +
Integer(BoolVar4) +
Integer(BoolFunc5) +
Integer(BoolVar6) +
Integer(BoolVar7)) = 1;
end;
我只是想知道是否有更好的解决方案呢?
PS :我认为我还没有正确定义我的问题。
我正在寻找仅使用逻辑运算符的解决方案,而不涉及任何转换。
PS2 :看起来我无法正确解释我正在寻找的内容。我希望看到没有迭代,选择,函数调用等的解决方案。只允许布尔运算符。为什么?我只是想知道这是否可能。寻找逻辑运算的组合,提供与上述函数相同的结果。
答案 0 :(得分:4)
这里有一个只计算-1真的函数,无论要检查的布尔数是多少:
function GetExclusiveTrue(boolarray: array of Boolean) : Boolean;
var
arrayindex : integer;
begin
result := false;
for arrayindex := 0 to high(boolarray) do
if boolarray[arrayindex] then
begin
result := not result;
if not result then exit;
end;
end;
首先,假设false
结果,然后扫描提供的数组。在找到的第一个true
(如果有)上设置返回值true并清除返回值,如果找到第二个true
则退出。
这是计算有多少是真实的特殊情况:
function howmanytrue(boolarray: array of Boolean) : integer;
var
arrayindex : integer;
begin
result := 0;
for arrayindex := 0 to high(boolarray) do
if boolarray[arrayindex] then inc(result);
end;
显然,GetExclusiveTrue = howmanyaretrue([你的布尔]] = 1 但这允许其他问题,如are none/all/all-but-1/majority/at-least-3/no-more-than-2/exactly-half true
(假设你知道你正在检查的布尔数。)
我用一组11个复选框和2个面板
测试了这个procedure TForm1.CheckBoxClick(Sender: TObject);
begin
Panel1.Caption := BoolToStr(GetExclusiveTrue([checkbox1.Checked,checkbox2.Checked,checkbox3.Checked,checkbox4.Checked,checkbox5.Checked,checkbox6.Checked,checkbox7.Checked,checkbox8.Checked,checkbox9.Checked,checkbox10.Checked,checkbox11.Checked]),true);
Panel2.Caption := IntToStr(howmanytrue([checkbox1.Checked,checkbox2.Checked,checkbox3.Checked,checkbox4.Checked,checkbox5.Checked,checkbox6.Checked,checkbox7.Checked,checkbox8.Checked,checkbox9.Checked,checkbox10.Checked,checkbox11.Checked]));
end;
答案 1 :(得分:3)
我希望看到没有迭代,选择,函数调用等的解决方案。只允许布尔运算符。为什么?我只是想知道这是否可能。寻找逻辑运算的组合,提供与上述函数相同的结果。
您希望仅使用逻辑and
,or
,xor
和not
运算符来实现此目的。就是这样:
Result :=
(b1 and not (b2 or b3 or b4))
or (b2 and not (b1 or b3 or b4))
or (b3 and not (b1 or b2 or b4))
or (b4 and not (b1 or b2 or b3));
我给出了一个只有四个布尔值的例子,但任何数字的概念都是相同的。
答案 2 :(得分:0)
更好的解决方案是,你可以打开一个数组
function GetExclusiveTrue(Values: array of Boolean ): Boolean;
并通过迭代进行求和。
答案 3 :(得分:0)
如果你不想演员,那么你可以通过这种方式实现同样的目标:
function GetExclusiveTrue: boolean;
var
Count: Integer;
begin
Count := 0;
if BoolVar1 then
Inc(Count);
if BoolVar2 then
Inc(Count);
if BoolFunc3 then
Inc(Count);
if BoolVar4 then
Inc(Count);
if BoolFunc5 then
Inc(Count);
if BoolVar6 then
Inc(Count);
if BoolVar7 then
Inc(Count);
Result := (Count = 1);
end;