C++ Третий массив минимально возможного размера, в котором нужно собрать элементы массива A, которые не включаются в массив B

121
24 января 2020, 03:10

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

void sort(int *arrN, int sizeN)
{
    int tmp = 0;
    for (int i = 0; i < sizeN; ++i)
    {
        for (int j = i + 1; j < sizeN; ++j)
        {
            if (arrN[j] < arrN[i])
            {
                tmp = arrN[j];
                arrN[j] = arrN[i];
                arrN[i] = tmp;
            }
        }
    }
}
int main()
{
int sizeA, sizeB;
        cout << "Введите размер первого массива: ";
        cin >> sizeA;
        cout << "Введите размер второго массива: ";
        cin >> sizeB;
        int *arrA = new int[sizeA];
        int *arrB = new int[sizeB];
        cout << "\n\nПервый массив: ";
        for (int x = 0; x < sizeA; x++)
        {
            arrA[x] = rand() % 9 + 1;
            cout << arrA[x] << " ";
        }
        cout << "\n\nВторой массив: ";
        for (int x = 0; x < sizeB; x++)
        {
            arrB[x] = rand() % 9 + 1;
            cout << arrB[x] << " ";
        }
        sort(arrA, sizeA);
        sort(arrB, sizeB);
        cout << "\n\nПервый массив (Отсортированный): ";
        for (int x = 0; x < sizeA; x++)
        {
            cout << arrA[x] << " ";
        }
        cout << "\n\nВторой массив (Отсортированный): ";
        for (int x = 0; x < sizeB; x++)
        {
            cout << arrB[x] << " ";
        }
        int *arrC = new int[sizeA < sizeB ? sizeA : sizeB];
        int sizeC = 0;
        for (int x = 0, y = 0; x < sizeA && y < sizeB; )
        {
            if (arrA[x] == arrB[y])
            {
                ++x;
            }
            else if (arrA[x] == arrB[y])
            {
                ++y;
            }
            else
            {
                arrC[sizeC] = arrA[x];
                sizeC++;
                x++; y++;
            }
        }
        cout << "\n\nТретий массив: ";
        for (int x = 0; x < sizeC; x++)
        {
            cout << arrC[x] << " ";
        }
        delete[] arrA;
        delete[] arrB;
        delete[] arrC;
}

Выводит как пример (при arrA[5], arrB[7]):

Первый массив: 3 1 6 1 5

Второй массив: 3 4 6 1 6 4 4

Первый массив (Отсортированный): 1 1 3 5 6

Второй массив (Отсортированный): 1 3 4 4 4 6 6

Третий массив: 3 5 6

Не могу определить ошибку.

Попробовал проверять элементы двумя циклами:

for (int x = 0, y = 0; x < sizeA && y < sizeB; )
        {
            for (int z = 0, n = 0; z < sizeA && n < sizeB; )
            {
                if (arrA[z] == arrB[n])
                {
                    ++z;
                }
                else if (arrA[z] == arrB[n])
                {
                    ++n;
                }
                else
                {
                    arrC[sizeC] = arrA[z];
                    sizeC++;
                    z++; n++;
                }
            }
            x++, y++;
        }

Но программа багается и неприличные звуки виндовса.

@Ibragim Magomedov

cout << "Даны два массива: А[M] и B[N] (M и  N вводятся с клавиатуры). Необходимо создать третий массив минимально возможного размера, в котором нужно собрать элементы массива A, которые не включаются в массив B\n\n";
        int sizeA, sizeB;
        cout << "Введите размер первого массива: ";
        cin >> sizeA;
        cout << "Введите размер второго массива: ";
        cin >> sizeB;
        int *arrA = new int[sizeA];
        int *arrB = new int[sizeB];
        cout << "\n\nПервый массив: ";
        for (int x = 0; x < sizeA; x++)
        {
            arrA[x] = rand() % 9 + 1;
            cout << arrA[x] << " ";
        }
        cout << "\n\nВторой массив: ";
        for (int x = 0; x < sizeB; x++)
        {
            arrB[x] = rand() % 9 + 1;
            cout << arrB[x] << " ";
        }
        sort(arrA, sizeA);
        sort(arrB, sizeB);
        cout << "\n\nПервый массив (Отсортированный): ";
        for (int x = 0; x < sizeA; x++)
        {
            cout << arrA[x] << " ";
        }
        cout << "\n\nВторой массив (Отсортированный): ";
        for (int x = 0; x < sizeB; x++)
        {
            cout << arrB[x] << " ";
        }
        int *arrC = new int[sizeA < sizeB ? sizeA : sizeB];
        int sizeC = 0;
        bool no_write = false;
        for (int a = 0, c = 0; a < sizeA; a++)
        {
            for (int b = 0; b < sizeB; b++)
                if (arrA[a] == arrB[b])
                {
                    no_write = true;
                    break;
                }
            if (no_write = false)
                if (arrC[c] != arrA[a])
                {
                    arrC[c] = arrA[a];
                    c++;
                }
                else no_write = true;
        }
        cout << "\n\nТретий массив: ";
        for (int x = 0; x < sizeC; x++)
        {
            cout << arrC[x] << " ";
        }
        delete[] arrA;
        delete[] arrB;
        delete[] arrC;

Исправил свой код и вот готовый рабочий вариант.

{
        cout << "Даны два массива: А[M] и B[N] (M и  N вводятся с клавиатуры). Необходимо создать третий массив минимально возможного размера, в котором нужно собрать элементы массива A, которые не включаются в массив B\n\n";
        int sizeA, sizeB;
        cout << "Введите размер первого массива: ";
        cin >> sizeA;
        cout << "Введите размер второго массива: ";
        cin >> sizeB;
        int *arrA = new int[sizeA];
        int *arrB = new int[sizeB];
        cout << "\n\nПервый массив: ";
        for (int x = 0; x < sizeA; x++)
        {
            arrA[x] = rand() % 9 + 1;
            cout << arrA[x] << " ";
        }
        cout << "\n\nВторой массив: ";
        for (int x = 0; x < sizeB; x++)
        {
            arrB[x] = rand() % 9 + 1;
            cout << arrB[x] << " ";
        }
        sort(arrA, sizeA);
        sort(arrB, sizeB);
        cout << "\n\nПервый массив (Отсортированный): ";
        for (int x = 0; x < sizeA; x++)
        {
            cout << arrA[x] << " ";
        }
        cout << "\n\nВторой массив (Отсортированный): ";
        for (int x = 0; x < sizeB; x++)
        {
            cout << arrB[x] << " ";
        }
        int *arrC = new int[sizeA < sizeB ? sizeA : sizeB];
        int sizeC = 0;
        cout << endl << endl << endl;
        bool flag;
        for (int x = 0; x < sizeA; x++)
        {
            flag = false;
            for (int y = 0; y < sizeB; y++)
            {
                if (arrA[x] == arrB[y])
                {
                    flag = true;
                    break;
                }
            }
            if (flag == false)
            {
                arrC[sizeC] = arrA[x];
                sizeC++;
            }
        }
        cout << "\n\nТретий массив: ";
        for (int x = 0; x < sizeC; x++)
        {
            cout << arrC[x] << " ";
        }
        delete[] arrA;
        delete[] arrB;
        delete[] arrC;
    }
Answer 1

так понимаю вы имели ввиду разность множеств, код ниже можете попробовать (работает в отсортированных множествах)

int* subtract(int *a, int *b, int m, int n, int &k)
{
    int i(0); // индекс для а
    int j(0); // индекс для b
    int *buf = new int[m];
    while (i < m)
    {
        if (j == n)
        {
            buf[k] = a[i];
            ++i;
            ++k;
        }
        else if (a[i] == b[j])
        {
            ++i;
            ++j;
        }
        else if (a[i] < b[j])
        {
            buf[k] = a[i];
            ++i;
            ++k;
        }
        else if (a[i] > b[j])
        {
            buf[k] = a[i];
            ++j;
            ++k;
        }
    }
    return buf;
}
void read(int *a, int n)
{
    for (int i = 0;i < n;++i)
    {
    cin >> a[i];
    }
}
void write(int *a, int n)
{
    for (int i = 0;i < n;++i)
    {
    cout << a[i] << ' ';
    }
}
int main()
{
    int m, n;
    cin >> m >> n;
    int *a = new int[m];
    int *b = new int[n];
    read(a, m);
    read(b, n);
    int k = 0;
    int *c = subtract(a, b, m, n, k);
    write(c, k);
    delete[] a;
    delete[] b;
    delete[] c;
    return 0;
}
Answer 2

В вашем варианте кода есть некоторые непонятки, например два одинаковых условия, где второе никогда не выполнится и т.д.

В результате, итоговый массив заполнялся всякими разными рандомными элементами.

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

Вот рабочий алгоритм, который ближе к вашему коду:

 for (int x = 0, y = 0; x < sizeA && y < sizeB; ) 
{ 
	if (arrA[x] > arrB[y]) y++; else if (arrA[x] == arrB[y]) { x++; y++; } 
	else 
	{ 
		arrC[sizeC] = arrA[x]; 
		sizeC++; 
		x++; 
	} 
	 
}

Answer 3

Простым поэлементным сравнением не пробовали? Должно по идеи помочь.

bool no_write = false;
for (int a = 0, int c = 0; a < size(arrayA); a++)
{
    for (int b = 0; b < size(arrayb); b++)
        if(arrayA[a] == arrayB[b])
        {
           no_write = true
           break;
        }
    if(no_write = false)
        if(arrayC[c] != arrayA[a])
        {
            arrayC[c] = arrayA[a];
            c++;
        }
    else no_write = true;
}
READ ALSO
Как хранить информацию о классах

Как хранить информацию о классах

Как сохранить в цикле имена классов и классов-родителей так, что бы при необходимости вывести какой то класс по имени так: сперва выводились...

108
Вывод -nan(ind) [дубликат]

Вывод -nan(ind) [дубликат]

Почему выводит вместо результата -nan(ind)?

111
Segmentation fault при dynamic_cast

Segmentation fault при dynamic_cast

Имеется freebsd 12, собранный из портов Qt5 и GCC7Любое написанное приложение падает при dynamic_cast

106
Проблема с “FMeshDrawSingleShaderBindings”

Проблема с “FMeshDrawSingleShaderBindings”

VS2017 жалуется на "FMeshDrawSingleShaderBindings не определён"В UE4 всё компилируется без проблем и объект создаётся на сцене

123