单独评估多个布尔条件,只有一个可以为真(Delphi)

时间:2015-05-10 00:59:31

标签: delphi boolean operand

我有一个函数,它评估多个(在我的情况下为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 :看起来我无法正确解释我正在寻找的内容。我希望看到没有迭代,选择,函数调用等的解决方案。只允许布尔运算符。为什么?我只是想知道这是否可能。寻找逻辑运算的组合,提供与上述函数相同的结果。

4 个答案:

答案 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)

  

我希望看到没有迭代,选择,函数调用等的解决方案。只允许布尔运算符。为什么?我只是想知道这是否可能。寻找逻辑运算的组合,提供与上述函数相同的结果。

您希望仅使用逻辑andorxornot运算符来实现此目的。就是这样:

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;