一、题目要求:
(一)输入:
1. 一个有限集合A
2. A上的关系R
(二)输出:
1. R的关系矩阵
2. R具有的性质
3. R的自反闭包、对称闭包、传递闭包
4. 判断R是否为等价关系,相容关系,偏序关系
二、算法思想:
(一)模块化设计,分为几大块进行设计;
(二)由整体到部分,由大体到细节;
(三)充分利用多层循环;
三、算法描述:
该题目充分利用模块化设计思路,分为输入函数、输出关系矩阵、判断性质、输出闭包矩阵、判断关系五个大框架,充分利用计算机的优势采用矩阵算法,利用循环计算矩阵。
四、流程图:
五、函数说明:
(一)变量说明:
#define MAX 50//集合A中元素的最大个数
//规定集合A不是空集合,关系R不是空关系
//集合A的定义
struct A_group
{
int a[MAX];//集合A
int length;//集合A中元素的个数
}a_group;
//关系R的定义
struct R_relation
{
int r[MAX][2];
int length;//R中序偶的个数
}r_relation;
//关系矩阵的定义
int r_juzhen[MAX][MAX]={0};
(二)主函数:
int main()
{
shuru();//输入A和R
print_R();//输出R的关系矩阵
int true1=0,true2=0,true3=0,true4=0;//true1代表自反性,true2代表对称性,true3代表传递性,true4代表反对称
true1=zifanxing();
true2=duichenxing();
true3=chuandixing();
true4=fanduichenxing();
print_xingzhi(true1,true2,true3);//R的性质
print_threebibao();//输出三个闭包
judge_relation(true1,true2,true3,true4);//判断R为什么关系
return 0;
}
(三)输入函数:
{
int i=0;
printf("请输入集合A中元素的个数:\n");
scanf("%d",&a_group.length );
printf("请输入集合A的元素:\n");
for(i=0;i<a_group.length ;i++)
{
scanf("%d",&a_group.a[i]);
}
printf("请输入A上的关系R中序偶的个数:\n");
scanf("%d",&r_relation.length );
printf("请输入A上的关系R:\n");
for(i=0;i<r_relation.length;i++)
{
scanf("%d",&r_relation.r[i][0]);
scanf("%d",&r_relation.r[i][1]);
}
printf("\n");
}
(四)R的关系矩阵:
void print_R()//输出R的关系矩阵
{
printf("R的关系矩阵是:\n");
int i,j,m,n;
for(i=0;i<r_relation.length;i++)
{
for(j=0;j<a_group.length;j++)
{
if(r_relation.r[i][0]==a_group.a[j])
{
m=j;
}
if(r_relation.r[i][1]==a_group.a[j])
{
n=j;
}
}
r_juzhen[m][n]=1;
}
for(i=0;i<a_group.length;i++)
{
for(j=0;j<a_group.length;j++)
{
printf("%d ",r_juzhen[i][j]);
}
printf("\n");
}
printf("\n");
}
(五)R的性质:
void print_xingzhi(int true1,int true2,int true3)//R的性质
{
if(!true1&&!true2&&!true3)
printf("R不具有自反性、对称性、传递性");
else
{
printf("R有:");
if(true1)
printf("自反性 ");
if(true2)
printf("对称性 ");
if(true3)
printf("传递性 ");
}
printf("\n\n");
}
//自反性
int zifanxing()
{
int i;
for(i=0;i<a_group.length;i++)
{
if(r_juzhen[i][i]==0)
return 0;
}
return 1;
}
//对称性
int duichenxing()
{
int i,j;
for(i=0;i<a_group.length;i++)
{
for(j=0;j<a_group.length;j++)
{
if(r_juzhen[i][j]==1)
{
if(r_juzhen[j][i]==0)
return 0;
}
}
}
return 1;
}
//反对称性
int fanduichenxing()
{
int i,j;
for(i=0;i<a_group.length;i++)
{
for(j=0;j<a_group.length;j++)
{
if(r_juzhen[i][j]==1&&i!=j)
{
if(r_juzhen[j][i]==1)
return 0;
}
}
}
return 1;
}
//传递性
int chuandixing()
{
int i,j,k,m,n;
for(i=0;i<a_group.length;i++)
{
for(j=0;j<a_group.length;j++)
{
if(r_juzhen[i][j]==1)
{
for(k=0;k<a_group.length;k++)
{
if(r_juzhen[j][k]==1)
{
if(r_juzhen[i][k]==0)
return 0;
}
}
}
}
}
return 1;
}
(六)R的三个闭包:
void print_bibao(int n,int newr[50][50])//R的三个闭包
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",newr[i][j]);
}
printf("\n");
}
printf("\n");
}
void zifan_bibao(int n,int newr[50][50])//自反闭包
{
int i,j;
int I[n][n]={0};
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
I[i][j]=1;
else
I[i][j]=0;
}
}
int sum;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
sum=0;
sum=r_juzhen[i][j]+I[i][j];
if(sum>0)
newr[i][j]=1;
else
newr[i][j]=0;
}
}
}
void duichen_bibao(int n,int newr[50][50])//对称闭包
{
int i,j;
int I[n][n]={0};
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
I[i][j]=r_juzhen[j][i];
}
}
int sum;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
sum=0;
sum+=r_juzhen[i][j]+I[i][j];
if(sum>0)
newr[i][j]=1;
else
newr[i][j]=0;
}
}
}
void chuandi_bibao(int n,int r_juzhen[50][50])//传递闭包
{
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(r_juzhen[j][i]==1)
{
for(k=0;k<n;k++)
{
if(r_juzhen[j][k]+r_juzhen[i][k]>0)
r_juzhen[j][k]=1;
}
}
}
}
}
void print_threebibao()//输出三个闭包
{
int n=a_group.length ;
int newr[50][50]={0};
printf("R的自反闭包:\n");
zifan_bibao(n,newr);
print_bibao(n,newr);
newr[50][50]={0};
printf("R的对称闭包:\n");
duichen_bibao(n,newr);
print_bibao(n,newr);
newr[50][50]={0};
printf("R的传递闭包:\n");
chuandi_bibao(n,r_juzhen);
print_bibao(n,r_juzhen);
}
(七)R为什么关系:
//等价关系:自反、对称、传递
//相容关系:自反、对称
//偏序关系:自反、反对称、传递
void judge_relation(int true1,int true2,int true3,int true4)//判断R为什么关系
{
if(!(true1&&true2&&true3)&&!(true1&&true2)&&!(true1&&true3&&true4))
printf("R不为任何一种关系");
else
{
printf("R是:");
if(true1&&true2&&true3)
printf("等价关系 ");
if(true1&&true2)
printf("相容关系 ");
if(true1&&true3&&true4)
printf("偏序关系 ");
}
printf("\n\n");
}
六、运行截图:
七、学习感受:
模块化设计能力有所提高,思路也清楚明了。继续加油!