如何测试一个条件是否为真?

问题描述 投票:0回答:2

如果我在 Pascal 中有一组布尔变量,我如何测试其中的恰好一个

True

boolean pascal
2个回答
1
投票

在 Pascal 中你可以这样做:

if Integer(a) + Integer(b) + Integer(c) = Integer(true) then
    writeln("exactly one is true");

Integer(true)
进行比较很重要,因为在不同版本的 Pascal 中它可能是不同的值。


0
投票
  • 显然,对于一个布尔变量,您可以直接查询该变量。
    condition0
    
  • 对于恰好两个布尔值,您只需检查它们是否彼此不相等:
    condition0 <> condition1
    
  • 使用布尔集可以区分四种不同的状态。 对于三个布尔值,您可以编写:
    [condition0, condition1] >< [false, condition2] = [true]
    
    对于四个布尔值,您可以编写:
    [condition0, condition1] >< [condition2, condition3] = [true]
    
    对称差分运算符
    ><
    由 Extended Pascal(ISO 标准 10206)定义,在您的 Pascal 实现中可能不可用。
  • 内置数据类型
    Boolean
    是枚举数据类型。 根据定义,它相当于
    type
        Boolean = (false, true);
    
    因此,
    false
    的序数值为
    0
    true
    的序数值为
    1
    。 您可以利用这一事实,正如Matt 已经建议的那样,检查总和是否等于 1:
    ord(condition0) + ord(condition1) + ord(condition2) = 1
    
  • 另一种更复杂的方法是将
    condition0
    ...
    conditionN
    视为“二进制数”的数字
    4 * ord(condition2) + 2 * ord(condition1) + 1 * ord(condition0)
    
    并检查结果是否为 an
    integer
    2 的幂
    。 这使您不仅可以知道那个恰好满足了一个条件,还可以知道是哪个并采取相应的行动。
    case ord(condition0) + 2 * (ord(condition1) + 2 * ord(condition2)) of
        1:
        begin
            { condition0 is true }
        end;
        2, 4:
        begin
            { condition1 or condition2 is true }
        end;
        otherwise
        begin
            { multiple conditions are true, or none at all }
        end
    end
    
  • 如果您正在进行大量次只有一个布尔值为真的测试,您可能需要考虑一个查找表(前提是它相当小)。
    var
        onlyOneTrue: array[Boolean, Boolean, Boolean] of Boolean
        { This is an Extended Pascal initial state specification: }
                     value [otherwise [otherwise [otherwise false]]];
    begin
        onlyOneTrue[true, false, false] ≔ true;
        onlyOneTrue[false, true, false] ≔ true;
        onlyOneTrue[false, false, true] ≔ true;
    
        { And then you can query the LUT for the result: }
        if onlyOneTrue[condition0, condition1, condition2] then
    
    如果在某个时刻,集合中的布尔变量数量少于 LUT 的维数,请在适当的位置插入文字值
    false
  • 最后,如果您可以重新设计您的程序并且您正在处理的布尔变量彼此相关,我建议将枚举数据类型与
    set
    结合使用,因为这样只需检查集合的基数。
    type
        condition = (condition0, condition1, condition2);
    var
        conditions: set of condition value [];
    begin
        { After some program logic determined `condition0` is `true`: }
        conditions ≔ conditions + [condition0];
    
        { After some program logic determined `condition1` is `false`: }
        conditions ≔ conditions − [condition1];
    
        { Check the number of members present in `conditions`. }
        if card(conditions) = 1 then
    
    内置函数
    card
    由 Extended Pascal 定义,可能在您的 Pascal 实现中不可用或以不同方式调用(例如
    popcnt
    之类的函数)。
© www.soinside.com 2019 - 2024. All rights reserved.