IE盒子

搜索
查看: 126|回复: 1

用C语言简单编写两个集合的交,并,差,对称差

[复制链接]

2

主题

5

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-12-3 19:12:14 | 显示全部楼层 |阅读模式
由于没有用到复杂的机制,只用到了循环,函数,所以设置了最大元素为50.
为了提高代码的通用性,集合的输入改为用户输入。
代码新人,做的不好的地方望多加指正,谢谢。
废话不多说,上代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a[50]={0};
int b[50]={0};
int c[50]={0};
int d[50]={0};
int e[50]={0};
int p=0;

//求A交B, 分为intersection 和 out_intersection
int intersection(int x, int y){//求交集,返回公共元素的个数
    int i,j=0;
    int k=0;
    for(int i=0;i<x;i++){
        for(int j=0;j<y;j++){
            if(a==b[j]){//如果元素相同,则将相同的数储存到数组c中
                c[k] = a;
                k++;
            }
        }
    }
    return k;
}

void  out_intersection(int k){//输出环节
    int i;
    printf("A交B为: {");
    for(i=0;i<k;i++){
        printf("%d ",c);
    }
    printf("}\n");

}

//求A并B , myunion
void myunion(int x,int y,int k){ //求并集
    int i,j,m=0;
    int n;
    int com[50] = {0};
    //将A中的元素复制一遍到数组d中
    for(i=0;i<x;i++){
        d[m]=a;
        m++;
    }
    //将B中的元素复制到数组d后边
    for(j=0;j<y;j++){
        d[m]=b[j];
        m++;
    }
    //此时d中含有A和B中的所有元素,下面只需将重复的元素去除即可

    for(i =0;i<x+y-k;i++){  //总的元素个数等于x+y-k,其中k为AB公共的元素个数
        for(j=i+1;j<m;j++){   //遍历第i个后边的元素
            if(d[j]==d){  //如果后边的元素j与第i个元素相等
                for(n=j;n<m;n++){  //让后边第j+1个元素等于j,并向前依次覆盖
                    d[n] = d[n+1];
                }
                break; //跳出此次循环,进入到下一个i的判断
            }
        }
    }

    printf("A并B为: {"); //输出环节
    for(i=0;i<x+y-k;i++){
            printf("%d ",d);

    }
    printf("}\n");
}

//求集合A-B
void reduce(int x,int k){
int i,j,m;
for(i=0;i<x;i++){
  e=a;
}
for(i=0;i<x-k;i++){  //思路同并集中除去重复元素
  for(j=0;j<k;j++){
   if(e==c[j]){
    for (m=i;m<x;m++){  //将重复后所有元素前移
     e[m]=e[m+1];
    }
    i--;
    break;
   }
  }
}
printf("A-B={");
for(i=0;i<x-k-1;i++){
  printf("%d ",e);
}
printf("%d}\n",e[x-k-1]);
}

//求集合的对称差
//原理: A与B的对称差为: (A-B) ∪ (B-A) =(A∪B) - (A交B);
void sym(int x, int y){
    int k = intersection(x,y);
    int i,j,m=0;
    int nf,ng =0;
    int n;
    int f [50] = {0};
    int g [50] = {0};
    //A∪B,得到数组f,以及数组f的元素个数nf

    //将A中的元素复制一遍到数组d中
    for(i=0;i<x;i++){
        f[m]=a;
        m++;
    }
    //将B中的元素复制到数组d后边
    for(j=0;j<y;j++){
        f[m]=b[j];
        m++;
    }
    //此时d中含有A和B中的所有元素,下面只需将重复的元素去除即可
    for(i =0;i<x+y-k;i++){  //总的元素个数等于x+y-k,其中k为AB公共的元素个数
        for(j=i+1;j<m;j++){   //遍历第i个后边的元素
            if(f[j]==f){  //如果后边的元素j与第i个元素相等
                for(n=j;n<m;n++){  //让后边第j+1个元素等于j,并向前依次覆盖
                    f[n] = f[n+1];
                }
                break; //跳出此次循环,进入到下一个i的判断
            }
        }
    }
    nf = sizeof(f)/sizeof(f[0]);

    //A交B,得到数组g以及g的元素个数ng
    int h = 0;
    for(int i=0;i<x;i++){
        for(int j=0;j<y;j++){
            if(a==b[j]){//如果元素相同,则将相同的数储存到数组c中
                g[h] = a;
            }
        }
    }
    ng = sizeof(g)/sizeof(g[0]);

    //求差(A∪B) - (A交B),即 f-g;
     i,j,m =0;
    int v[50]={0};
    for(int i=0;i<nf;i++){
  v=f;
}
for( i=0;i<nf-k;i++){  //思路同并集中除去重复元素,
  for( j=0;j<k;j++){
   if(v==c[j]){    //二重循环为了验证是否是同一个元素
    for (m=i;m<nf;m++){  //如果是同样的元素,则将此元素用后一个覆盖,并依次向前覆盖
     v[m]=v[m+1];
    }
    i--;   //第i个元素判断再次验证
    break;
   }
  }
}

printf("A与B的对称差为: {");
for(i=0;i<nf-k-1;i++){
     if(v!=0){
  printf("%d ",v);
     }
     else{
        break;
     }
}
printf("}\n");
}

void input(int x, int y) //用户自己输入集合
{
    int i,j;
    printf("请输入A的元素: ");
    for(i=0; i<x; i++)
    {
        scanf("%d",&a);
        //判断是否重复输入相同的元素
        getchar();
        for(j=0; j<i; j++)
        {
            if(a==a[j])
            {
                printf("输入错误,已经含有相同的元素,请重新输入!");
                a=0;
                i--;
            }
        }
    }

    printf("请输入B的元素: ");
    for(i=0; i<y; i++)
    {
        scanf("%d",&b);
        //查重
        getchar();
        for(j=0; j<i; j++)
        {
            if(b==b[j])
            {
                printf("输入错误,已经含有相同的元素,请重新输入!");
                b=0;
            }
        }
    }
}

int main(){
    int x,y,i,j,k,choice;
    while(1){
        printf("\n输入1求集合的并集\n输入2求集合的交集\n输入3求集合的差\n输入4求集合的对称差\n输入0退出程序\n\n");
        scanf("%d",&choice);
        if(choice==1){
            printf("请输入A集合的元素个数:\n");
            scanf("%d",&x);
            printf("请输入B集合的元素个数:\n");
            scanf("%d",&y);
            input(x,y);
            myunion(x,y,intersection(x,y));
        }
        else if(choice==2){
            printf("请输入A集合的元素个数:\n");
            scanf("%d",&x);
            printf("请输入B集合的元素个数:\n");
            scanf("%d",&y);
            input(x,y);
            out_intersection(intersection(x,y));
        }
        else if(choice==3){
            printf("请输入A集合的元素个数:\n");
            scanf("%d",&x);
            printf("请输入B集合的元素个数:\n");
            scanf("%d",&y);
            input(x,y);
            k=intersection(x,y);
            reduce(x,k);
        }
        else if(choice==4){
            printf("请输入A集合的元素个数:\n");
            scanf("%d",&x);
            printf("请输入B集合的元素个数:\n");
            scanf("%d",&y);
            input(x,y);
            sym(x,y);
        }
        else if(choice==0){
                printf("退出程序");
            break;
        }
        else{
            printf("你输入的数字有误,请重新输入!");
        }

    }
}
回复

使用道具 举报

0

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2025-3-25 13:09:53 | 显示全部楼层
占坑编辑ing
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表