离散数学第二次程序设计(集合与关系)

一、题目要求:

(一)输入:

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");
}

六、运行截图:

 

 

 七、学习感受:

模块化设计能力有所提高,思路也清楚明了。继续加油!

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值