71328
集合Aと集合Bの差集合を求めるプログラムは作成できたのですが、複数の差集合を求めるプログラムが作成できません。

例えば集合A{0,1,2,3,4,5,6,7,8,9}と集合B{0,2,4,6,8,10,12,14,16,18}の2つが存在するとして、  
その差集合A-B={1,3,5,7,9}のような結果となるプログラムは以下のように作成しました

```

    #include <stdio.h>
    
    /* size個 のデータが入っている配列を 配列の先頭から順に出力する */
    void printIntArray(int a[], int size)
    {
        int i;
        for(i=0;i<size;i=i+1) {
            printf("%d ", a[i]);
        }
        printf("\n");   
    }
    
    /* na個 のデータが入っている集合に x と等しい要素があるかどうかを判定する \ */
    int memberOf(int x, int a[], int na)
    {
        int i,result=0;
        for(i=0;i<na;i=i+1) {
            if (x==a[i]) {
                result = 1;
            }
        }
        return result;
    
    }
    
    // 集合a と集合b の和集合を集合c として求める
    // na, nb は，集合a, b の要素数
    // 返り値は，集合c の要素数
    int diff(int a[], int na, int b[], int nb, int c[]) {
        int i, k;
        k = 0;
    
        // a を順に走査
        for (i = 0; i < na; i = i + 1) {
    
            // a[i] が条件を満たすならば
            if ( !memberOf(a[i], b, nb) ) {
    
                // c に追加
                c[k] = a[i];
                k = k + 1;
            }
        }
        return k;
    }
    
    int main(void)
    {
        int SA[1024] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int SB[1024] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18};
        int SC[1024] = {};
        int length=diff(SA,10,SB,10,SC);
    
        printf("集合A: \n");
        printIntArray(SA, 10);
        printf("集合B: \n");
        printIntArray(SB, 10);
    
        printf("集合A-B: \n");
        printIntArray(SC, length);
    
        return 0;
    }
    
```

しかし、全体集合U={0,1,2,3,4,5,6,7,8,9},A={1,3,5,7,9},B={1,2,3,4,5},C={0,2,4,6,8}となったとき、  
A、B、Cの補集合を求めるプログラムを作成する方法がわかりません。  
(複数の差集合を求めることができません）

```

    #include <stdio.h>
    
    /* size個 のデータが入っている配列を 配列の先頭から順に出力する */
    void printIntArray(int a[], int size)
    {
        int i;
        for(i=0;i<size;i=i+1) {
            printf("%d ", a[i]);
        }
        printf("\n");   
    }
    
    /* na個 のデータが入っている集合に x と等しい要素があるかどうかを判定する \ */
    int memberOf(int x, int a[], int na)
    {
        int i,result=0;
        for(i=0;i<na;i=i+1) {
            if (x==a[i]) {
                result = 1;
            }
        }
        return result;
    
    }
    
    // 集合a と集合b の和集合を集合c として求める
    // na, nb は，集合a, b の要素数
    // 返り値は，集合c の要素数
    int diff(int a[], int na, int b[], int nb, int c[]) {
        int i, k;
        k = 0;
    
        // a を順に走査
        for (i = 0; i < na; i = i + 1) {
    
            // a[i] が条件を満たすならば
            if ( !memberOf(a[i], b, nb) ) {
    
                // c に追加
                c[k] = a[i];
                k = k + 1;
            }
        }
        return k;
    }
    
    int main(void)
    {
        int SU[1024] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int SA[1024] = { 1, 3, 5, 7, 9};
        int SB[1024] = { 1, 2, 3, 4, 5};
        int SC[1024] = { 0, 2, 4, 6, 8};
        int SD[1024] = { }; 
        int length=diff(SU,10,SA,5,SD);
        int length1=diff(SU,10,SB,5,SD);
        int lenght2=diff(SU,10,SC,5,SD);
    
        printf("全体集合U: \n");
        printIntArray(SU, 10);
        printf("集合A: \n");
        printIntArray(SA, 5);
        printf("集合B: \n");
        printIntArray(SB, 5);
        printf("集合C: \n");
        printIntArray(SC, 5);
        printf("Aの補集合: \n");
        printIntArray(SD, length);
        printf("Bの補集合: \n");
        printIntArray(SD, length1);
        printf("Cの補集合: \n");
        printIntArray(SD, lenght2);
    
        return 0;
    }
    
```

```

    $ ./a.out
    全体集合U: 
    0 1 2 3 4 5 6 7 8 9 
    集合A: 
    1 3 5 7 9 
    集合B: 
    1 2 3 4 5 
    集合C: 
    0 2 4 6 8 
    Aの補集合: 
    1 3 5 7 9 
    Bの補集合: 
    1 3 5 7 9 
    Cの補集合: 
    1 3 5 7 9 
    
```

なぜ、A,B,Cの補集合がすべて同じ結果で出力されるのでしょうか。
CC BY-SA 4.0
2020-10-19T12:00:39.190
71327
2020-10-19T12:35:33.660
2020-10-19T12:14:46.253
3060
41837
question
c
複数の差集合を求めるプログラムがかけません
`SD`の内容を上書きしてしまったんです。

```

        int length=diff(SU,10,SA,5,SD);
        int length1=diff(SU,10,SB,5,SD);
        int lenght2=diff(SU,10,SC,5,SD);
    
```

複数の差集合を求めるには：

  * 三つの結果アレイを用いて、差集合を算出します。

```

        int SD[1024] = { }; 
        int SD1[1024] = { };
        int SD2[1024] = { };
        int length=diff(SU,10,SA,5,SD);
        int length1=diff(SU,10,SB,5,SD1);
        int lenght2=diff(SU,10,SC,5,SD2);
        （略）
        printf("Aの補集合: \n");
        printIntArray(SD, length);
        printf("Bの補集合: \n");
        printIntArray(SD1, length1);
        printf("Cの補集合: \n");
        printIntArray(SD2, lenght2);
    
```

  * 又は、同じ`SD`を兼用して、一つの差集合を計算、出力してから、次の差集合を計算します。

```

        int SD[1024] = { }; 
        int length=diff(SU,10,SA,5,SD);
        printf("Aの補集合: \n");
        printIntArray(SD, length);
    
        length=diff(SU,10,SB,5,SD);
        printf("Bの補集合: \n");
        printIntArray(SD, length);
    
        length=diff(SU,10,SC,5,SD);
        printf("Cの補集合: \n");
        printIntArray(SD, lenght);
    
```
CC BY-SA 4.0
2020-10-19T12:16:33.590
71328
2020-10-19T12:35:33.660
2020-10-19T12:35:33.660
41425
41425
71327
answer