}
运行结果如下:
以上便是对自反或反自反,对称或反对称,是否传递等性质的判断过程,代码及运行代码的结果。
4.实验总结
此题为验证性题目,验证性题目主要是通过其原理以及相关的概念来证明。
通过此题对验证性题目的分析有很大的提高。
(二)
1.实验题目
判断一个二元关系是否为等价关系,如果是,求其商集。
2.实验原理
要判断一个二元关系是否是等价关系,则要判断这个关系是否具有自反性,对称性和传递性;假如这三个条件都同时符合,则该二元关系具有等价关系。
这里以为A={1,2,3,4,5,6,7},R={<1,4>,<1,7>,<4,1>,<4,7>,<7,1>,<7,4>,<2,5>,<5,2>,<3,6>,<6,3>}UIa为例。
自反性的判别与上题一样,都是判别flay[i][i]是否都等于1;若flay[i][i]全部等于1,则具有自反性;否则反之。
对于对称性与上题也一样,就是判断所有的flay[i][j]与flay[j][i]是否全部相等;若全部相等,则具有对称性;否则反之。
传递性的判断,则需要利用线性代数的方法求出R的关系矩阵的平方矩阵,只需验证所有的flag[i][j](R的关系矩阵的平方矩阵)等于1的地方,在flay[i][j](R的关系矩阵)等于1,则具有传递性;否则反之。
3.实验步骤及实验记录
(1)先输入一个整数,表示矩阵的阶数;接着输出初始空矩阵。
然后一组一组的输入R在A上的关系,输入00时结束;接着输出关系矩阵,判别与输入的关系是否一致。
代码如下所示:
voidInput()
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
flay[i][j]=0;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<cout<}
R();
}
voidR()
{
cout<<"请输入两个位置有关系的数值,输入“00”结束R的输入:
"<cin>>a>>b;
if(a!
=0&&b!
=0)
{
flay[a][b]=1;
R();
}
}
voidOutput()
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<cout<}
}
代码运行结果如下所示:
(2)在根据矩阵左上到右下flay[i][i]的值是否为1判断矩阵是否是自反或反自反,判断矩阵是否自反或反自反的代码如下:
intcount=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
{
if(flay[i][j]==1)
count_1++;
elseif(flay[i][j]==0)
count_2++;
}
}
}
if(count_1==n)
{
cout<<"自反性"<syb_3=1;
}
else
cout<<"反自反性"<代码运行结果如下所示:
(3)判断对称的或反对称只需要flay[i][j]是否与flay[j][i]相等;若全部相等,则为可对称;否则反之。
代码如下:
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(flay[i][j]==flay[j][i])
count_1++;
else
{
count_2=1;
break;
}
}
if(count_2==1)
{
break;
}
}
if(count_2==1)
{
cout<<"反称性"<}
else
{
cout<<"对称性"<syb_1=1;
}
代码运行结果如下所示:
(4)而对于判别是否具有传递性,则相对前面两个性质来说比较复杂,关键是求出原矩阵flay的平方矩阵flag,这里通过线性代数的方法求出flay矩阵的平方矩阵flag,求平方矩阵的方法是:
第一个矩阵flay[i][j]等于flay[i][j]乘以第二个矩阵的第j列之总和;j++完后再i++,以后便可求出平方矩阵。
然后在比较在平方矩阵flag[i][j]为1的位置,在原矩阵flay[i][j]中是否都为1;若flag矩阵中所有的为1的地方,在flay中都为1,则具有传递性;否则反之;最后输出该平方矩阵。
代码如下所示:
intk;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
flag[i][j]=0;
for(k=1;k<=n;k++)
flag[i][j]=flag[i][j]+flay[i][k]*flay[k][j];
if(flag[i][j]!
=0)
coun