我试图将真值表的结果转换回布尔语句。 对于那些不熟悉的人,我会写详细信息。
我有一个字符串向量,格式如下所示。向量内的所有字符串成员具有相等的长度。成员仅由-
或0
或1
撰写。
例如,向量v包含3个成员,每个成员的长度为5。
string vv[] = { "--1-0" , "-1-1-" , "01-1-" };
std::vector<string> v(begin(vv), end(vv));
字符串的每个字符代表另一个向量“A”成员以及布尔运算。例如,
第一个--1-0
是(A[2] && !A[4])
我想将上面的矢量v
转换为
(A[2] && !A[4]) || (A[1] && A[3] ) || (!A[0] && A[1] && A[3])
我想要做的是使用向量v
和A
作为输入的函数,返回值高于布尔语句。我相信您已注意到1
为true
,0
为Not true
且-
处于无关状态。
编辑:我不打算解决一个真理表或Kmap。我已经有了结果。我的结果是“v”向量的格式。我想使用布尔语句在V和A之间创建一个链接。
任何建议表示赞赏。
答案 0 :(得分:2)
我想问题是我说英语不好,但我不清楚你到底想要什么。
如果你想要一个给定std::string
向量和bool
向量的函数返回bool
值,根据你的指示,它很容易做(希望没有错误)
你使用std::begin()
所以我认为C ++ 11对你有好处
#include <vector>
#include <iostream>
#include <stdexcept>
bool singleStatement (const std::vector<bool> & a,
const std::string & s)
{
auto ret = true;
if ( a.size() < s.size() )
throw std::runtime_error("invalid size");
for ( unsigned i = 0U ; i < s.size() ; ++i )
switch ( s[i] )
{
case '-': break;
case '1': ret &= a[i]; break;
case '0': ret &= !a[i]; break;
default: throw std::runtime_error("invalid char"); break;
}
return ret;
}
bool statements (const std::vector<bool> & a,
const std::vector<std::string> & v)
{
auto ret = false;
for ( const auto & s : v )
ret |= singleStatement(a, s);
return ret;
}
int main ()
{
std::vector<bool> a { true, false, false, true, false };
std::vector<std::string> v { "--1-0" , "-1-1-" , "01-1-" };
std::cout << "statement is " << statements(a, v) << std::endl;
return EXIT_SUCCESS;
}