TrueValTableGenerator 意思就是真值表生成器。它的功能表示如下:
由 InputParser 知道,有三个变量,分别为 a, b, c。那么对应的直值表为
如果 TrueValTableGenerator 能由一组变量生成其对应的真值表,就算完成了任务。这个类只需要一个生成真值表的函数就可以了。我给这个函数起名为 Generate。下面说一下这个函数的构造思想。
真值表的表示结构可以用一个 vector。因为真值表的长度(也就是上面表格的纵向长度 8)会随变量的数目变化而变化,所以用 vector 明显要比数组方便些。(事实上,我在写 C++ 和 .NET 程序时能用容器的地方都会用容器。数组有很多方面比不上容器。当然,如果你能保证你写的算法会比标准库更快的话数组会比容器快一些。)这个 vector 中的数据元素应该也是一个 vector。因为真值表的宽度也会变化(这里宽度就是变量的数目。即上面表格的横向长度 3)。为了方便,我把行 vector 重新定义了一个新的名字 Line:
函数需要一个变量数组的参数,这个参数由类的成员提供。我把这个成员定义为:
注意到上面表格的每行 000, 001, 010, ... , 111 事实上是 0, 1, 2, ..., 7 的二进制表示。所以,只需要把 0-7 的二进制形式上的各个位塞进 result 里就行了。下面给出这个函数的完整实现代码:
至此,这个类的主体就完工了。下面给出这个类的完整声明:
由 InputParser 知道,有三个变量,分别为 a, b, c。那么对应的直值表为
|
a |
b |
c |
| 0 | 0 | 0 |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
| 1 | 1 | 1 |
如果 TrueValTableGenerator 能由一组变量生成其对应的真值表,就算完成了任务。这个类只需要一个生成真值表的函数就可以了。我给这个函数起名为 Generate。下面说一下这个函数的构造思想。
真值表的表示结构可以用一个 vector。因为真值表的长度(也就是上面表格的纵向长度 8)会随变量的数目变化而变化,所以用 vector 明显要比数组方便些。(事实上,我在写 C++ 和 .NET 程序时能用容器的地方都会用容器。数组有很多方面比不上容器。当然,如果你能保证你写的算法会比标准库更快的话数组会比容器快一些。)这个 vector 中的数据元素应该也是一个 vector。因为真值表的宽度也会变化(这里宽度就是变量的数目。即上面表格的横向长度 3)。为了方便,我把行 vector 重新定义了一个新的名字 Line:
typedef std::vector<int> Line;
这样函数的返回类型可以确定为 vector<Line>。我把这个结果放在函数内部定义的变量上:vector<Line> result;
函数需要一个变量数组的参数,这个参数由类的成员提供。我把这个成员定义为:
std::vector<char> varNames;
这个成员由类的构造函数负责初始化。即由调用者负责传递这个数组参数。事实上,调用者会传递 InputParser.GetValNames() 的返回值。注意到上面表格的每行 000, 001, 010, ... , 111 事实上是 0, 1, 2, ..., 7 的二进制表示。所以,只需要把 0-7 的二进制形式上的各个位塞进 result 里就行了。下面给出这个函数的完整实现代码:
vector<Line> TrueVarTblGenerator::Generate()
{
vector<Line> result;
Line line;
for (int i = 0; i < powl(2, this->varNames.size()); i++)
{
for (int j = 0; j < varNames.size(); j++)
{
int tmp = powl(2, j);
tmp = tmp & i;
tmp = tmp >> j;
line.push_back(tmp);
}
result.push_back(line);
line.clear();
}
return result;
}
{
vector<Line> result;
Line line;
for (int i = 0; i < powl(2, this->varNames.size()); i++)
{
for (int j = 0; j < varNames.size(); j++)
{
int tmp = powl(2, j);
tmp = tmp & i;
tmp = tmp >> j;
line.push_back(tmp);
}
result.push_back(line);
line.clear();
}
return result;
}
至此,这个类的主体就完工了。下面给出这个类的完整声明:
// TrueVarTblGenerator.h: interface for the TrueVarTblGenerator class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_TRUEVARTBLGENERATOR_H__B9541ABE_10AE_4D88_A830_3DD1CACDA9E3__INCLUDED_)
#define AFX_TRUEVARTBLGENERATOR_H__B9541ABE_10AE_4D88_A830_3DD1CACDA9E3__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <vector>
typedef std::vector<int> Line;
class TrueVarTblGenerator
{
public:
TrueVarTblGenerator(std::vector<char>& varNames);
virtual ~TrueVarTblGenerator();
public:
std::vector<Line> Generate();
private:
std::vector<char> varNames;
};
#endif // !defined(AFX_TRUEVARTBLGENERATOR_H__B9541ABE_10AE_4D88_A830_3DD1CACDA9E3__INCLUDED_)
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_TRUEVARTBLGENERATOR_H__B9541ABE_10AE_4D88_A830_3DD1CACDA9E3__INCLUDED_)
#define AFX_TRUEVARTBLGENERATOR_H__B9541ABE_10AE_4D88_A830_3DD1CACDA9E3__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <vector>
typedef std::vector<int> Line;
class TrueVarTblGenerator
{
public:
TrueVarTblGenerator(std::vector<char>& varNames);
virtual ~TrueVarTblGenerator();
public:
std::vector<Line> Generate();
private:
std::vector<char> varNames;
};
#endif // !defined(AFX_TRUEVARTBLGENERATOR_H__B9541ABE_10AE_4D88_A830_3DD1CACDA9E3__INCLUDED_)