Разница 2 наборов сохраняется в массивах - C ++ - PullRequest
0 голосов
/ 27 октября 2018

Рассмотрим два набора, сохраненных в двух массивах.Найти объединение, пересечение и разность (относительное дополнение) двух множеств.

Мне удалось решить объединение и пересечение, но разница доставляет мне трудные времена.Есть намеки?И, если возможно, делайте это как можно проще, без функций или более сложных аспектов, потому что я новичок, и мне еще нужно многому научиться.

Заранее спасибо!

#include <iostream>

using namespace std;


int main()
{
int v1[100], v2[100], u[200], intersection[100], d[100];
unsigned int v1_length, v2_length, i, j, OK = 0, union_length;

cout << "Enter the number of elements of the first array:" << " ";
cin >> v1_length;

cout << "Enter the elements of the first array:" << '\n';

for (i = 0; i < v1_length; i++)
    cin >> v1[i];

cout << "Enter the number of elements of the second array:" << " ";
cin >> v2_length;

cout << "Enter the elements of the second array:" << '\n';

for (i = 0; i < v2_length; i++)
    cin >> v2[i];


//Union

union_length = v1_length;

for (i = 0; i < v1_length; i++)
    u[i] = v1[i];

for (i = 0; i < v2_length; i++)
{
    int ok = 0;
    for (j = 0; !ok && j < v1_length; j++)
        if (v1[j] == v2[i])
            ok = 1;

    if (!ok)
    {
        u[union_length] = v2[i];
        union_length++;
    }
}

cout << "The union of the two sets contained in the arrays is: ";

for (i = 0; i < union_length; i++)
    cout << u[i] << " ";

cout << '\n';


//Intersection

unsigned int k = 0;

cout << "The intersection of the two sets contained in the arrays is: ";

for (i = 0; i < v1_length; i++)
    for (j = 0; j < v2_length; j++)
        if (v1[i] == v2[j])
        {
            intersection[k] = v1[i];
            k++;
        }

for (i = 0; i < k; i++)
    cout << intersection[i] << " ";

cout << '\n';


//Difference

unsigned int l = 0, OK2 = 0;

cout << "The difference of the two sets contained in the arrays is: ";

for (i = 0; i < v1_length; i++)
{
    for (j = 0; j < v2_length; j++)
    {
        if (v1[i] == v2[j])
            OK2 = 1;
        if (!OK2)
        {
            d[l] = v1[i];
            l++;
        }
    }
}

for (i = 0; i < l; i++)
    cout << d[i] << " ";

cout << '\n';

return 0; 
}

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Кажется, что пересечение - лучшее место для начала. Вы хотите, чтобы элементы, которые только в, появлялись в одном из двух массивов, верно?

Итак, для внутреннего цикла вам нужно сравнить все элементы. Затем, если совпадений не найдено, у вас есть уникальный элемент.

Вам необходимо добавить фигурные скобки {} в цикл for. Я знаю, что фигурные скобки иногда отвлекают, но со временем вы, вероятно, найдете более безопасным почти всегда включать их, чтобы избежать путаницы.

for (i = 0; i < v1_length; i++)
    for (j = 0; j < v2_length; j++) {
        if (v1[i] == v2[j]){
            break; // this item is not unique
        } else if(j == v2_length - 1){
            d[l] = v1[i];  // This is the unique one, add it to the answer array
            l++;
        }

    }

for (i = 0; i < l; i++)
    cout << intersection[l] << " ";

cout << '\n';
0 голосов
/ 27 октября 2018

Вы на правильном пути!

Вы делаете несколько вещей неправильно.Вот некоторые исправления, которые вы можете попробовать:

  1. Только установите OK2 на 0 один раз для внутреннего цикла
  2. Сброс OK2 на 0 в концеВнутренний цикл
  3. Вставка в d выполняется только после завершения внутреннего цикла

В качестве оптимизации рассмотрим break ing после того, как для OK2 задано 1, как вы знаете в тот момент, он никогда не может быть установлен на 0 для текущего значения, на которое указывает внешний цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...