离散数学三大闭包运算代码(C语言)

本代码对于集合元素只支持a-z,有其他情况自行修改

传递闭包采用warshall算法解决

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 256
int count=0,cnt=0;
char ys[max];
char r[max][2];
int matrix[max][max];
int countif(char ch[])
{
    count=0;
    for(int i=0;i<strlen(ch);i++)
    {
        if('a'<=ch[i]&&ch[i]<='z')ys[count++]=ch[i];
    }
    return count;
}
void pp(char rh[])
{
    count=0,cnt=0;
    for(int i=0;i<strlen(rh);i++)
    {
        if('a'<=rh[i]&&rh[i]<='z')r[count][cnt++]=rh[i];
        if(cnt==2){count++;cnt=0;}
    }
}
void rR(char ys[],char r[][2],int count1)
{
    int count2=count;
    for(int i=0;i<count;i++)
    {
        if(r[i][0]==r[i][1])
        {
            for(int j=0;j<count1;j++)
            {
                if(ys[j]==r[i][0])ys[j]='#';
            }
        }
    }
    for(int i=0;i<count1;i++)
    {
        if(ys[i]!='#'){
        r[count2][0]=ys[i];
        r[count2][1]=ys[i];
        count2++;
        }
    }
    printf("r(R)={");
    for(int i=0;i<count2;i++)
    {
        if(i!=0)printf(",");
        printf("<%c,%c>",r[i][0],r[i][1]);
    }
    printf("}");
    printf("\n");}
void sR(char ys[],char r[][2])
{
    int count2=count;
    char a,b;
    for(int i=0;i<count;i++)
    {
        int flag=1;
        a=r[i][1];
        b=r[i][0];
        for(int j=0;j<count2;j++)
        {
            if(a==r[j][0]&&b==r[j][1])
            {
                flag=0;
                break;
            }
        }
        if(flag==1)
        {
            r[count2][0]=a;
             r[count2][1]=b;
             count2++;
        }
    }
    printf("s(R)={");
    for(int i=0;i<count2;i++)
    {
        if(i!=0)printf(",");
        printf("<%c,%c>",r[i][0],r[i][1]);
    }
    printf("}");
    printf("\n");
}
void reset(int count1)
{
    int count2=count1;
    while(ys[count1])
    {
        ys[count1]='\0';
        count1++;
    }
    while(r[count2][0]||r[count2][1])
    {
        r[count2][0]=r[count2][1]='\0';
        count2++;
    }
}
void create_matrix(int matrix[][max],int count1)
{
    int count2=count,cnt=0;
    memset(matrix,0,sizeof(matrix));
    int a,b;
    char c,d;
    for(int i=0;i<count;i++)
    {
        for(int j=0;j<count1;j++)
        {
          if(r[i][0]==ys[j])a=j;
           if(r[i][1]==ys[j])b=j;
        }
        matrix[a][b]=1;
    }
    for(int i=0;i<count1;i++)
    {
        for(int j=0;j<count1;j++)
        {
            if(matrix[j][i]==1)
            {
                for(int k=0;k<count1;k++)
                {
                    matrix[j][k]=matrix[j][k]|matrix[i][k];
                }
            }
        }
    }
    for(int i=0;i<count1;i++)
    {
        for(int j=0;j<count1;j++)
        {
            if(matrix[i][j]==1)
            {
                int flag=1;
                c=ys[i];
                d=ys[j];
                for(int k=0;k<count2;k++)
                {
                    if(r[k][0]==c&&r[k][1]==d)flag=0;
                }
                if(flag==1)
                {
                    r[count2][0]=c;
                    r[count2][1]=d;
                    count2++;
                }
            }
        }
    }
        printf("t(R)={");
    for(int i=0;i<count2;i++)
    {
        if(i!=0)printf(",");
        printf("<%c,%c>",r[i][0],r[i][1]);
    }
    printf("}");
    printf("\n");
}
int main()
{
    printf("请输入集合中的元素:");
    char ch[max];
    scanf("%s",ch);
    printf("\n");
    int count1=countif(ch);
    printf("请输入二元关系R:");
    char rh[max];
    scanf("%s",rh);
    pp(rh);
    printf("\n");
    printf("R的自反闭包为:\n");
    rR(ys,r,count1);
    reset(count1);
     printf("R的对称闭包为:\n");
    sR(ys,r);
    reset(count1);
     printf("R的传递闭包为:\n");
    create_matrix(matrix,count1);
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值