闭包运算实验报告
姓名:卢志华学号:1045532116
一、实验目的
1.通过上机程序,进一步加深对关系中自反闭包,对称闭包,传递闭包的理解。
2.掌握Warshall算法。
3.学会用程序解决离散数学中的问题。
4.增强我们编写程序的能力。
二、实验内容
计算已输入集合的关系的自反闭包、对称闭包和传递闭包,传递闭包要求使用Warshall 算法
三、实验环境
我的实验是在VC++6.0实验环境下完成的,而所设计的程序也在这个环境下通过了编译,运行和测试。
四、实验原理和实现过程
下面我就具体分析一下每一种闭包运算的设计:
自反闭包的设计:我们只要把关系矩阵的对角线的元素全赋值为1就可以了。
求自反闭包的程序如下:
void Relation::R_r()
{
for(int i=0;i<LenA;i++)
{
T_R[i][i]=1;
}
}
对称闭包的设计:对于对称闭包,我们只需要将矩阵中数值为1的元素的对称位置的元素数值也设为1就可以了。
具体程序如下:
void Relation::R_s()
{
for(int i=0;i<LenA;i++)
{
for(int j=0;j<LenA;j++)
{
if(T_R[i][j]==1)
T_R[j][i]=1;
}
}
}
传递闭包设计:传递闭包我主要用Warshall算法来求。
设R的关系矩阵为M
(1)令矩阵A=M
(2)置i=1
(3)对所有的j,若A[j,i]=1,则对于 k=1,2,…,n,令A[j,k]=A[j,k]+A[i,k]
(4) i=i+l.
(5)若i≤n,则转到(3),否则结束
具体程序如下:
void Relation::R_t()
{
for(int i=0;i<LenA;i++)
{
for(int j=0;j<LenA;j++)
{
if(T_R[j][i]==1)
{
for(int k=0;k<LenA;k++)
{
T_R[j][k]+=T_R[i][k];
if(T_R[j][k]>1)
T_R[j][k]=1;
}
}
}
}
}
五、实验输入输出和数据
程序运行前,首先需要你在main函数中输入一个集合和建立在这个集合上的关系的偶序,然后运行程序就会输出结果。
测试用例一:A={1、2、3},A上的关系R={<12>,<23>,<31>}
输出情况如图:
测试用例二:A={8、6、4、2},A上的关系R={<8,6><6,8><6,4><4,2>}
输出情况如图:
经过计算后对比,程序输出于理论上计算的结果一致,实验成功。
六、心得体会
通过本次实验,我进一步加深了对关系和闭包运算的理解,也掌握了有关关系的一些运算,同时也提高了我的编程能力,学会了使用Warshall算法。
我认为这是一次还有意义的
实验。