0 / 0 / 2
Регистрация: 15.12.2014
Сообщений: 121
1

Указатели на массивы. Указатели и функции

17.03.2015, 14:40. Показов 1681. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот задача:

Даны два массива : А[n] и B[m]. Необходимо создать третий массив, в котором нужно собрать:
-Элементы обоих массивов;
-Общие элементы двух массивов;
-Элементы массива A, которые не включаются в B;
-Элементы массива B, которые не включаются в A;
-Элементы массивов A и B, которые не являются общими для них (то есть объединение результатов двух предыдущих вариантов).

Вот есть код:

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "iostream"
#include <stdlib.h>
#include <vector>
 
using namespace std;
 
void rand(int *p_mass, int *p_size);
void double_mass(int *p_mass1, int *p_mass2, int *p_size);
void shared(int *p_mass1, int *p_mass2, int *p_size);
void nB(int *p_mass1, int *p_mass2, int *p_size);
void nA(int *p_mass1, int *p_mass2, int *p_size);
void vA_B(int *p_mass1, int *p_mass2, int *p_size);
 
int main()
{
    srand(time(NULL));
    int size = 10;
    int *p_mass1 = new int[size];
    int *p_mass2 = new int[size];
    random(p_mass1, &size);
    random(p_mass2, &size);
    //double_mass(p_mass1, p_mass2, &size);
    //shared(p_mass1, p_mass2, &size);
    nB(p_mass1, p_mass2, &size);
    cout << endl;
    nA(p_mass1, p_mass2, &size);
    cout << endl;
    vA_B(p_mass1, p_mass2, &size);
    cout << endl;
 
    return 0;
}
 
void random(int *p_mass, int *p_size){
    for (int i = 0; i < *p_size; ++i)
    {
        p_mass[i] = rand() % 10;
        cout << p_mass[i] << "\t";
    }
    cout << endl;
}
 
void double_mass(int *p_mass1, int *p_mass2, int *p_size){
    vector<int> mass;
 
    for (int i = 0; i < *p_size; ++i)
    {
        mass.push_back(p_mass1[i]);
    }
    for (int i = 0; i < *p_size; ++i)
    {
        mass.push_back(p_mass2[i]);
    }
    for (int i = 0; i < mass.size(); ++i)
        cout << mass[i] << "\t";
    cout << endl;
}
 
void shared(int *p_mass1, int *p_mass2, int *p_size){
    vector<int> mass;
    int temp = 1;
    for (int i = 0; i < *p_size; ++i)
    {
        for (int j = 0; j < *p_size; ++j)
        {
            if (p_mass1[i] == p_mass2[j])
            {
                for (int k = 0; k < mass.size(); ++k)
                {
                    if (p_mass1[i] == mass[k])
                    {
                        temp = 0;
                    }
                }
                if (temp == 1)
                    mass.push_back(p_mass1[i]);
            }
        }
    }
    for (int i = 0; i < mass.size(); ++i)
    {
        cout << mass[i] « "\t";
    }
    cout << endl;
}
 
void nB(int *p_mass1, int *p_mass2, int *p_size){
    vector<int> mass;
    for (int i = 0; i < *p_size; ++i)
    {
        int temp = 1;
        for (int j = 0; j < *p_size; ++j)
        {
            if (p_mass1[i] == p_mass2[j])
            {
                temp = 0;
            }
        }
        if (temp == 1)
            mass.push_back(p_mass1[i]);
    }
    for (int i = 0; i < mass.size(); ++i)
    {
        cout << mass[i] << "\t";
    }
}
 
void nA(int *p_mass1, int *p_mass2, int *p_size){
    vector<int> mass;
    for (int i = 0; i < *p_size; ++i)
    {
        int temp = 1;
        for (int j = 0; j < *p_size; ++j)
        {
            if (p_mass2[i] == p_mass1[j])
            {
                temp = 0;
            }
        }
        if (temp == 1)
            mass.push_back(p_mass2[i]);
    }
    for (int i = 0; i < mass.size(); ++i)
    {
        cout << mass[i] << "\t";
    }
}
 
void vA_B(int *p_mass1, int *p_mass2, int *p_size){
    nB(p_mass1, p_mass2, p_size);
    nA(p_mass1, p_mass2, p_size);
}
Помогите переделать код с векторов на указатели?
И укажите на ошибки если они есть в коде ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2015, 14:40
Ответы с готовыми решениями:

Указатели и массивы. Указатели и функции
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию...

Отсортировать массив и вывести на экран (массивы и указатели на указатели)
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F...

Указатели на функции. Указатели на функции как формальные параметры у функциях высшего уровня
Найти наименьшее значение для функций используя функции и указатели на функции ...

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц)
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник...

9
Модератор
Эксперт С++
13727 / 10923 / 6480
Регистрация: 18.12.2011
Сообщений: 29,156
17.03.2015, 16:26 2
Лучший ответ Сообщение было отмечено a4temer как решение

Решение

Не понятно, зачем Вы вообще сюда запихали вектора
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void double_mass(int *p_mass1, int *p_mass2, int *p_size)
{
    int* mass;
    mass=new int[ (*p_size)*2];
    for (int i = 0; i < *p_size; ++i)
         mass[i]=mass1[i];
    for (int i = 0; i < *p_size; ++i)
        mass[(*p_size)+i]=p_mass2[i];
    for (int i = 0; i < (*p_size)*2; ++i)
        cout << mass[i] << "\t";
    delete[] mass;
    cout << endl;
}
Все остальные функции аналогично.
1
0 / 0 / 2
Регистрация: 15.12.2014
Сообщений: 121
17.03.2015, 17:05  [ТС] 3
zss, чем в моем случае надо заменить выражение из векторов mass.size() я не могу понять.

И посмотрите я в нужном направлении иду. Вот пример следующей функции:
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
void shared(int *p_mass1, int *p_mass2, int *p_size){
    
    int* mass; 
    mass=new int[ (*p_size)*2];
 
    int temp = 1;
 
    for (int i = 0; i < *p_size; ++i)
    {
        for (int j = 0; j < *p_size; ++j)
        {
            if (p_mass1[i] == p_mass2[j])
            {
                for (int k = 0; k < mass.size(); ++k)
                {
                    if (p_mass1[i] == mass[k])
                    {
                        temp = 0;
                    }
                }
                if (temp == 1)
                    mass[i]=mass1[i];
            }
        }
    }
    for (int i = 0; i < mass.size(); ++i)
    {
        cout << mass[i] « "\t";
    }
 
    delete[] mass;
    cout << endl;
}
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.03.2015, 17:10 4
Цитата Сообщение от a4temer Посмотреть сообщение
i < mass.size();
У массивов же нет методов.
Вы лучше добавление в результирующий массив сделайте последовательным по пунктам.
И идея с добавлением в вектор мне не кажется плохой. Мы ведь заранее не знаем количество элементов в третьем массиве. А первые два можно сделать и обычными статическими, если хочется.
0
Модератор
Эксперт С++
13727 / 10923 / 6480
Регистрация: 18.12.2011
Сообщений: 29,156
17.03.2015, 17:14 5
Лучший ответ Сообщение было отмечено a4temer как решение

Решение

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
void shared(int *p_mass1, int *p_mass2, int *p_size){
    
    int* mass; 
    mass=new int[ (*p_size)*2];
 
    int new_size=0;
    for (int i = 0; i < *p_size; ++i)
    {
        bool temp = true;
        for (int j = 0; j < *p_size; ++j)
        {
            if (p_mass1[i] == p_mass2[j])
            {
                for (int k = 0; k < new_size; ++k)
                {
                    if (p_mass1[i] == mass[k])
                       temp = false;
                }
                if (temp)
                    mass[new_size++]=mass1[i];
            }
        }
    }
    for (int i = 0; i <new_size; ++i)
    {
        cout << mass[i] « "\t";
    }
 
    delete[] mass;
    cout << endl;
}
1
0 / 0 / 2
Регистрация: 15.12.2014
Сообщений: 121
17.03.2015, 17:15  [ТС] 6
MrGluck,
Цитата Сообщение от MrGluck Посмотреть сообщение
У массивов же нет методов.
Вы лучше добавление в результирующий массив сделайте последовательным по пунктам.
И идея с добавлением в вектор мне не кажется плохой. Мы ведь заранее не знаем количество элементов в третьем массиве. А первые два можно сделать и обычными статическими, если хочется.
можете привести пример отредактированным кодом?
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.03.2015, 17:56 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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>
 
int main()
{
    const size_t N = 10, M = 15;
    std::vector<int> A(N), B(M), C;
 
    auto print_v = [](const std::vector<int> &v) // вывод на экран
    {
        std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, " "));
        std::cout << std::endl << std::endl;
    };
 
    // заполяем СЧ
    std::mt19937 gen{ std::random_device()() };
    std::uniform_int_distribution<> dist(10, 29);
    std::generate(A.begin(), A.end(), [&gen, &dist] { return dist(gen); });
    std::generate(B.begin(), B.end(), [&gen, &dist] { return dist(gen); });
 
    // выводим заполненные массивы
    std::cout << "A:\n";
    print_v(A);
    std::cout << "B:\n";
    print_v(B);
 
    // копируем элементы обоих массивов
    std::copy(A.cbegin(), A.cend(), std::back_inserter(C));
    std::copy(B.cbegin(), B.cend(), std::back_inserter(C));
    std::cout << "After copy of both arrays:\n";
    print_v(C);
 
    // сортируем для облегчения дальнейшей работы
    std::sort(A.begin(), A.end());
    std::sort(B.begin(), B.end());
 
    // копируем общие элементы двух массивов
    //C.clear();
    std::set_intersection(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
    std::cout << "After copy of intersection of arrays:\n";
    print_v(C);
 
    // копируем элементы массива A, которые не включаются в B
    //C.clear();
    std::set_difference(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
    std::cout << "After copy of elements that are present in the A, but not in the B:\n";
    print_v(C);
 
    // копируем элементы массива B, которые не включаются в A
    //C.clear();
    std::set_difference(B.cbegin(), B.cend(), A.cbegin(), A.cend(), std::back_inserter(C));
    std::cout << "After copy of elements that are present in the B, but not in the A:\n";
    print_v(C);
 
    // копируем элементы массивов A и B, которые не являются общими для них
    //C.clear();
    std::set_symmetric_difference(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
    std::cout << "After copy of elements that are present in one array, but not in another:\n";
    print_v(C);
}
Для ознакомления:
http://www.cplusplus.com/refer... ersection/ пересечение
http://www.cplusplus.com/refer... ifference/ разность
http://www.cplusplus.com/refer... ersection/ симметричная разность

Добавлено через 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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>
 
int main()
{
    std::vector<int> A(10), B(15), C;
    std::mt19937 gen{ std::random_device()() };
    std::uniform_int_distribution<> dist(10, 29);
    std::generate(A.begin(), A.end(), [&gen, &dist] { return dist(gen); });
    std::generate(B.begin(), B.end(), [&gen, &dist] { return dist(gen); });
    std::copy(A.cbegin(), A.cend(), std::back_inserter(C));
    std::copy(B.cbegin(), B.cend(), std::back_inserter(C));
    std::sort(A.begin(), A.end());
    std::sort(B.begin(), B.end());
    std::set_intersection(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
    std::set_difference(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
    std::set_difference(B.cbegin(), B.cend(), A.cbegin(), A.cend(), std::back_inserter(C));
    std::set_symmetric_difference(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
    std::copy(C.cbegin(), C.cend(), std::ostream_iterator<int>(std::cout, " "));
}
0
0 / 0 / 2
Регистрация: 15.12.2014
Сообщений: 121
17.03.2015, 19:29  [ТС] 8
zss, чем можно заменить mass.push_back?

Все не надо решил проблему, вспомнил что уже было.
0
Модератор
Эксперт С++
13727 / 10923 / 6480
Регистрация: 18.12.2011
Сообщений: 29,156
17.03.2015, 19:39 9
Цитата Сообщение от zss Посмотреть сообщение
mass[new_size++]=mass1[i];
А это что по вашему?
0
0 / 0 / 2
Регистрация: 15.12.2014
Сообщений: 121
17.03.2015, 20:31  [ТС] 10
zss,
Цитата Сообщение от zss Посмотреть сообщение
А это что по вашему?
Говорю ж забыл. Не внимательно посмотрел.

Добавлено через 2 минуты
MrGluck,
Цитата Сообщение от MrGluck Посмотреть сообщение
#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>
int main()
{
* * const size_t N = 10, M = 15;
* * std::vector<int> A(N), B(M), C;
auto print_v = [](const std::vector<int> &v) // вывод на экран
* * {
* * * * std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, " "));
* * * * std::cout << std::endl << std::endl;
* * };
// заполяем СЧ
* * std::mt19937 gen{ std::random_device()() };
* * std::uniform_int_distribution<> dist(10, 29);
* * std::generate(A.begin(), A.end(), [&gen, &dist] { return dist(gen); });
* * std::generate(B.begin(), B.end(), [&gen, &dist] { return dist(gen); });
// выводим заполненные массивы
* * std::cout << "A:\n";
* * print_v(A);
* * std::cout << "B:\n";
* * print_v(B);
// копируем элементы обоих массивов
* * std::copy(A.cbegin(), A.cend(), std::back_inserter(C));
* * std::copy(B.cbegin(), B.cend(), std::back_inserter(C));
* * std::cout << "After copy of both arrays:\n";
* * print_v(C);
// сортируем для облегчения дальнейшей работы
* * std::sort(A.begin(), A.end());
* * std::sort(B.begin(), B.end());
// копируем общие элементы двух массивов
* * //C.clear();
* * std::set_intersection(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
* * std::cout << "After copy of intersection of arrays:\n";
* * print_v(C);
// копируем элементы массива A, которые не включаются в B
* * //C.clear();
* * std::set_difference(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
* * std::cout << "After copy of elements that are present in the A, but not in the B:\n";
* * print_v(C);
// копируем элементы массива B, которые не включаются в A
* * //C.clear();
* * std::set_difference(B.cbegin(), B.cend(), A.cbegin(), A.cend(), std::back_inserter(C));
* * std::cout << "After copy of elements that are present in the B, but not in the A:\n";
* * print_v(C);
// копируем элементы массивов A и B, которые не являются общими для них
* * //C.clear();
* * std::set_symmetric_difference(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
* * std::cout << "After copy of elements that are present in one array, but not in another:\n";
* * print_v(C);
}
Цитата Сообщение от MrGluck Посмотреть сообщение
#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>
int main()
{
* * std::vector<int> A(10), B(15), C;
* * std::mt19937 gen{ std::random_device()() };
* * std::uniform_int_distribution<> dist(10, 29);
* * std::generate(A.begin(), A.end(), [&gen, &dist] { return dist(gen); });
* * std::generate(B.begin(), B.end(), [&gen, &dist] { return dist(gen); });
* * std::copy(A.cbegin(), A.cend(), std::back_inserter(C));
* * std::copy(B.cbegin(), B.cend(), std::back_inserter(C));
* * std::sort(A.begin(), A.end());
* * std::sort(B.begin(), B.end());
* * std::set_intersection(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
* * std::set_difference(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
* * std::set_difference(B.cbegin(), B.cend(), A.cbegin(), A.cend(), std::back_inserter(C));
* * std::set_symmetric_difference(A.cbegin(), A.cend(), B.cbegin(), B.cend(), std::back_inserter(C));
* * std::copy(C.cbegin(), C.cend(), std::ostream_iterator<int>(std::cout, " "));
}
Было ж сказано:
Цитата Сообщение от a4temer Посмотреть сообщение
Надо переделать код с векторов на указатели.
0
17.03.2015, 20:31
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2015, 20:31
Помогаю со студенческими работами здесь

C++. Массивы и указатели/ Функции.
Помогите, пожалуйста, решить!!! Я знаю, что это просто. Но я только начинаю изучать C. И до меня...

с++: массивы, указатели и функции
Приветствую вас программисты, на вас одна надежда.. Не могу разобраться, как изменить.. делаю в...

указатели.функции.массивы.
помогите решить в с++ Array75. Дан массив размера N. Переставить в обратном порядке элементы...

Указатели: функции, двумерные массивы
мне нужно вернуть из функции getArray двумерный построенный массив в функцию main, для передачи...


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

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

Новые блоги и статьи
NoSQL базы данных: что это такое и какие существуют
bytestream 22.01.2025
В современную эпоху цифровой трансформации объемы данных растут экспоненциально, создавая новые вызовы для традиционных систем управления базами данных. NoSQL (Not Only SQL) представляет собой. . .
Обновление исследования от команды MCM (январь 2025 г.)
Programma_Boinc 22.01.2025
Обновление исследования от команды MCM (январь 2025 г. ) Мы продолжаем изучать молекулярные сигнатуры, связанные с раком легких, с текущим фокусом на GCM1, факторе транскрипции, участвующем в. . .
Как работать с Kafka в Go (Golang)
bytestream 22.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки событий и интеграции микросервисов. Эта система, изначально. . .
Как использовать RabbitMQ в Go (Golang)
bytestream 22.01.2025
RabbitMQ представляет собой надежный и широко используемый брокер сообщений, который играет ключевую роль в построении современных распределенных систем и микросервисной архитектуры. В основе работы. . .
Как преобразовать список списков в простой список в Python
bytestream 22.01.2025
При работе с Python разработчики часто сталкиваются с необходимостью обработки сложных структур данных, среди которых особое место занимают вложенные списки. Эти структуры представляют собой списки,. . .
Что такое GUID / UUID и как их создать
bytestream 22.01.2025
В мире разработки программного обеспечения существует постоянная потребность в уникальной идентификации объектов, записей и ресурсов. Эта задача становится особенно актуальной в распределенных. . .
Как добавить пустую директорию в репозиторий Git
bytestream 22.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с ситуацией, когда необходимо сохранить пустую директорию в репозитории. Данная задача может показаться простой на первый. . .
Как валидировать адрес email в JavaScript
bytestream 22.01.2025
JavaScript, как основной язык веб-разработки, предоставляет разработчикам множество инструментов для реализации эффективной валидации email-адресов. От простых встроенных решений до сложных. . .
Как заменить все вхождения подстроки в JavaScript
bytestream 22.01.2025
Строки в JavaScript представляют собой неизменяемые последовательности символов, что делает их обработку особенно интересной с точки зрения оптимизации и выбора правильного подхода к решению задач. . . .
Управление версиями пакетов в Node.js. В чем разница между тильдой (~) и кареткой (^) в package.json
bytestream 22.01.2025
В современной разработке программного обеспечения управление версиями пакетов играет ключевую роль в обеспечении стабильности и надежности проектов. Node. js, как одна из самых популярных платформ для. . .
Аутентификация на сайте с помощью формы
bytestream 21.01.2025
В современном цифровом мире безопасная аутентификация становится краеугольным камнем защиты веб-приложений и пользовательских данных. Каждый день миллионы людей используют различные онлайн-сервисы,. . .
Как получить индекс в цикле for в Python
bytestream 21.01.2025
При работе с коллекциями данных в Python часто возникает необходимость не только получить доступ к элементам последовательности, но и знать их позицию в процессе итерации. Индексация в циклах. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru