离散数学二元关系传递性判别、闭包方法实验报告
学院:理学院班级:11信息与计算科学1班
姓名:*** 学号:*************
一、实验目的
1. 通过上机程序,进一步加深对二元关系传递性判别,自反闭包,对称闭包,传递闭
包的理解。
2. 掌握传递性判别,Warshall算法。
3. 学会用程序解决离散数学中的问题。
4. 增强我们编写程序的能力
二、实验内容
实验1:二元关系传递性判别
实验2:有限集上给定关系的自反、对称和传递闭包(用Warshall算法)。
三、实验环境
在microsoft visual c++实验环境下完成的,而所设计的程序也在这个环境下通过了编译,运行和测试。
四、实验原理和实现过程
实验1:
#include <iostream>
using namespace std;
void main()
{
int n,i,j,k;
int m=0; //m是判断传递关系计数参数
cout<<"请输入矩阵的行列数n:";
cin>>n;
int a[20][20];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<"请输入a["<<i<<"]["<<j<<"]:";
cin>>a[i][j];
}
} //输入R矩阵
cout<<"R的关系矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
} //输出R矩阵
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]!=0)
{
for(k=1;k<=n;k++)
{
if(a[i][k]<a[j][k] //利用布尔加的特征,前一行数大于后一行
{
m=m+1; //如果有一个数不成立,m加1
}
}
}
}
}
if(m==0) cout<<"R有传递关系"<<endl;
else cout<<"R没有传递关系"<<endl;
}
实验2:
1)自反闭包
#include <iostream>
using namespace std;
void main()
{
int n,i,j;
cout<<"请输入矩阵的行列数n:";
cin>>n;
int a[20][20];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<"请输入a["<<i<<"]["<<j<<"]:";
cin>>a[i][j];
}
}
cout<<"R的关系矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]!=0)
{
a[i][i]=1;
a[j][j]=1; //把符合条件的对角线上的值改为1 }
}
}
cout<<"R的关系矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
2)对称闭包
#include <iostream>
using namespace std;
void main()
{
int n,i,j;
cout<<"请输入矩阵的行列数n:";
cin>>n;
int a[20][20];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<"请输入a["<<i<<"]["<<j<<"]:";
cin>>a[i][j];
}
}
cout<<"R的关系矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]!=0)
{
a[j][i]=1; //对称元素的值改为1
}
}
}
cout<<"R的对称闭包矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
3)传递闭包
#include <iostream>
using namespace std;
void main()
{
int n,i,j,k;
int m=0;
cout<<"请输入矩阵的行列数n:";
cin>>n;
int a[20][20];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<"请输入a["<<i<<"]["<<j<<"]:";
cin>>a[i][j];
}
}
cout<<"R的关系矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
for(j=1;j<=n;j++)
{
for(i=1;i<=n;i++)
{
if(a[i][j]==1)
{
for(k=1;k<=n;k++)
{
a[i][k]=a[i][k]+a[j][k]; //warshall方法
if(a[i][k]==2) a[i][k]=1; //规范布尔加
}
}
}
}
cout<<"R的传递闭包矩阵为:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
五、实验输入输出和数据
实验1:
1)输入没有传递关系的关系矩阵R
2)输入课本P30/例2.6
实验2:
1)自反闭包
2)对称闭包
3)传递闭包P52/例2.13
六、实验体会
通过这次的实验,使我明白了,平日里学习不能浅尝辄止,必须要知道它的方法。
做这次实验前我以为我对这块知识已经很熟了,但实际做的时候,发现我还是不是特别懂,必须要反复看书。
其次,让我知道了,我平时学的数学知识可以很好的跟计算机结合,让我对程序设计有了更好的人是。