给出关系的矩阵,怎样判断是否存在包含R的

如题所述

include lt;stdio.h;
include lt;stdlib.h;

//确定矩阵大小,分配空间
void init(char ***a,int *len)
{
int i,n;
printf(;集合中有几个元素:;);
do
{
scanf(;%d;,n);
if(nlt;=1)
printf(;n应该大于1;n;);
}while(nlt;=1);

*len=n;
(*a)=(char **)malloc(sizeof(char*)*n);
if((*a)==NULL)
{
printf(;malloc error;n;);
return;
}

for(i=0;ilt;n;i++)
{
(*a)[i]=(char*)malloc(sizeof(char)*n);
if((*a)[i]==NULL)
{
printf(;malloc error;n;);
return ;
}
}
}

//自反性返回1,否则0
int f1(char **a,int n)
{
int i;
for(i=0;ilt;n;i++)
{
if(a[i][i]==0)
return 0;
}
return 1;
}

//反自反性返回1,否则0
int f2(char **a,int n)
{
int i;
for(i=0;ilt;n;i++)
{
if(a[i][i]==1)
return 0;
}
return 1;
}

//对称性返回1,否则0
int f3(char **a,int n)
{
int i,j;
for(i=0;ilt;n;i++)
{
for(j=0;jlt;i;j++)
{
if(a[i][j]!=a[j][i])
return 0;
}
}
return 1;
}

//反对称性返回1,否则0
int f4(char **a,int n)
{
int i,j;
for(i=0;ilt;n;i++)
{
for(j=0;jlt;i;j++)
{
if(a[i][j]==1 a[j][i]==1)
return 0;
}
}
return 1;
}

//传递性返回1,否则0
int f5(char **a,int n)
{
int i,j,k;
for(i=0;ilt;n;i++)
{
for(j=0;jlt;n i!=j;j++)
{
for(k=0; klt;n i!=k j!=k ;k++)
{
if(a[i][j]==1 a[j][k]==1 a[i][k]==0)
return 0;
}
}
}
return 1;
}

//显示结果
void show(char** a,int n)
{
char b[5];
b[0]=f1(a,n);
b[1]=f2(a,n);
b[2]=f3(a,n);
b[3]=f4(a,n);
b[4]=f5(a,n);

// printf(;%d,%d,%d,%d,%d;n;,b[0],b[1],b[2],b[3],b[4]);

if(b[0]==1)
printf(;关系R具有自反性;n;);
else
printf(;关系R不具有自反性;n;);

if(b[1]==1)
printf(;关系R具有反自反性;n;);
else
printf(;关系R不具有反自反性;n;);

if(b[2]==1)
printf(;关系R具有对称性;n;);
else
printf(;关系R不具有对称性;n;);

if(b[3]==1)
printf(;关系R具有反对称性;n;);
else
printf(;关系R不具有反对称性;n;);

if(b[4]==1)
printf(;关系R具有传递性;n;);
else
printf(;关系R不具有传递性;n;);

if( b[0]==1 b[4]==1)
{
if( b[2]==1)
printf(;关系R是集合上的等价关系;n;);
if( b[3]==1)
printf(;关系R是集合上的偏序关系;n;);
}
}

//输入关系
void input(char **a,int n)
{
int x,y;
printf(;输入关系,使用1~n之间的整数,使用;;,;;分开,例如1,2,完成后输入0,0退出;n;);
for(;;)
{
scanf(;%d,%d;,x,y);
if(xlt;=0 x;n ylt;=0 y;n)
break;
a[x-1][y-1]=1;
}
}

//删除分配的空间
void del(char **a,int n)
{
int i;
for(i=0;ilt;n;i++)
free(a[i]);
free(a);
}

//矩阵所有元素置0
void clear(char** a,int n)
{
int i,j;
for(i=0;ilt;n;i++)
{
for(j=0;jlt;n;j++)
{
a[i][j]=0;
}
}
}

main()
{
char **a;
int n;
int count;
init(a,n);

printf(;有几组关系;n;);
scanf(;%d;,count);

while(count--)
{
clear(a,n);
input(a,n);
show(a,n);
}

del(a,n);
return 0;
}
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答