等价关系要满足自反,传递,对称
首先是自反性的判断
自反性: 若 M(R的关系矩 阵)的主对角线元素均为 1,则 R是自反关系。
int zifan(int a[][9],int n)
{
int k,b=1;
for(k=0;k<n;k++)
{
if(a[k][k]!=1) //只要有一个元素不为1,那么该矩阵不满足自反
{
printf("a[%d][%d]=%d!=1\n",k,k,a[k][k]);
b=0;
}
}
return b;
}
对称性的判断
对称性:若 M(R的关系矩 阵)为对称矩阵,则 R 是对称关系。
对称矩阵:是指以主对角线为对称轴,各元素对应相等的矩阵。
int duichen(int a[][9],int n)
{
int i,j,b=1;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i][j]!=a[j][i])
{
printf("a[%d][%d]!=a[%d][%d]\n",i,j,j,i);
b=0;
}
}
}
return b;
}
传递性的判断
学校里一般教warshall算法或弗洛伊德算法,但本文章用一种简单方法就是遍历加定义。
函数中的q先记录了满足条件的个数,然后根据判断条件重新赋值。
传递性:对任意的属于集合X的x,y,z,xRy&&yRx->xRz称关系R在X上是传递的。
在判断中将单条件换成! p||q的形式。
int chuandi(int a[][9],int n)
{
int i,j,k,q=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
{
if((!((a[i][k]==1)&&(a[k][j]==1))||a[i][j])==1)
{
q++; //每满足一次就自加
break;
}
}
}
}
if(q==n*n) //所有的元素都要满足传递性
{
q=1;
}
return q;
}
主函数
三个函数依次传出数值进行判断
二维数组作为函数参数时,列元素一定要显现以便计算机确认以及分配内存空间。
int main()
{
int a[9][9];
int i,j,n;
int o=2,p=2,q=2;
printf("请输入矩阵的阶数(n<=9):\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
o=zifan(a,n);
p=duichen(a,n);
q=chuandi(a,n);
printf("%d %d %d\n",o,p,q);
if(o==1&&p==1&&q==1)
{
printf("该矩阵满足等价关系!\n");
}
else
printf("该矩阵不满足等价关系!\n");
}
函数里有一些打印,方便查看运算情况。
这个代码不是那么规范,我也刚入门,希望大家可以多多指出我的错误,也希望我的代码对大家有所帮助或启发。
谢谢大家!