編一C程序,它能讀入集合A的一串整數(shù)(以-9999為結(jié)束標(biāo)記,整數(shù)個數(shù)小于1000)和集合B的一串整數(shù)(以-9999為結(jié)束標(biāo)記,整數(shù)個數(shù)小于1000),計算出A與B的交集,
并以由小到大的次序輸出A與B的交集中的所有整數(shù)(輸入整數(shù)時,相鄰的兩個用空格隔開。為A或B輸入時,同一個數(shù)可能出現(xiàn)多次,而A與B的交集中同一個數(shù)不能出現(xiàn)多次)。(注:程序的可執(zhí)行文件名必須是 e2.exe)。
*/
//注意調(diào)試程序時要多輸入重復(fù)數(shù)據(jù)調(diào)試;本程序是根據(jù)青龍?zhí)峁┑某绦蚋木?,消除了重復(fù)數(shù)據(jù)的錯誤!
#include iostream.h
#include stdio.h
void BuCountbbleSort(int r[],int n)
{//冒泡排序
int i,j,k;
int exchange;
for(i=0;i i++)
{
exchange=0;
for(j=n-1;j j--)
if(r[j+1] r[j])
{
k=r[j+1];
r[j+1]=r[j];
r[j]=k;
exchange=1;
}
if(!exchange)
break;
}
}
int BingJi(int m[],int n[],int l[],int Countaa,int Countbb)
{//求集合的并集
int i=0,j=0,k=0;
while(i =Countaa j =Countbb)
{
if(m[i] n[j])
{//如果 m[i] n[j]則取小的值m[i],然后i++;
l[k]=m[i];
k++;
i++;
}//endif
else if(m[i] n[j])
{//如果 m[i] n[j]則取小的值n[j],然后j++;
l[k]=n[j];
k++;
j++;
}//end elseif
else
{//如果 m[i]==n[j],可以任取一個值,然后i++;j++;
l[k]=m[i];
k++;
i++;
j++;
}//endelse
}//endwhile
if(i Countaa)
{//如果i Countaa,即數(shù)組m[i]中的元數(shù)個數(shù)較少,
//則把n[j]中的剩余元素,都付給l[]。
while(j =Countbb)
{
l[k]=n[j];
j++;
k++;
}//endwhile
}//endif
if(j Countbb)
{//如果j Countbb,即數(shù)組n[i]中的元數(shù)個數(shù)較少,
//則把m[j]中的剩余元素,都付給l[]。
while(i =Countaa)
{
l[k]=m[i];
i++;
k++;
}//endwhile
}//endif
return k;//返回生成的數(shù)組的元數(shù)個數(shù)
}//end BuCountbbleSort
int JiaoJi(int m[],int n[],int l[],int Countaa,int Countbb)
{//求集合的交集
///////////////////////////////////
//消除數(shù)組m[]中的重復(fù)元素
int w,x,y;
for(w=0;w =Countaa;w++)
{
for(x=w+1;x =Countaa;x++)
{
if(m[w]==m[x])
{
Countaa--;
for(y=x;y =Countaa;y++)
{
m[y]=m[y+1];
}//endfor
x--;
}//endif
}//endfor
}//endfor
/*
//測試消除數(shù)組中的重復(fù)元素的效果用下列循環(huán)輸出
int z;
for(z=0;z =Countaa;z++)
{
printf("%d",m[z]);
}
printf("\n");
*/
//消除結(jié)束
///////////////////////////////////
///////////////////////////////////
//求交集
int i=0,j=0,k=0;
while(i =Countaa)
{
for(j=0;j =Countbb;j++)
{//用集合的第一個元素分別和另一個集合的各元素相比較
//然后再用第二個元素(直到最后一個元素)和另一個集合的各元素相比較
if(m[i]==n[j])
{//如果有相同的就保存到l[]中,這樣同時消掉了n[]中的重復(fù)元素
l[k]=m[i];
k++;
break;
}//endif
}//endfor
i++;
}//endwhile
//求交集結(jié)束
//////////////////////////////////
return k;
}
void main()
{
int a[1000], b[1000],c[2000];
int exchange=0;
int i,CountA,CountB,CountC;
printf("input a\n");
for(i=0;i =1000;i++)
{
scanf("%d", a[i]);
if(a[i]==-9999)
break;
}//endfor
CountA=i-1;
BuCountbbleSort(a,CountA);//先將集合A排序
printf("\ninput b\n");
for(i=0;i =1000;i++)
{
scanf("%d", b[i]);
if(b[i]==-9999)
break;
}//endfor
CountB=i-1;
BuCountbbleSort(b,CountB);//集合B排序
// CountC=BingJi(a,b,c,CountA,CountB);
CountC=JiaoJi(a,b,c,CountA,CountB);
printf("\n\n");
for(i=0;i =CountC-1;i++)
{
printf("%d ",c[i]);
}
printf("\n");
}