【问题标题】:Retrieving a single row of a truth table with a non-constant number of variables检索具有非常量变量的真值表的单行
【发布时间】:2015-01-21 03:54:52
【问题描述】:

我需要编写一个函数,它接受一个整数作为参数,它表示真值表中的一行,以及一个布尔数组,它存储真值表中该行的值。

这是一个示例真值表

Row| A | B | C |
 1 | T | T | T |
 2 | T | T | F |
 3 | T | F | T |
 4 | T | F | F |
 5 | F | T | T |
 6 | F | T | F |
 7 | F | F | T |
 8 | F | F | F |

请注意,给定真值表的行数可能比该表多或少,因为可能变量的数量可能会发生变化。

函数原型可能如下所示

getRow(int rowNum, bool boolArr[]);

如果这个函数被调用,例如,as

getRow(3, boolArr[])

它需要返回一个包含以下元素的数组

|1|0|1|    (or |T|F|T|)  

对我来说困难是因为变量的数量可以改变,因此增加或减少行数。例如,变量列表可以是 A、B、C、D、E 和 F,而不仅仅是 A、B 和 C。

我认为最好的解决方案是编写一个计数到行号的循环,并从本质上改变数组的元素,就像它以二进制计数一样。这样

1st loop iteration, array elements are 0|0|...|0|1|
2nd loop iteration, array elements are 0|0|...|1|0|

我一生都无法弄清楚如何做到这一点,也无法在网络上的其他地方找到解决方案。很抱歉给您带来了困惑,感谢您的帮助

【问题讨论】:

  • 公式本身在哪里发挥作用?目标是弄清楚表中给定行的各个变量分配是什么,或者如何解析公式以进行评估?
  • @templatetypedef 最终目标是解析具有任意数量变量的每个可能真值的公式。本质上是检查真值表的每一行,看它是否满足公式。这就是为什么能够分别生成真值表的每一行很重要的原因。例如,如果 a、b 和 c 是变量,我需要检查三个真假的每个组合,看看哪些组合导致整个公式为真。
  • 请尝试改进问题陈述。你提到genTruth 没有解释函数应该计算什么然后跳到位移。如果您首先清楚地说明问题然后解释您的方法,这将有助于您的解释。
  • @Pradhan 如果我在这个网站上快速学习了一件事,那就是如何提出一个有效的问题。我编辑的方法更好吗?
  • 是的,这好多了!原型需要getRow(rowNum, boolArr[]); 是否有特定原因? C-style arrays decay to pointers 用作函数参数时。如果您在编译时知道数组的大小,使用std::array 会容易得多。如果需要在运行时确定大小,可以使用std::vector,原型可以是getRow(rowNum, vector, numVars)

标签: c++ arrays logic truthtable


【解决方案1】:

好的,现在您重写了您的问题,使其更加清晰。首先,getRow 需要带一个额外的参数:位数。具有 2 位的第 1 行产生的结果与具有 64 位的第 1 行产生的结果不同,因此我们需要一种方法来区分它。其次,通常使用 C++,所有内容都是零索引,所以我将把你的真值表向下移动一行,以便行“0”返回所有 trues。

这里的关键是要意识到二进制中的行号已经是你想要的了。拿这一行(从 4 下移到 3):

3 | T | F | F |

3 二进制是011,倒过来是{true, false, false} - 正是你想要的。我们可以使用按位或作为数组来表示:

{!(3 | 0x4), !(3 | 0x2), !(3 | 0x1)}

所以只需将其编写为循环即可:

void getRow(int rowNum, bool* arr, int nbits)
{
    int mask = 1 << (nbits - 1);
    for (int i = 0; i < nbits; ++i, mask >>= 1) {
        arr[i] = !(rowNum & mask);
    }
}

【讨论】:

  • 抱歉,我尝试通过将 OP 中的变量重命名为字母而不是数字来澄清一下。根据我对 bitset 的 cplusplus 参考页的理解,我认为这是不对的。在我看来,您的函数版本正在返回整个真值表,但我需要能够一次生成一行。两个变量的真值表的第一行是 [T|T],第二行是 [T|F],第三行是 [F|T],第四行是 [F|F]。如果这听起来有点居高临下,我很抱歉,只是想尽可能地澄清一下。
  • @FutureShocked 如果您只想要真值表,那只是我回答中的 bits 变量。这将是rowNumth 行中的值。
  • 这只是返回一个布尔值,不是吗?即使忽略任何数量大于 3 的变量的 rowNum 大于 8,我仍然需要该函数返回行中每个变量的布尔值。
  • @FutureShocked 好的,更清楚的问题 - 我重写了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2015-11-05
相关资源
最近更新 更多