#include<stdio.h>
#define M 38
#define N 6
int a,i,j,k,f,s,t,b[M],e[N],c[N][N],g[N][N],h[N][N],d[N][N]={0}; /*定义全局变量,使写程序更便捷*/
void main()
{
void initiate(int c[],int n);
void sort_e();
void change_d();
void print();
void relation1();
void relation2();
void relation3(); /*声明子函数*/
printf("集合有几个元素?:\n");
scanf("%d",&f);
/*要求输入集合和该集合上的一个关系,因为已知这两个才能将这个关系的关系矩阵画出来*/
printf("输入集合的元素(是数字且输入时数字间用空格隔开):\n");
initiate(e,f); /*给e数组赋值*/
printf("关系中有几个有序对?:\n");
scanf("%d",&a);
printf("输入关系(只输入每个有序对的第一、二元素且输入时数字间用空格隔开):\n");
initiate(b,2*a); /*给b数组赋值*/
sort_e(); /*使e数组中的元素按从小到大的排序排列*/
change_d(); /*把是1的位置值变为1*/
printf("关系的关系矩阵为:\n");
print();
relation1(); /*求关系的自反闭包*/
relation2(); /*求关系的对称闭包*/
relation3(); /*求关系的传递闭包*/
}
void initiate(int c[],int n)
{
for(i=0;i<n;i++)
scanf("%d",&c[i]);
}
void sort_e()
{
for(i=0;i<f-1;i++)
{
k=i;
for(j=i+1;j<f;j++)
if(e[j]<e[k])k=j;
if(k!=i)
{
t=e[i];
e[i]=e[k];
e[k]=t;
}
} /*用选择法排序*/
}
void change_d() /*把是1的位置值变为1*/
{
for(i=0,k=1;k<M;i=i+2,k=k+2)
{
for(j=0;j<f;j++)
if(b[i]==e[j])
{
s=j;
break;
}
for(j=0;j<f;j++)
if(b[k]==e[j])
{
t=j; /*找矩阵中值为1的位置*/
break;
}
d[s][t]=1; /*找到位置后把该位置的值变为1*/
}
}
void print()
{
for(i=0;i<f;i++) /*这个程序中f是集合元素的个数*/
{
for(j=0;j<f;j++)
printf("%d ",d[i][j]);
printf("\n");
}
}
void relation1()
{
for(i=0;i<f;i++)
for(j=0;j<f;j++)
c[i][j]=d[i][j]; /*将矩阵的值赋给c数组*/
for(i=0;i<f;i++)
{
for(j=0;j<f;j++)
{
if(i==j)
c[i][j]=1; /*使矩阵的主对角线上的值全变为1*/
}
}
printf("----------------------------------------\n");
printf("自反闭包为\n");
for(i=0;i<f;i++)
{
for(j=0;j<f;j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}
printf("以集合表示为r(R):\n");
for(i=0;i<f;i++)
for(j=0;j<f;j++)
if(c[i][j]!=0)
printf("<%d,%d>,",i+1,j+1);
printf("\n");
}
void relation2()
{
for(i=0;i<f;i++)
for(j=0;j<f;j++)
g[i][j]=d[i][j]; /*将矩阵的值赋给g数组*/
printf("----------------------------------------\n");
for(i=0;i<f;i++)
{
for(j=0;j<f;j++)
{
if(g[i][j]==1)
{
g[j][i]=1; /*把值为1的位置的对称位置的值也变为1*/
}
}
}
printf("对称闭包为\n");
for(i=0;i<f;i++)
{
for(j=0;j<f;j++)
{
printf("%d ",g[i][j]);
}
printf("\n");
}
printf("以集合表示为s(R):\n");
for(i=0;i<f;i++)
for(j=0;j<f;j++)
if(g[i][j]!=0)
printf("<%d,%d>,",i+1,j+1);
printf("\n");
}
void relation3()
{
int result(int x,int y,int z);
for(i=0;i<f;i++)
for(j=0;j<f;j++)
h[i][j]=d[i][j]; /*将矩阵的值赋给h数组*/
printf("-------------------------------------\n");
printf("传递闭包为\n");
for(k=0;k<f;k++)
{
printf("********************%d****************\n",k+1);
for(i=0;i<f;i++)
{
for(j=0;j<f;j++)
{
a=result(h[i][j],h[i][k],h[k][j]); /*调用子函数*/
h[i][j]=a;
printf("%d ",h[i][j]);
}
printf("\n");
}
} /*传递闭包的Warshall算法*/
printf("以集合表示为t(R):\n");
for(i=0;i<f;i++)
for(j=0;j<f;j++)
if(h[i][j]!=0)
printf("<%d,%d>,",i+1,j+1);
printf("\n");
}
int result(int x,int y,int z)
{
int n;
n=x+y*z;
if(n>=1) /*n>=1时也就是该位置的值应为1*/
return 1;
else return 0;
}
- 1
- 2
- 3
前往页