}
//给输入结点1~n初始化值
POSITION pos=MyList.GetHeadPosition ();
MyNode* pNode;
while(pos!=0)
{
pNode=MyList.GetNext (pos);
//如果结点是输入结点
if(pNode->Subtype ==Input)
{
//结点中的pNode->number 记录了结点序号
//给结点初始化值
pNode->output1value =I[pNode->number ];
}
}
//调用函数计算,将计算结果保存
int result=CalculateResult();
//生成字符串以便输出
str.Format ("%10d",result);
strs[i]+=str; }
}
代码分析:
(1) 首先得到输入结点的个数:n=numpoint.GetSize ();
这里numpoint是记录输入结点前序号位置点的数组,而有多少个这样的点,就有多少个输入结点。
(2)然后计算真值表的行数,因为有n个输入结点,真值表就有2^n行。
x=1;
for(i=1;i<=n;i++)
{
x=x*2;
}
这里我们用x来保存真值表的行数。
(3)产生所有的输入结点值的组合。
如果有3个输入结点,它的所有组合如下表
输入3 输入2 输入1 i
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
我们可以从表的第四列看出可以用数字i从0到x-1来分解出这些组合。
例如:当i为2时,它在内存中最后3位为:010。
此时 输入3=010 & 100=000,再右移2位即可得到0。
于是我们可以得到:输入1 & 001 再右移0位
输入2 & 010 再右移1位
输入1 & 100 再右移2位
我们用一个数组J[1]~J[n]来记录相与的数字。为1,2,4,......,2^(n-1)
初始化J[1]~J[n]
J[1]=1;
for(i=2;i<=n;i++)
{
J[i]=J[i-1]*2;
}
用I[1]~I[n]记录输入1~输入n
产生一行输入值
上一页 [1] [2] [3] [4] [5] [6] [7] [8]