c++ - 如何获得函数的真值表 (( 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;
}
解决方案
第 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 )"
并生成它。a
b c
编写可以漂亮地打印子树的代码。测试。
步骤 3b:嵌套括号
接下来,在您创建的子树上进行递归,因此它的嵌套括号也被放入子树中。
步骤 3c:运营商
接下来,研究操作员。 ~
很简单:它吞下向量中的下一棵树。作为+
比 绑定失败者*
,为每个+
创建两个子树;一个用于之前的一切,一个用于之后的一切。然后对*
.
在这一切之后,你转身
a+(b+c)*~(d+e)
进入
+ (a , ( * (+ (b, c), ~(+(d,e))))
第4步:替换
映射std::map
将变量映射到值的 a。取一棵树的副本,然后遍历它,用等于其值的文字替换每个变量。
第 5 步:评估
对于每个运算符,评估子树然后应用运算符。
结果应该是 0 或 1。
4 和 5 可以从文字表达式开始独立完成。
推荐阅读
- c++ - 使用 cmake 配置清单工具选项
- excel - 从单元格值中隐藏图表
- android - 在 java android 中从 .callOnClick() 或 performClick() 函数打开布局
- java - 找不到 Java 类型的消息正文编写器 mime 类型 application/x-www-form-urlencoded
- c# - 实体框架 6 Include() 不起作用
- python - 在python中索引一个字符串
- azure - 带有 VMSS 的 Azure 应用程序网关
- c - 在不使用循环的情况下确定特定元素的数组索引
- python-2.7 - 在 GAE 上部署 Web 应用程序
- javascript - 向 div 添加一个类来检查孩子