|
由于没有用到复杂的机制,只用到了循环,函数,所以设置了最大元素为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(&#34;A交B为: {&#34;);
for(i=0;i<k;i++){
printf(&#34;%d &#34;,c);
}
printf(&#34;}\n&#34;);
}
//求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(&#34;A并B为: {&#34;); //输出环节
for(i=0;i<x+y-k;i++){
printf(&#34;%d &#34;,d);
}
printf(&#34;}\n&#34;);
}
//求集合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(&#34;A-B={&#34;);
for(i=0;i<x-k-1;i++){
printf(&#34;%d &#34;,e);
}
printf(&#34;%d}\n&#34;,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(&#34;A与B的对称差为: {&#34;);
for(i=0;i<nf-k-1;i++){
if(v!=0){
printf(&#34;%d &#34;,v);
}
else{
break;
}
}
printf(&#34;}\n&#34;);
}
void input(int x, int y) //用户自己输入集合
{
int i,j;
printf(&#34;请输入A的元素: &#34;);
for(i=0; i<x; i++)
{
scanf(&#34;%d&#34;,&a);
//判断是否重复输入相同的元素
getchar();
for(j=0; j<i; j++)
{
if(a==a[j])
{
printf(&#34;输入错误,已经含有相同的元素,请重新输入!&#34;);
a=0;
i--;
}
}
}
printf(&#34;请输入B的元素: &#34;);
for(i=0; i<y; i++)
{
scanf(&#34;%d&#34;,&b);
//查重
getchar();
for(j=0; j<i; j++)
{
if(b==b[j])
{
printf(&#34;输入错误,已经含有相同的元素,请重新输入!&#34;);
b=0;
}
}
}
}
int main(){
int x,y,i,j,k,choice;
while(1){
printf(&#34;\n输入1求集合的并集\n输入2求集合的交集\n输入3求集合的差\n输入4求集合的对称差\n输入0退出程序\n\n&#34;);
scanf(&#34;%d&#34;,&choice);
if(choice==1){
printf(&#34;请输入A集合的元素个数:\n&#34;);
scanf(&#34;%d&#34;,&x);
printf(&#34;请输入B集合的元素个数:\n&#34;);
scanf(&#34;%d&#34;,&y);
input(x,y);
myunion(x,y,intersection(x,y));
}
else if(choice==2){
printf(&#34;请输入A集合的元素个数:\n&#34;);
scanf(&#34;%d&#34;,&x);
printf(&#34;请输入B集合的元素个数:\n&#34;);
scanf(&#34;%d&#34;,&y);
input(x,y);
out_intersection(intersection(x,y));
}
else if(choice==3){
printf(&#34;请输入A集合的元素个数:\n&#34;);
scanf(&#34;%d&#34;,&x);
printf(&#34;请输入B集合的元素个数:\n&#34;);
scanf(&#34;%d&#34;,&y);
input(x,y);
k=intersection(x,y);
reduce(x,k);
}
else if(choice==4){
printf(&#34;请输入A集合的元素个数:\n&#34;);
scanf(&#34;%d&#34;,&x);
printf(&#34;请输入B集合的元素个数:\n&#34;);
scanf(&#34;%d&#34;,&y);
input(x,y);
sym(x,y);
}
else if(choice==0){
printf(&#34;退出程序&#34;);
break;
}
else{
printf(&#34;你输入的数字有误,请重新输入!&#34;);
}
}
} |
|