集合的交运算
假设集合E包含A,B两个任意子集,称集合E为全集,集合的交运算为集合A,B中相同元素的集合,记为A∩B。若集合A,B之间无相同的元素,则交运算的结果为空集。例如:全集为全体整数,集合A={1,2,3,4},集合B={3,4,5,6},则A∩B={3,4}。
集合的并运算
假设集合E包含A,B两个任意子集,称集合E为全集,集合的并运算为集合A,B包含的所有元素去除重复元素后的集合,记为A∪B,例如:全集为全体整数,集合A={1,2,3,4},集合B={3,4,5,6},则A∪B={1,2,3,4,5,6}。
集合的差运算
假设集合E包含A,B两个任意子集,称集合E为全集,集合的差运算为集合A去除集合B中与集合A相同元素的集合,记为A−B。例如:全集为全体整数,集合A={1,2,3,4},集合B={3,4,5,6},则A−B={1,2}
集合的补运算
假设有全集E,集合A为全集E中的任意子集,集合A的补运算为不在集合A中的其他全集元素,记为Aˉ=E−A。例如:全集E={1,2,3,4,5},集合A={1,2,3,4},则E-A={5}
集合的对称差
假设集合E包含A,B两个任意子集,称集合E为全集,集合的对称差运算为集合A,B的并集中去除集合A,B中相同的元素,记为A⊕B=(A∪B)−(A∩B)。例如:全集为全体整数,集合A={1,2,3,4},集合B={3,4,5,6},则A⊕B={1,2,5,6}
附上运行截图:
附上代码:
#include<iostream>
#include<cstdio>
#include<windows.h>
using namespace std;
void jiao(int a[],int b[],int count1,int count2)
{
cout<<"{";
if(count1!=0&&count2!=0)
{
for(int i=0;i<=count1;i++)
for(int j=0;j<=count2;j++)
{
if(a[i]==b[j])
cout<<a[i]<<" ";
}
}
else if(count1==0||count2==0)
cout<<"空集";
else if(count1==0&&count2==0)
cout<<"空集";
cout<<"}";
}
void bing(int a[],int b[],int count1,int count2)
{
if(count1!=0&&count2!=0)
{
for(int i=0;i<=count1;i++)
for(int j=0;j<=count2;j++)
{
if(a[i]==b[j])
a[i]='0';
}
cout<<"{";
for(int i=0;i<=count1;i++)
{
if(a[i]!='0')
cout<<a[i]<<" ";
}
for(int j=0;j<=count2;j++)
{
cout<<b[j]<<" ";
}
cout<<"}";
}
else if(count1==0&&count2!=0)
{ cout<<"{";
for(int j=0;j<=count2;j++)
cout<<b[j]<<" ";
cout<<"}";
}
else if(count1!=0&&count2==0)
{
cout<<"{";
for(int i=0;i<=count1;i++)
cout<<a[i]<<" ";
cout<<"}";
}
else if(count1==0&&count2==0)
cout<<"{空集}";
}
void bu(int a[],int b[],int count1,int count2)
{
if(count1!=0&&count2!=0)
{
if(count1>=count2)
{
for(int i=0;i<count1;i++)
for(int j=0;j<count2;j++)
{
if(a[i]==b[j])
a[i]='0';
}
cout<<"{";
for(int i=0;i<count1;i++)
{
if(a[i]!='0')
cout<<a[i]<<" ";
}
cout<<"}";
}
else
{
for(int i=0;i<count1;i++)
for(int j=0;j<count2;j++)
{
if(a[i]==b[j])
b[j]='0';
}
cout<<"{";
for(int j=0;j<count2;j++)
{
if(b[j]!='0')
cout<<b[j]<<" ";
}
cout<<"}";
}
}
else if(count1==0&&count2!=0)
{
cout<<"{";
for(int j=0;j<=count2;j++)
cout<<b[j]<<" ";
cout<<"}";
}
else if(count1!=0&&count2==0)
{
cout<<"{";
for(int i=0;i<=count1;i++)
cout<<a[i]<<" ";
cout<<"}";
}
else if(count1==0&&count2==0)
cout<<"{空集}";
}
void cha(int a[],int b[],int count1,int count2)
{
if(count1!=0&&count2!=0)
{
for(int i=0;i<count1;i++)
for(int j=0;j<count2;j++)
{
if(a[i]==b[j])
a[i]='0';
}
cout<<"{";
for(int i=0;i<count1;i++)
{
if(a[i]!='0')
cout<<a[i]<<" ";
}
cout<<"}";
}
else if(count1==0&&count2!=0)
{
cout<<"{";
for(int j=0;j<=count2;j++)
cout<<b[j]<<" ";
cout<<"}";
}
else if(count1!=0&&count2==0)
{
cout<<"{";
for(int i=0;i<=count1;i++)
cout<<a[i]<<" ";
cout<<"}";
}
else if(count1==0&&count2==0)
cout<<"{空集}";
}
void dcc(int a[],int b[],int count1,int count2)
{
if(count1!=0&&count2!=0)
{
for(int i=0;i<count1;i++)
for(int j=0;j<count2;j++)
{
if(a[i]==b[j])
{
a[i]='0';
b[j]='0';
}
}
cout<<"{";
for(int i=0;i<count1;i++)
{
if(a[i]!='0')
cout<<a[i]<<" ";
}
for(int j=0;j<count2;j++)
{
if(b[j]!='0')
cout<<b[j]<<" ";
}
cout<<"}";
}
else if(count1==0||count2==0)
cout<<"{空集}";
else if(count1==0&&count2==0)
cout<<"{空集}";
}
int main()
{
system("color f0");
int a[100],b[100];
int i=0,j=0;
int count1=0,count2=0;
int n;
char s[100]={"\t\t\t请输入第一个集合:"};
for(int i=0;s[i]!=NULL;i++)
{
Sleep(30);
cout<<s[i];
}
cout<<endl<<endl<<endl;
printf("\t\t\t");
char h=getchar();
if(h!='\n')
{
for(i=1;;i++)
{
a[0]=h;
cin>>a[i];
count1++;
if(getchar()=='\n')
break;
}
}
else
count1=0;
cout<<endl<<endl<<endl;
char t[100]={"\t\t\t请输入第二个集合:"};
for(int i=0;t[i]!=NULL;i++)
{
Sleep(30);
cout<<t[i];
}
cout<<endl<<endl<<endl;
printf("\t\t\t");
char l=getchar();
if(l!='\n')
{
for( j=1;;j++)
{
b[0]=l;
cin>>b[j];
count2++;
if(getchar()=='\n')
break;
}
}
else
count2=0;
cout<<endl<<endl<<endl;
char k[100]={"\t\t\t请输入1~5选择要进行的运算:1.交运算 2.并运算 3.补运算 4.差运算 5.对称差运算"};
for(int i=0;k[i]!=NULL;i++)
{
Sleep(10);
cout<<k[i];
}
cout<<endl<<endl<<endl;
printf("\t\t\t");
cin>>n;
switch(n)
{
case 1:
jiao(a,b,count1,count2);
break;
case 2:
bing(a,b,count1,count2);
break;
case 3:
bu(a,b,count1,count2);
break;
case 4:
cha(a,b,count1,count2);
break;
case 5:
dcc(a,b,count1,count2);
break;
default:
break;
}
return 0;
}
代码似乎有点问题,但是整体是可以的,可以做个参考。
算法描述:
该实验由题目要求可知需要写5个分函数进行交,并,补,差,对称差的运算。于是我先写了个框架,包含5个分函数和一个主函数。
在主函数中输入两个数组,并对空集特殊情况进行考虑和处理,若数组一开始得到一个回车,则表示为空集。定义一个变量存储getchar()吞掉的第一个字符,作为数组的第一个元素,这样就不会出现getchar()吞掉元素而使数组元素不全的问题。并且在输入数组时用count1和count2来计算数组的元素个数,方便分函数中对数组进行处理。
在五个运算中分别考虑两个集合是不是空集的特殊情况,并对每种情况都进行相应处理。
交集判断并输出两个集合相同的部分。
并集判断两个集合中相同的部分,并对重复的部分只输出一次。
补集先判断两个集合哪个更长,长的集合作为全集减去短的集合剩下的元素则为补集。
差集判断两个集合中相同的部分,并用第一个集合减去相同的元素。
对称差为两个集合的并集减去两个集合的交集。
我用了Windows头文件里的system(color)函数更改了控制台和字体颜色,用Sleep()函数进行了动(花)态(里)显(胡)示(哨)。