Объединение и XOR двух наборов в C

#c #loops #set #c99

#c #циклы #множество #c99

Вопрос:

Программа пропускает один объект в наборе (массиве).

clang -ggdb3 -O0 -std=c99 -Wall -Werror prog.c -o prog

Вывод:

Исключающее или (XOR) для A и B: 1 9 10 (но должно быть: 1 2 9 10)

Объединение A и B: 1 3 6 9 10 (Но должно быть: 1 2 3 6 9 10)

Что не так с этой программой? Пожалуйста, помогите!

 #include <stdio.h>

int main(void)
{
int U[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int A[] = {2, 3, 6, 9};
int B[] = {1, 3, 6, 10};

int SizeOfU = sizeof(U) / sizeof(int);
int SizeOfA = sizeof(A) / sizeof(int);
int SizeOfB = sizeof(B) / sizeof(int);

printf("Exclusive or (XOR) of A and B: ");
for (int i = 0; i < SizeOfU; i  )
{
    for (int j = 0; j < SizeOfB; j  )
    {
        if ((A[j] != B[j]) amp;amp; ((U[i] == A[j]) || (U[i] == B[j])))
        {
          printf("%i ", U[i]);
          i  ;
          j = 0;
        }
    }
}
printf("n");

printf("Union of A and B: ");
for (int i = 0; i < SizeOfU; i  )
{
    for (int j = 0; j < SizeOfA; j  )
    {
        if ((U[i] == A[j]) || (U[i] == B[j]))
        {
            printf("%i ", U[i]);
            j = 0;
            i  ;
        }
    }
}
printf("n");

return 0;
}
  

Комментарии:

1. Вы хотите выполнить set xor пересечение массивов A и B . Итак, для чего тогда U должен использоваться массив? Тот же вопрос для объединения множеств?

2. Это просто часть из другой программы.

3. Но вы все равно ссылаетесь на U массив в своем коде. Я не уверен, пытаетесь ли вы выполнить трехсторонний XOR или что-то еще. Можете ли вы обновить свои вопросы и код?

4. A и B являются подмножествами U множества. И программа должна проверить, есть ли объект из набора A или B в наборе U, чтобы что-то вывести. Кстати, я понятия не имею, что писать в printf(); используя только A[j] и B[j] .

Ответ №1:

Ваша логика нарушена по нескольким причинам. Вы предполагаете, что целочисленные значения будут находиться в одном и том же индексе A и B. Вы действительно оцениваете только B. Неопределенное поведение, если длина A меньше B….

Для случая XOR подумайте об этом так: для каждого элемента в U найдите элементы, которые появляются в A или B, но не оба:

 for (int u = 0; i < SizeOfU; u  )
{
    int inA = 0;
    int inB = 0;
    for (int a = 0; a < SizeOfA; a  )
    {
         inA = (A[a] == U[u]);
         if (inA)
         {
             break;
         }
    }

    for (int b = 0; b < SizeOfB; b  )
    {
         inB = (B[b] == U[u]);
         if (inB)
         {
             break;
         }
    }

    if ((inA amp;amp; !inB) || (!inA amp;amp; inB))
    {
         printf("%d", i);
    }
}
printf("n");
  

Это решает проблему набора XOR. Я оставлю решение для случая OR в качестве упражнения для вас.