首页 > 解决方案 > 如何获得函数的真值表 (( c + ~d ) * b ) * ~( d + a * e )

问题描述

所以我有等式 (( c + ~d ) * b ) * ~( d + a * e ) 我试图生成一个真值表,但我不确定如何开始让程序根据真值表计算变量是否应该等于真或假。关于如何做到这一点的任何建议?先感谢您。

#include<iostream>

using namespace std;

bool checkBoolTF(int a){
    bool TF;
    if(a == 0){
        TF = false;
    }
    else{
        TF = true;
    }
    return TF;
}

int main()
{
  int a,b,c,d,e;
  bool aBool, bBool, cBool, dBool, eBool;

  string equation = "(( c + ~d ) * b ) * ~( d + a * e )";
  bool equationTF;


  //LOOP TO TRUTH TABLE - FINAL VALUES
  cout << "----------------------------------------------------------------------" << endl;
  cout << "|  a  |  b  |  c  |  d  |  e  |  " << equation << "  |" << endl;
  cout << "----------------------------------------------------------------------" << endl;
    for(a=0;a<=1;a++){
        checkBoolTF(a);
            for(b=0;b<=1;b++){
                checkBoolTF(b);
                    for(c=0;c<=1;c++){
                        checkBoolTF(c);
                            for(d=0;d<=1;d++){
                                checkBoolTF(d);
                                    for(e=0;e<=1;e++){
                                        checkBoolTF(e);
                                        cout << "|  " << a << "  |  " << b <<  "  |  " << c <<  "  |  " << d <<  "  |  " << e << "  |                   "  << equationTF << "                |" << endl;
                                        cout << "----------------------------------------------------------------------" << endl;
                                    }
                            }
                    }
            }
    }
    return 0;
}

标签: c++truthtable

解决方案


第 1 步:标记化。

enum class TokenType {
  bracket, binop, binaryop, var, literal
};
struct Token {
  TokenType type;
  char value;
 };

将字符串转换为 的向量token

您还没有使用literal:它是值 0 或 1。稍后您将使用它。

编写漂亮地打印标记向量的代码。

第2步:制作一棵简单的树。

struct Tree {
  bool is_token=true;
  Token token;
  std::vector<Tree> tree;
};

更改您的第一个代码以生成包含标记向量的树。

编写漂亮的打印代码。测试。

第 3 步:减少树

步骤 3a:括号

现在做一个减少步骤;遍历树的向量并生成一个。它会盲目地将不是括号的所有内容复制到输出中。如果它看到 a (,它将所有内容复制到匹配 )(打开和关闭计数)到子树中,然后将该子树复制到输出中。

然后在子树中获取"a ( b c )"并生成它。ab c

编写可以漂亮地打印子树的代码。测试。

步骤 3b:嵌套括号

接下来,在您创建的子树上进行递归,因此它的嵌套括号也被放入子树中。

步骤 3c:运营商

接下来,研究操作员。 ~很简单:它吞​​下向量中的下一棵树。作为+比 绑定失败者*,为每个+创建两个子树;一个用于之前的一切,一个用于之后的一切。然后对*.

在这一切之后,你转身

a+(b+c)*~(d+e)

进入

+  (a , ( * (+ (b, c), ~(+(d,e))))

第4步:替换

映射std::map将变量映射到值的 a。取一棵树的副本,然后遍历它,用等于其值的文字替换每个变量。

第 5 步:评估

对于每个运算符,评估子树然后应用运算符。

结果应该是 0 或 1。

4 和 5 可以从文字表达式开始独立完成。


推荐阅读