Форум программистов, компьютерный форум CyberForum.ru

Вывести массив D, состоящий из тех элементов В, которых нет в С - C++

Восстановить пароль Регистрация
 
_д_м_и_т_р_и_й_
 Аватар для _д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
11.08.2011, 21:23     Вывести массив D, состоящий из тех элементов В, которых нет в С #1
даны три одномерных массива (А,В,С). нужно вывести массив D, состоящий из тех элементов В, которых нет в С, и тех элементов С, которых нет в А. В дискретной математике это выглядит так: D=(B-C)+(C-A)
где + это знак объединения.
Умоляю, очень нужна программа. Заранее всем спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2011, 21:23     Вывести массив D, состоящий из тех элементов В, которых нет в С
Посмотрите здесь:

C++ Работа с одномерным массивом. Вывести индексы тех элементов, значение которых больше 5
Массив: вывести индексы тех элементов, для которых исполняется условие C[i][j]= C[j][i] C++
C++ Заданы два массива. Сравнить соответствующие элементы массивов и вывести на экран массив, состоящий из совпавших элементов.
Задача на массивы (найти и вывести на экран те элементы массив В , которых нет в массиве А) C++
C++ Подсчитать сумму элементов в тех строках матрицы, где нет отрицательных элементов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
11.08.2011, 21:52     Вывести массив D, состоящий из тех элементов В, которых нет в С #2
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
даны три одномерных массива (А,В,С). нужно вывести массив D, состоящий из тех элементов В, которых нет в С, и тех элементов С, которых нет в А. В дискретной математике это выглядит так: D=(B-C)+(C-A)
где + это знак объединения.
Умоляю, очень нужна программа. Заранее всем спасибо.
Если вы знаете стандартные алгоритмы, то это делается в одну строчку. Главное - чтобы результирующий массив D имел достаточную размерность, для хранения результирующих элементов.

Но сначала вам нужно отсортировать массивы.

C++
1
2
3
std::sort( A, A + k );
std::sort( B, B + l );
std::sort( C, C + m );
Здесь r, l, m - это обозначение размерности соответствующих массиивов.

Далее пишите одну строчку

C++
1
std::set_difference( C, C + m, A, A + k, std::set_difference( B, B + l, C, C + m, D ) );
-=ЮрА=-
Заблокирован
Автор FAQ
11.08.2011, 21:53     Вывести массив D, состоящий из тех элементов В, которых нет в С #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
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
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
int get_rand_num(int max);
void show_mass(int m, int * mass);
bool valEmass(int m, int * mass, int val);
 
int main()
{
    srand(0);
    cout<<"Enter numelements in vectors m = ";
    int m;cin>>m;
    int * A = new int[m];
    int * B = new int[m];
    int * C = new int[m];
    int * D = new int[2*m];
    for(int i = 0; i < m; i++)
    {
        A[i] = get_rand_num(100);
        B[i] = get_rand_num(100);
        C[i] = get_rand_num(100);
    }
    cout<<"\tInput vectors\r\n";
    cout<<"Vector A:\r\n";
    show_mass(m, A);
    cout<<"Vector B:\r\n";
    show_mass(m, B);
    cout<<"Vector C:\r\n";
    show_mass(m, C);
    int k = 0;
    for(i = 0; i < m; i++)
    {
        if(!valEmass(m, B, A[i]))
        {
            D[k] = A[i];
            k++;
        }
    }
    for(i = 0; i < m; i++)
    {
        if(!valEmass(k + 1, B, C[i]))
        {
            D[k] = C[i];
            k++;
        }
    }
    cout<<"Vector D:\r\n";
    show_mass(k, D);
    cout<<"Press any key to continue\r\n";
    char ch;cin>>ch;
    return 0;
}
 
int get_rand_num(int max)
{
    int ret = rand();
    while(max < ret)
        ret = rand();
    return ret;
}
 
void show_mass(int m, int * mass)
{
    for(int i = 0; i < m; i++)
        cout<<mass[i]<<" ";
    cout<<"\r\n";
}
 
bool valEmass(int m, int * mass, int val)
{
    bool ret = false;
    for(int i = 0; i < m; i++)
    {
        if(mass[i] == val)
            break;
    }
    if(i < m)
        ret = true;
    return ret;
}
Миниатюры
Вывести массив D, состоящий из тех элементов В, которых нет в С  
-=ЮрА=-
Заблокирован
Автор FAQ
11.08.2011, 22:50     Вывести массив D, состоящий из тех элементов В, которых нет в С #4
Цитата Сообщение от Сыроежка Посмотреть сообщение
В вашем коде еще надо разбираться, что он делает, так как ваш код оригинальный, а мой код всем понятен, кто знаком с С++.
- Сортировки удлиняют выполнение кода, я понял что ты делал, причём тут кто знаком с С++)

Вот код сам алгоритм уместился в 2 функции( у тебя их 4!), остальное лишь организация интерфейса и инициализация
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
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
int get_rand_num(int max);
void show_mass(int m, int * mass);
bool valEmass(int m, int * mass, int val);
void vecUnion(int m, int * vec1, int * vec2, int &k, int * out);
 
int main()
{
    srand(0);
    cout<<"Enter numelements in vectors m = ";
    int m;cin>>m;
    int * A = new int[m];
    int * B = new int[m];
    int * C = new int[m];
    int * D = new int[2*m];
    for(int i = 0; i < m; i++)
    {
        A[i] = get_rand_num(100);
        B[i] = get_rand_num(100);
        C[i] = get_rand_num(100);
    }
    cout<<"\tInput vectors\r\n";
    cout<<"Vector A:\r\n";
    show_mass(m, A);
    cout<<"Vector B:\r\n";
    show_mass(m, B);
    cout<<"Vector C:\r\n";
    show_mass(m, C);
    int k = 0;
    vecUnion(m, A, B, k, D);
    vecUnion(m, C, B, k, D);
    cout<<"Vector D:\r\n";
    show_mass(k, D);
    cout<<"Press any key to continue\r\n";
    char ch;cin>>ch;
    return 0;
}
 
int get_rand_num(int max)
{
    int ret = rand();
    while(max < ret)
        ret = rand();
    return ret;
}
 
void show_mass(int m, int * mass)
{
    for(int i = 0; i < m; i++)
        cout<<mass[i]<<" ";
    cout<<"\r\n";
}
 
bool valEmass(int m, int * mass, int val)
{
    bool ret = false;
    for(int i = 0; i < m; i++)
    {
        if(mass[i] == val)
            break;
    }
    if(i < m)
        ret = true;
    return ret;
}
 
void vecUnion(int m, int * vec1, int * vec2, int &k, int * out)
{
    for(int i = 0; i < m; i++)
    {
        if(!valEmass(m, vec2, vec1[i]))
        {
            out[k] = vec1[i];
            k++;
        }
    }
}
Миниатюры
Вывести массив D, состоящий из тех элементов В, которых нет в С  
Сыроежка
Заблокирован
11.08.2011, 23:49     Вывести массив D, состоящий из тех элементов В, которых нет в С #5
Это не важно, сколько места занимает ваш код. Проблема в другом. Никто не знает, что делает ваш код. То есть каждому придется разбираться в вашем коде, что отнимает время у программистов. Причем интерфейс вашего кода, честно говоря, ужасный. То есть если уж писать собственный код, то хотя бы интерфейс функций, то есть их прототипы, делать схожими со стандартными алгоритмами. Например, я смотрю прототип следующей функции

C++
1
void vecUnion(int m, int * vec1, int * vec2, int &k, int * out);
и мне ничего не ясно. Например, что эта за переменная k, которая передается по ссылке? И зачем она вообще нужна? То есть ваш код не профессиональный. Так сказать, код на уровне студента.

Я лишь с вами в одном согласен, что тут и требуется такой "студенческий" код, так как скорей всего авторы вопросов в этом разделе не знакомы с С++, чтобы использовать алгоритмы. Тем не менее всегда имеет смысл показать, как задачу следует делать, если вы обладаете достаточными знаниями С++.

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

Добавлено через 40 минут
В чем состоит прелесть использования стандартных алгоритмов - это то, что если вам нужно вывести результат на экран, то вам не нужен даже массив D, и в исходном коде вы меняете всего лишь одну переменную! То есть вместо

C++
1
2
std::set_difference( C, C + m, A, A + k,
                    std::set_difference( B, B + l, C, C + m, D ) );
вы можете записать

C++
1
2
3
std::set_difference( C, C + m, A, A + k,
                    std::set_difference( B, B + l, C, C + m,
                    std::ostream_iterator<int>( std::cout, "; " ) ) );
и у вас все готово! Я всего лишь поменял последний аргумент в выражении, а какой эффект!
Yandex
Объявления
11.08.2011, 23:49     Вывести массив D, состоящий из тех элементов В, которых нет в С
Ответ Создать тему
Опции темы

Текущее время: 16:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru