全國計算機等級考試C語言上機考試專業(yè)輔導(dǎo)二

字號:

編一C程序,它能讀入集合A的一串整數(shù)(以-9999為結(jié)束標記,整數(shù)個數(shù)小于1000) 和集合B的一串整數(shù)(以-9999為結(jié)束標記,整數(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
    #include
    void BuCountbbleSort(int r[],int n)
    {//冒泡排序
    int i,j,k;
    int exchange;
    for(i=0;i<=n;i++)
    {
    exchange=0;
    for(j=n-1;j>=i;j--)
    if(r[j+1] {
    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] {//如果 m[i] l[k]=m[i];
    k++;
    i++;
    }//endif
    else if(m[i]>n[j]) 中國公務(wù)網(wǎng) 2004-5-27 22:11:50
    {//如果 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);
    }