注意:两个功能都可实现合并为一个代码,但是并集函数略有定义错误,当出现多重集合时,应当表示为A+B而不是并集形式
1、给定含有n个元素集合U的两个子集A和B,求出~A, A∪B,A∩B, A⊕B和A-B
(1)首先明确并集、交集、差集、对称差、补集写成自定义函数
(2)其次,考虑主函数,在主函数中输入全集U,子集A和B,自定义函数的功能可以通过switch语句让用户自己选择决定
#include <stdio.h>
#include <stdlib.h>
#define N 50
//思路,知道集合A和集合B,利用一个空数组C把A中的集合复制到C中,然后比较A和B,
//当且仅当两者不相等时,存入B中与A不相等的元素
void bingji(int A[],int B[],int la,int lb)
{
int C[N]={0};
int i,j,m,k;
printf("集合A为:\n");
for(i=0;i<la;i++)
{
printf("%d ",A[i]);
}
printf("\n集合B为:\n");
for(j=0;j<lb;j++)
{
printf("%d ",B[j]);
}
for(m=0;m<la;m++)
{
C[m]=A[m];
}
for(i=0;i<lb;i++)
{
int flag=0;
for(j=0;j<la;j++)
{
if(B[i]==A[j])
{
flag=1;
}
}
if(flag==0)
{
C[m]=B[i];
m++;
}
}
printf("\n并集为:\n");
for(k=0;k<(la+lb);k++)
{
if(C[k]==0)
{
break;
}
printf("%d ",C[k]);
}
}
void jiaoji(int A[],int B[],int la,int lb)
{
int C[N]={0};
int i,j,m,k;
m=0;
printf("集合A为:\n");
for(i=0;i<la;i++)
{
printf("%d ",A[i]);
}
printf("\n集合B为:\n");
for(j=0;j<lb;j++)
{
printf("%d ",B[j]);
}
for(i=0;i<lb;i++)
{
int flag=1;
for(j=0;j<la;j++)
{
if(B[i]==A[j])
{
flag=0;
}
}
if(flag==0)
{
C[m]=B[i];
m++;
}
}
printf("\n交集为:\n");
for(k=0;k<m;k++)
{
if(C[k]==0)
{
break;
}
printf("%d ",C[k]);
}
}
void chaji(int A[],int B[],int la,int lb)
{
int C[N]={0};
int i,j,m,k;
m=0;
printf("集合A为:\n");
for(i=0;i<la;i++)
{
printf("%d ",A[i]);
}
printf("\n集合B为:\n");
for(j=0;j<lb;j++)
{
printf("%d ",B[j]);
}
for(i=0;i<la;i++)
{
int flag=1;
for(j=0;j<lb;j++)
{
if(B[i]==A[j])
{
flag=0;
}
}
if(flag==1)
{
C[m]=A[i];
m++;
}
}
printf("\n差集为(A-B):\n");
for(k=0;k<m;k++)
{
if(C[k]==0)
{
break;
}
printf("%d ",C[k]);
}
}
void duichencha(int A[],int B[],int la,int lb)
{
int C[N]={0};
int D[N]={0};
int i,j,m,n,k;
m=0;
n=0;
printf("集合A为:\n");
for(i=0;i<la;i++)
{
printf("%d ",A[i]);
}
printf("\n集合B为:\n");
for(j=0;j<lb;j++)
{
printf("%d ",B[j]);
}
for(i=0;i<lb;i++)
{
int flag=1;
for(j=0;j<la;j++)
{
if(B[i]==A[j])
{
flag=0;
}
}
if(flag==1)
{
C[m]=B[i];
m++;
}
}
for(i=0;i<la;i++)
{
int flag=1;
for(j=0;j<lb;j++)
{
if(A[i]==B[j])
{
flag=0;
}
}
if(flag==1)
{
D[n]=A[i];
n++;
}
}
printf("\n对称差集为:\n");
for(k=0;k<m;k++)
{
if(C[k]==0)
{
break;
}
printf("%d ",C[k]);
}
for(k=0;k<n;k++)
{
if(D[k]==0)
{
break;
}
printf("%d ",D[k]);
}
}
void buji(int A[],int U[],int la)
{
int C[N]={0};
int i,j,m,k;
m=0;
printf("集合A为:\n");
for(i=0;i<la;i++)
{
printf("%d ",A[i]);
}
for(i=0;i<20;i++)
{
int flag=1;
for(j=0;j<la;j++)
{
if(U[i]==A[j])
{
flag=0;
}
}
if(flag==1)
{
C[m]=U[i];
m++;
}
}
printf("\n补集为~A:\n");
for(k=0;k<m;k++)
{
if(C[k]==0)
{
break;
}
printf("%d ",C[k]);
}
}
int main()
{
int n1,n2,k;
n1=0;
n2=0;
k=0;
int A[N],B[N];
int U[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
printf("全集U为:");
for(k=0;k<N;k++)
{
if(U[k]==0)
{
break;
}
printf("%d ",U[k]);
}
printf("\n请输入第一个集合\n注意:输入0即为结束输入\n");
while(1)
{
scanf("%d",&A[n1]);
if(A[n1]==0)
break;
//printf("第一个集合为:%d\n",A[n1]);
n1++;
}
printf("请输入第二个集合\n注意:输入0即为结束输入\n");
while(1)
{
scanf("%d",&B[n2]);
if(B[n2]==0)
break;
//printf("第二个集合为:%d\n",B[n2]);
n2++;
}
int key=0;
printf("请输入要进行的操作\n1为并集\n2为交集\n3为差集\n4为对称差\n5为补集\n");
scanf("%d",&key);
switch(key)
{
case 1:
bingji(A,B,n1,n2);
break;
case 2:
jiaoji(A,B,n1,n2);
break;
case 3:
chaji(A,B,n1,n2);
break;
case 4:
duichencha(A,B,n1,n2);
break;
case 5:
buji(A,U,n1);
break;
}
}
(3)主函数
思路:给出全集,让用户自己输入子集A和B,并且通过循环到最后一个数为0停止知道子集A和B的长度,调用switch语句让用户自己选择需要计算的操作
int main()
{
int n1,n2,k;
n1=0;
n2=0;
k=0;
int A[N],B[N];
int U[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
printf("全集U为:");
for(k=0;k<N;k++)
{
if(U[k]==0)
{
break;
}
printf("%d ",U[k]);
}
printf("\n请输入第一个集合\n注意:输入0即为结束输入\n");
while(1)
{
scanf("%d",&A[n1]);
if(A[n1]==0)
break;
//printf("第一个集合为:%d\n",A[n1]);
n1++;
}
printf("请输入第二个集合\n注意:输入0即为结束输入\n");
while(1)
{
scanf("%d",&B[n2]);
if(B[n2]==0)
break;
//printf("第二个集合为:%d\n",B[n2]);
n2++;
}
int key=0;
printf("请输入要进行的操作\n1为并集\n2为交集\n3为差集\n4为对称差\n5为补集\n");
scanf("%d",&key);
switch(key)
{
case 1:
bingji(A,B,n1,n2);
break;
case 2:
jiaoji(A,B,n1,n2);
break;
case 3:
chaji(A,B,n1,n2);
break;
case 4:
duichencha(A,B,n1,n2);
break;
case 5:
buji(A,U,n1);
break;
}
}
(4)并集
思路:首先显示集合A和集合B,其次先让集合A中的所有元素存入空数组C中,然后循环比较A和B有哪一个不同的元素,不同的元素就存入C中,最后输出C
void bingji(int A[],int B[],int la,int lb)
{
int C[N]={0};
int i,j,m,k;
printf("集合A为:\n");
for(i=0;i<la;i++)
{
printf("%d ",A[i]);
}
printf("\n集合B为:\n");
for(j=0;j<lb;j++)
{
printf("%d ",B[j]);
}
for(m=0;m<la;m++)
{
C[m]=A[m];
}
for(i=0;i<lb;i++)
{
int flag=0;
for(j=0;j<la;j++)
{
if(B[i]==A[j])
{
flag=1;
}
}
if(flag==0)
{
C[m]=B[i];
m++;
}
}
printf("\n并集为:\n");
for(k=0;k<(la+lb);k++)
{
if(C[k]==0)
{
break;
}
printf("%d ",C[k]);
}
}
(5)交集
思路:显示出集合A和B,当A和B都相等共有时,存入C中,然后输出
void jiaoji(int A[],int B[],int la,int lb)
{
int C[N]={0};
int i,j,m,k;
m=0;
printf("集合A为:\n");
for(i=0;i<la;i++)
{
printf("%d ",A[i]);
}
printf("\n集合B为:\n");
for(j=0;j<lb;j++)
{
printf("%d ",B[j]);
}
for(i=0;i<lb;i++)
{
int flag=1;
for(j=0;j<la;j++)
{
if(B[i]==A[j])
{
flag=0;
}
}
if(flag==0)
{
C[m]=B[i];
m++;
}
}
printf("\n交集为:\n");
for(k=0;k<m;k++)
{
if(C[k]==0)
{
break;
}
printf("%d ",C[k]);
}
}
(6)差集
思路:从A开始循环比较,A和B不相等时,存入C中,得到A-B,如果要得到B-A,就从B开始循环比较
void chaji(int A[],int B[],int la,int lb)
{
int C[N]={0};
int i,j,m,k;
m=0;
printf("集合A为:\n");
for(i=0;i<la;i++)
{
printf("%d ",A[i]);
}
printf("\n集合B为:\n");
for(j=0;j<lb;j++)
{
printf("%d ",B[j]);
}
for(i=0;i<la;i++)
{
int flag=1;
for(j=0;j<lb;j++)
{
if(B[i]==A[j])
{
flag=0;
}
}
if(flag==1)
{
C[m]=A[i];
m++;
}
}
printf("\n差集为(A-B):\n");
for(k=0;k<m;k++)
{
if(C[k]==0)
{
break;
}
printf("%d ",C[k]);
}
}
(7)对称差
思路:在A中,不在B中同时在B中,不在A中,所以用两个差集的思路即可
void duichencha(int A[],int B[],int la,int lb)
{
int C[N]={0};
int D[N]={0};
int i,j,m,n,k;
m=0;
n=0;
printf("集合A为:\n");
for(i=0;i<la;i++)
{
printf("%d ",A[i]);
}
printf("\n集合B为:\n");
for(j=0;j<lb;j++)
{
printf("%d ",B[j]);
}
for(i=0;i<lb;i++)
{
int flag=1;
for(j=0;j<la;j++)
{
if(B[i]==A[j])
{
flag=0;
}
}
if(flag==1)
{
C[m]=B[i];
m++;
}
}
for(i=0;i<la;i++)
{
int flag=1;
for(j=0;j<lb;j++)
{
if(A[i]==B[j])
{
flag=0;
}
}
if(flag==1)
{
D[n]=A[i];
n++;
}
}
printf("\n对称差集为:\n");
for(k=0;k<m;k++)
{
if(C[k]==0)
{
break;
}
printf("%d ",C[k]);
}
for(k=0;k<n;k++)
{
if(D[k]==0)
{
break;
}
printf("%d ",D[k]);
}
}
(8)补集
思路:在全集U中做循环比较A中只要没有,就存入C中,然后输出即可得出~A,~B思路也是如此
void buji(int A[],int U[],int la)
{
int C[N]={0};
int i,j,m,k;
m=0;
printf("集合A为:\n");
for(i=0;i<la;i++)
{
printf("%d ",A[i]);
}
for(i=0;i<20;i++)
{
int flag=1;
for(j=0;j<la;j++)
{
if(U[i]==A[j])
{
flag=0;
}
}
if(flag==1)
{
C[m]=U[i];
m++;
}
}
printf("\n补集为~A:\n");
for(k=0;k<m;k++)
{
if(C[k]==0)
{
break;
}
printf("%d ",C[k]);
}
}
算法参考
CSDN博主Kilig*