1

Тема: Перетин двох множин. (С++)

Дано два масиви: А [m] та B [n] (m і n вводяться з клавіатури). Необхідно створити третій масив мінімально можливого розміру, в якому потрібно зібрати спільні елементи двох перших масивів без повторень.
а ось мій код (там все добре тільки функція збір не працює(повина заповнити 3 масив))

#include <iostream>
#include <time.h>
using namespace std;
void set(int *ar, int n);
void print(int *ar, int n);
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a);
void main() {
    srand(time(0));
    int n, m, a = 1;
    cin >> n;
    int* ar = new int[n];
    cin >> m;
    int* ar1 = new int[m];
    int* ar2 = new int[a];
    set(ar, n);
    print(ar, n);
    cout << "\n";
    set(ar1, m);
    print(ar1, m);
    cout << "\n";
    ar2 = zbir(ar, n, ar, m, ar2, &a);
    print(ar2, a);
    cout << "\n";
    system("pause");
}
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a) {
    int* p = new int[*a];
        for (int i = 0; i < n; i++) {
            if ((*ar + n) == (*ar1 + m)) {
                *(p + *a) = (*ar + n);
                *a++;
            }
        }
        for (int i = 0; i < m; i++) {
            if ((*ar1 + m) == (*ar + n)) {
                *(p + *a) = (*ar1 + m);
                *a++;
            }
        }
        a--;
    delete[] ar2;
    return p;
}
void set(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        *(ar + i) = rand() % 101 - 50;
    }
}
void print(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        cout << *(ar + i) << " ";
    }
    cout << "\n";
}

2 Востаннє редагувалося Parsifal (25.09.2018 13:08:32)

Re: Перетин двох множин. (С++)

і якщо компілювати коли є функція збір то помилка є

3

Re: Перетин двох множин. (С++)

vector-и використовувати заборонено?
Велике прохання: замініть усі ці *(ar + i) на ar[ i], вам самому читати буде легше. І назви змінним якось би підправити - незрозуміло, що n, m та a - розміри ar, ar1 та ar2 (чи чого там).
Ну і алгоритм - вам треба або спершу відсортувати масиви, або робити вкладені цикли для порівняння усіх елементів одного масива з усіма елементами другого.

4

Re: Перетин двох множин. (С++)

вектори ще не вчив ,*(ar + i) я писав тому що викладач говорив так роби щоб краще зрозуміти вказівники

5

Re: Перетин двох множин. (С++)

Parsifal написав:

викладач говорив так роби

Судячи з 

           if ((*ar + n) == (*ar1 + m)) {

- не допомогло.

Подякували: leofun011

6

Re: Перетин двох множин. (С++)

але не через це помилка компіляції

7

Re: Перетин двох множин. (С++)

ось сортування але всерівно помилка

#include <iostream>
#include <time.h>
using namespace std;
void set(int *ar, int n);
void print(int *ar, int n);
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a);
void sort(int *ar, int n);
void main() {
    srand(time(0));
    int n, m, a = 1;
    cin >> n;
    int* ar = new int[n];
    cin >> m;
    int* ar1 = new int[m];
    int* ar2 = new int[a] { rand() % 101 - 50 };
    set(ar, n);
    print(ar, n);
    cout << "\n";
    set(ar1, m);
    print(ar1, m);
    cout << "\n";
    sort(ar, n);
    sort(ar1, m);
    ar2 = zbir(ar, n, ar, m, ar2, &a);
    print(ar2, a);
    cout << "\n";
    system("pause");
}
void sort(int *ar, int n) {
    int tmp = 0;
    for (int i = 0; i < n; i++) {
        for (int j = n - 1; j > i; j--) {
            if (*(ar + j - 1) > *(ar + j)) {
                tmp = ar[j];
                *(ar + j) = *(ar + j - 1);
                *(ar + j - 1) = tmp;
            }
        }
    }
}
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a) {
    int* p = new int[*a]{ rand() % 101 - 50 };
    for (int i = 0; i < n; i++) {
        if (*(ar + n) == *(ar1 + n)) {
            *(p + *a) = *(ar + n);
            *a++;
        }
    }
    for (int i = 0; i < m; i++) {
        if (*(ar1 + m) == *(ar + m)) {
            *(p + *a) = *(ar1 + m);
            *a++;
        }
    }
    a--;
    delete[] ar2;
    return p;
}
void set(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        *(ar + i) = rand() % 101 - 50;
    }
}
void print(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        cout << *(ar + i) << " ";
    }
    cout << "\n";
}

8

Re: Перетин двох множин. (С++)

ось кожен з кожним помилки немає але і не так як треба працює

#include <iostream>
#include <time.h>
using namespace std;
void set(int *ar, int n);
void print(int *ar, int n);
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a);
void sort(int *ar, int n);
void main() {
    srand(time(0));
    int n, m, a = 1;
    cin >> n;
    int* ar = new int[n];
    cin >> m;
    int* ar1 = new int[m];
    int* ar2 = new int[a] { rand() % 101 - 50 };
    set(ar, n);
    print(ar, n);
    cout << "\n";
    set(ar1, m);
    print(ar1, m);
    cout << "\n";
    sort(ar, n);
    sort(ar1, m);
    ar2 = zbir(ar, n, ar, m, ar2, &a);
    print(ar2, a);
    cout << "\n";
    system("pause");
}
void sort(int *ar, int n) {
    int tmp = 0;
    for (int i = 0; i < n; i++) {
        for (int j = n - 1; j > i; j--) {
            if (*(ar + j - 1) > *(ar + j)) {
                tmp = ar[j];
                *(ar + j) = *(ar + j - 1);
                *(ar + j - 1) = tmp;
            }
        }
    }
}
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a) {
    int* p = new int[*a]{ rand() % 101 - 50 };
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (*(ar + j) == *(ar1 + m)) {
                *(p + *a) = *(ar + j);
                *a++;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (*(ar1 + j) == *(ar + n)) {
                *(p + *a) = *(ar + n);
                *a++;
            }
        }
    }
    a--;
    delete[] ar2;
    return p;
}
void set(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        *(ar + i) = rand() % 101 - 50;
    }
}
void print(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        cout << *(ar + i) << " ";
    }
    cout << "\n";
}

9

Re: Перетин двох множин. (С++)

хотя в кожному з кожним все не потрібно сортування

10

Re: Перетин двох множин. (С++)

ось з цим в функції збір треба щось зробити

#include <iostream>
#include <time.h>
using namespace std;
void set(int *ar, int n);
void print(int *ar, int n);
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a);
void main() {
    srand(time(0));
    int n, m, a = 1;
    cin >> n;
    int* ar = new int[n];
    cin >> m;
    int* ar1 = new int[m];
    int* ar2 = new int[a] { rand() % 101 - 50 };
    set(ar, n);
    print(ar, n);
    cout << "\n";
    set(ar1, m);
    print(ar1, m);
    cout << "\n";
    ar2 = zbir(ar, n, ar, m, ar2, &a);
    print(ar2, a);
    cout << "\n";
    system("pause");
}
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a) {
    int* p = new int[*a]{ rand() % 101 - 50 };
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (*(ar + j) == *(ar1 + m)) {
                *(p + *a) = *(ar + j);
                *a++;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (*(ar1 + j) == *(ar + n)) {
                *(p + *a) = *(ar + n);
                *a++;
            }
        }
    }
    *a--;
    delete[] ar2;
    return p;
}
void set(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        *(ar + i) = rand() % 101 - 50;
    }
}
void print(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        cout << *(ar + i) << " ";
    }
    cout << "\n";
}

11

Re: Перетин двох множин. (С++)

Чекайте. Я про помилку компіляції ще не бачив. І яка ж у вас помилка компіляції?
Ну і не так же тупо при сортуванні - там тоді один цикл по обох масивах, кожного разу рухаєтеся по тому, де поточний елемент менший, якщо однакові - додаєте в результат і рухаєтеся по обох.

12

Re: Перетин двох множин. (С++)

просто не компілює не пиши помилки тільки програма припинила роботу

13

Re: Перетин двох множин. (С++)

а якщо різна кількість елементів в масивах то як зібрати в 1?

14

Re: Перетин двох множин. (С++)

Для початку: спершу іде компіляція, потім зв'язування (лінкування), і тільки після цього програма може запуститися. Якщо була помилка компіляції - то програма не може не те, що припинити роботу, а й розпочати її. Тобто це помилка не компіляції, а часу виконання - десь у вас некоректні вказівники, швидше за все.
Спробуйте для початку зробити цю програму без вказівників, фіксованими масивами. Якщо вийде - переробіть на вказівники.
І продумайте спершу алгоритм - як саме з двох масивів один зібрати. Там нескладно, уявіть дві коробки із кубиками різних кольорів і як із них вибрати кольори, які є в обох коробках.

15

Re: Перетин двох множин. (С++)

тепер помилка програма припинила роботу при старті функції збір

#include <iostream>
#include <time.h>
using namespace std;
void set(int *ar, int n);
void print(int *ar, int n);
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a);
void main() {
    srand(time(0));
    int n, m, a = 1;
    cin >> n;
    int* ar = new int[n];
    cin >> m;
    int* ar1 = new int[m];
    int* ar2 = new int[a] { rand() % 101 - 50 };
    set(ar, n);
    print(ar, n);
    cout << "\n";
    set(ar1, m);
    print(ar1, m);
    cout << "\n";
    ar2 = zbir(ar, n, ar, m, ar2, &a);
    print(ar2, a);
    cout << "\n";
    system("pause");
}
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a) {
    int* p = new int[*a]{ 1 };
    for (int i = 0; i < n + m; i++) {
        for (int j = 0; j < n; j++) {
            if (*(ar + j) == *(ar1 + j)) {
                *(p + *a) = *(ar + j);
                *a++;
            }
        }
    }
    *a--;
    delete[] ar2;
    return p;
}
void set(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        *(ar + i) = rand() % 101 - 50;
    }
}
void print(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        cout << *(ar + i) << " ";
    }
    cout << "\n";
}

16

Re: Перетин двох множин. (С++)

int n, m, a = 1;
int* p = new int[*a]{ 1 };//p вказує на масив з 1 елементу
*(p + *a) = *(ar + j);//а ми скільки туди пхаємо?
*a++;

17

Re: Перетин двох множин. (С++)

потрібно мінімально можливого розміру

18

Re: Перетин двох множин. (С++)

тепер всі 0

#include <iostream>
#include <time.h>
using namespace std;
void set(int *ar, int n);
void print(int *ar, int n);
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a);
void main() {
    srand(time(0));
    int n, m;
    cin >> n;
    int* ar = new int[n];
    cin >> m;
    int a = n + m;
    int* ar1 = new int[m];
    int* ar2 = new int[a] { rand() % 101 - 50 };
    set(ar, n);
    print(ar, n);
    cout << "\n";
    set(ar1, m);
    print(ar1, m);
    cout << "\n";
    ar2 = zbir(ar, n, ar, m, ar2, &a);
    print(ar2, a);
    cout << "\n";
    system("pause");
}
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a) {
    int* p = new int[*a]{ rand() % 101 - 50 };
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (*(ar + j) == *(ar1 + m)) {
                *(p + *a) = *(ar + j);
                *a++;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (*(ar1 + j) == *(ar + n)) {
                *(p + *a) = *(ar + n);
                *a++;
            }
        }
    }
    *a--;
    delete[] ar2;
    return p;
}
void set(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        *(ar + i) = rand() % 101 - 50;
    }
}
void print(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        cout << *(ar + i) << " ";
    }
    cout << "\n";
}

19

Re: Перетин двох множин. (С++)

Тоді:
- або спершу знаходьте, скільки вам знадобиться елементів, виділяйте пам'ять і тоді вже шукайте самі елементи (двічі робити одну роботу);
- або кожного разу при додаванні елемента виділяйте нову пам'ять і копіюйте весь масив туди;
- або спершу виділяйте надмірну пам'ять, а потім - скільки треба і переносьте туди.

20

Re: Перетин двох множин. (С++)

всерівно щось не так

#include <iostream>
#include <time.h>
using namespace std;
void set(int *ar, int n);
void print(int *ar, int n);
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a);
int* func(int *ar, int *n);
void main() {
    srand(time(0));
    int n, m, a = 1;
    cin >> n;
    int* ar = new int[n];
    cin >> m;
    int* ar1 = new int[m];
    int* ar2 = new int[a] { rand() % 101 - 50 };
    set(ar, n);
    print(ar, n);
    cout << "\n";
    set(ar1, m);
    print(ar1, m);
    cout << "\n";
    ar2 = zbir(ar, n, ar, m, ar2, &a);
    print(ar2, a);
    cout << "\n";
    system("pause");
}
int* func(int *ar, int *n) {
    int* p = new int[*n + 1];
    for (int i = 0; i < *n; i++) {
        *(p + i) = *(ar + i);
    }
    delete[]ar;
    (*n)++;
    return p;
}
int* zbir(int *ar, int n, int *ar1, int m, int* ar2, int *a) {
    int a1 = 0, i = 0;
    for (int j = 0; j < n; j++) {
        if (*(ar + j) == *(ar1 + j)) {
            a1++;
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (*(ar1 + j) == *(ar + n)) {
                a1++;
            }
        }
    }
    *a = a1;
    int* p = new int[*a]{ 55 };
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (*(ar + j) == *(ar1 + m)) {
                *(p + *a) = *(ar + j);
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (*(ar1 + j) == *(ar + n)) {
                *(p + *a) = *(ar + n);
            }
        }
    }
    delete[] ar2;
    return p;
}
void set(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        *(ar + i) = rand() % 101 - 50;
    }
}
void print(int *ar, int n) {
    for (int i = 0; i < n; i++) {
        cout << *(ar + i) << " ";
    }
    cout << "\n";
}