Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 09.10.2017
Сообщений: 33
1

Сформировать третий массив, состоящий из тех элементов, которые присутствуют в двух исходных

10.07.2018, 22:06. Показов 5078. Ответов 8
Метки нет (Все метки)

Задача:
  • Даны два массива. Сформировать третий массив, состоящий из тех элементов, которые присутствуют в обоих массивах;

Подскажите алгоритм пожалуйста. Пробовал сначала посчитать элементы, встречающиеся в 1 и 2 массивах. потом создать 3й массив нужного размера, заполнить его, а после, в попытке убрать повторяющиеся элементы запутался. Я правильно делаю, или лучше как то по другому?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2018, 22:06
Ответы с готовыми решениями:

Из упорядоченных по возрастанию значений двух исходных массивов сформировать третий массив
Добрый день, друзья, очень нужна ваша помощь. Задача: Ввести два массива действительных чисел,...

Сформировать массив S, состоящий из одинаковых элементов исходных массивов
2 массива X, Y, каждый из 10 эл-в. Сформировать массив S, состоящий из одинаковых эл-в исходных...

Сформировать массив Y из тех элементов массива Х, которые больше суммы двух соседних предыдущих
Сформировать массив Y из тех элементов массива Х, которые больше суммы двух соседних предыдущих...

Сформировать новый массив B, состоящий из элементов массива A, которые превышают X
Если по заданию дано число массив или массивы, то их значения получать от пользователя и при...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
8
1118 / 849 / 392
Регистрация: 30.10.2017
Сообщений: 2,378
10.07.2018, 22:10 2
Цитата Сообщение от vlad697704 Посмотреть сообщение
а после, в попытке убрать повторяющиеся элементы запутался
Как я понимаю порядок неважен. Отсортируйте два массива, потом третий из них не составит труда собрать одним циклом.

Цитата Сообщение от vlad697704 Посмотреть сообщение
Пробовал сначала посчитать элементы, встречающиеся в 1 и 2 массивах. потом создать 3й массив нужного размера
Если использовать vector, все гораздо проще, там размер заранее задавать не нужно.
0
1742 / 1335 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
10.07.2018, 22:23 3
Как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <vector>
#include <random>
#include <algorithm>
#include <iterator>
 
void Gen(std::vector<int> &a) {
    std::default_random_engine gen{ std::random_device()() };
    std::uniform_int_distribution<> dist(-5, 5);
    std::generate(a.begin(), a.end(), [&dist, &gen] {return dist(gen); });
}
 
void Print(std::vector<int> a) {
    std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n";
}
 
int main()
{
    std::vector<int> a(6), b(6);
    Gen(a); Gen(b);
    Print(a); Print(b);
    std::vector<int> c = a;
    for (int e : b) c.push_back(e);
    std::sort(c.begin(), c.end());
    c.erase(std::unique(c.begin(), c.end()), c.end());
    Print(c);
}
0
0 / 0 / 0
Регистрация: 09.10.2017
Сообщений: 33
10.07.2018, 22:40  [ТС] 4
Цитата Сообщение от Hitoku Посмотреть сообщение
Как вариант
Я еще не дошел до векторов, сначала хочу понять как без них сделать.

Добавлено через 4 минуты
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Как я понимаю порядок неважен. Отсортируйте два массива, потом третий из них не составит труда собрать одним циклом.
Можно по подробнее?
0
1118 / 849 / 392
Регистрация: 30.10.2017
Сообщений: 2,378
10.07.2018, 23:05 5
Цитата Сообщение от vlad697704 Посмотреть сообщение
Можно по подробнее?
После сортировки двух массивов что-нибудь типа такого.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for (int i = 0, j = 0, k = 0; i < SIZE_A || j < SIZE_B; )
{
    if (j == SIZE_B || i < SIZE_A && a[i] < b[j])
    {
        if (k == 0 || a[i] != c[k - 1])
        {
            c[k] = a[i];
            ++k;
        }
 
        ++i;
    }
    else
    {
        if (k == 0 || b[j] != c[k - 1])
        {
            c[k] = b[j];
            ++k;
        }
 
        ++j;
    }
}
Добавлено через 2 минуты
vlad697704, чуть поправил код, добавил проверку на уникальность.
1
5920 / 4022 / 2331
Регистрация: 18.12.2017
Сообщений: 12,590
10.07.2018, 23:55 6
Лучший ответ Сообщение было отмечено vlad697704 как решение

Решение

Цитата Сообщение от vlad697704 Посмотреть сообщение
Я еще не дошел до векторов, сначала хочу понять как без них сделать.
если решать формально (оставляя в новом массиве повторяющиеся элементы) можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <ctime>
using namespace std;
 
void Set (double *x, int N)
{
    for (int i = 0; i < N; i++)      
      x[i]=rand()%9 + 1;      
}
    
void Print (double *x, int N)
{
    for (int i = 0; i < N; i++)      
      cout <<x[i]<<" ";      
      cout <<endl;
}  
 
int main()
{
    srand((int)time(0));
    int n, m, k=0;
    cout <<"Size a="; cin >>n;
    cout <<"Size b="; cin >>m;
    
    double*a = new double[n];
    double*b = new double[m];
    
    Set (a, n);
    Print (a, n);
    Set (b, m);
    Print (b, m);   
    
    for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
    if (a[i]==b[j]) k++;
    
    double*c = new double[k];
    
    k=0;
    for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
    if (a[i]==b[j]) c[k++]=a[i];
    
    Print (c, k);
    
    delete[]a;
    delete[]b;
    delete[]c;
system("pause");
return 0;
}
если нужны только уникальные элементы из нового массива можно его отсортировать и повторяющиеся убрать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <ctime>
using namespace std;
 
int main()
{
    srand((int)time(0));
    int k, p=0;
    cout <<"k="; cin >>k;
 
    double*c = new double[k];
 
    for (int i = 0; i < k; i++)
      {
      c[i]=rand()%9 + 1;
      cout <<c[i]<<" ";
      }
    cout <<endl;
    
    for (int i=0; i<k-1; i++)    
    for (int j=0; j<k-i-1; j++)        
      if (c[j] > c[j+1]) swap(c[j], c[j+1]);
      
    for(int i=0; i<k; i++)
    {
       p++;        
       while(i<k-1 && c[i]==c[i+1])
       {
       i++;
       }
    } 
    
    double*d = new double[p];  
    
    p=0;  
    for(int i=0; i<k; i++)
    {
       d[p++]=c[i];        
       while(i<k-1 && c[i]==c[i+1])
       {
       i++;
       }
    } 
    delete[]c;
    c=d;
    
    for (int i = 0; i < p; i++)     
      cout <<c[i]<<" ";      
      cout <<endl;
    
    delete[]d;
system("pause");
return 0;
}
можете объединить две программы в одну
1
0 / 0 / 0
Регистрация: 09.10.2017
Сообщений: 33
11.07.2018, 12:11  [ТС] 7
на третий день все таки получилось, спасибо всем)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
int main() {
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
 
 
    int
        size = 10,
        size3 = 0,
        sizenew = 1,
        k = 0,
        *array1 = new int[size],
        *array2 = new int[size],
        *array3 = new int[1];
 
    FillArray1(size, array1);
    FillArray1(size, array2);
    ShowArray(size, array1);
    ShowArray(size, array2);
    //считаем размер 3 массива
    for (int i1 = 0; i1 < size; i1++) 
        for (int j2 = 0; j2 < size; j2++) 
            if (array1[i1] == array2[j2]) {
                size3++;
            }
    //создаем 3 массив
    array3 = new int[size3]();
    //заполняем 3 массив
    for (int i1 = 0, k = 0; i1 < size; i1++)
        for (int j2 = 0; j2 < size; j2++)
            if (array1[i1] == array2[j2]) {
                array3[k] = array1[i1];
                k++;
            }
    //сортируем 3 массив
    for (int i = 0; i < size3; i++) {
        for (int i = 0; i < size3; i++) {
            if (array3[i] > array3[i + 1] && i != size3 - 1) {
                swap(array3[i], array3[i + 1]);
            }
        }
    }
    ShowArray(size3, array3);
    //счиатем размер 4 массива без повторений
    for (int i = 0; i < size3; i++) {
        if (array3[i] != array3[i + 1] && i != size3 - 1) {
            sizenew++;
        }
    }
    //создаем 4 массив
    int* newarray = new int[sizenew];
    k = 0;
    //заполняем 4 массив
    for (int i = 0; i < size3; i++) {
        newarray[k++] = array3[i];
        while (array3[i] == array3[i + 1] && i < size3 - 1) {
            i++;
        }
    }
 
    size3 = sizenew;
    delete[]array1;
    delete[]array2;
    delete[]array3;
    array3 = newarray;
 
    ShowArray(size3, array3);
 
    system("pause");
    return 0;
}
0
5920 / 4022 / 2331
Регистрация: 18.12.2017
Сообщений: 12,590
11.07.2018, 13:25 8
Лучший ответ Сообщение было отмечено vlad697704 как решение

Решение

vlad697704, навскидку:
обратите внимание что по условию массивы не обязательно целочисленные
одинаковый размер массивов (не соотв. условию)
*array3 = new int[1]; - это строка не нужна - просто создаёте массив там где это нужно
строки 35-36 одинаковая переменная в циклах
в сортировке лишнее условие
1
5 / 5 / 0
Регистрация: 01.08.2019
Сообщений: 6
08.08.2019, 18:35 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;
int main()
{
    const int size = 5, fullsize=10;
    int ar1[size], ar2[size],fullar[fullsize];
    cout << "Enter the random numbers to fill first array:\n";
    for (int i = 0; i < size; i++)
    {
        cout << "ar1[" << i << "] = ";
        cin >> ar1[i];
    }
    cout << "Enter the random numbers to fill second array:\n";
    for (int i = 0; i < size; i++)
    {
        cout << "ar2[" << i << "] = ";
        cin >> ar2[i];
    }
    cout << "\nTask a:\n";
    for (int i = 0; i < size; i++)
    {
        fullar[i] = ar1[i];
        cout << fullar[i] << endl;
        fullar[i + 1] = ar2[i];
        cout << fullar[i + 1] << endl;
    }
    cout << "\nTask b:\n";
    for (int i = 0; i < size; i++)
    {
        fullar[i] = ar1[i];
        cout << fullar[i] << endl;
    }
    for (int i = 0; i < size; i++)
    {
    fullar[i+size] = ar2[i];
    cout << fullar[i+size] << endl;
    }
    cout << "\n\nPotapenko A.V.\n";
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2019, 18:35

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Сформировать матрицы одномерный массив, состоящий из элементов, которые лежат в интервале (-3; 5]
С++ дано целочисленную прямоугольную матрицу, сформировать из неё одномерный массив, который...

Сформировать массив из тех его положительных элементов, которые меньше, чем логарифм этих элементов
Добрый вечер) Ребят, в одном из экзаменационных билетов есть вот такая задача: Используя функцию...

Сформировать одномерный массив из тех элементов заданной матрицы, которые удовлетворяют условию
дан двумерный массив. сформировать одномерный массив только из четных элементов двухмерного массива

Сформировать новый массив из тех элементов массива А, которые превосходят свой номер на 10
Приветствую! Нужна помощь с решением задачи в С++. Вообще не понимаю, как это решается. Буду рад...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.