闭包运算实验报告1

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

闭包运算实验报告

姓名:卢志华学号:1045532116

一、实验目的

1.通过上机程序,进一步加深对关系中自反闭包,对称闭包,传递闭包的理解。

2.掌握Warshall算法。

3.学会用程序解决离散数学中的问题。

4.增强我们编写程序的能力。

二、实验内容

计算已输入集合的关系的自反闭包、对称闭包和传递闭包,传递闭包要求使用Warshall 算法

三、实验环境

我的实验是在VC++6.0实验环境下完成的,而所设计的程序也在这个环境下通过了编译,运行和测试。

四、实验原理和实现过程

下面我就具体分析一下每一种闭包运算的设计:

自反闭包的设计:我们只要把关系矩阵的对角线的元素全赋值为1就可以了。

求自反闭包的程序如下:

void Relation::R_r()

{

for(int i=0;i

{

T_R[i][i]=1;

}

}

对称闭包的设计:对于对称闭包,我们只需要将矩阵中数值为1的元素的对称位置的元素数值也设为1就可以了。

具体程序如下:

void Relation::R_s()

{

for(int i=0;i

{

for(int j=0;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

{

for(int j=0;j

{

if(T_R[j][i]==1)

{

for(int k=0;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算法。我认为这是一次还有意义的

实验。

相关文档
最新文档